From 2146a5c3f54846980f77dc107ce18e8afb288ff4 Mon Sep 17 00:00:00 2001 From: CNLohr Date: Wed, 5 Aug 2020 04:41:18 -0400 Subject: [PATCH] Make STM32F303x6/x8 vs xB/xC --- embeddedstm32f303/Makefile | 10 ++- embeddedstm32f303/adc.c | 46 ++++++++---- embeddedstm32f303/ccconfig.h | 7 ++ embeddedstm32f303/lib/stm32f303.ld | 8 +- embeddedstm32f303/lib/system_stm32f30x.c | 9 ++- embeddedstm32f303/main.c | 28 ++++++- embeddedstm32f303/spi2812.c | 95 ++++++++++++++++++++++++ 7 files changed, 179 insertions(+), 24 deletions(-) diff --git a/embeddedstm32f303/Makefile b/embeddedstm32f303/Makefile index c471765..461f890 100644 --- a/embeddedstm32f303/Makefile +++ b/embeddedstm32f303/Makefile @@ -14,7 +14,7 @@ OBJCOPYFLAGS = -O binary BIN=$(CP) -O ihex -DEFS = -DSTM32F30X -DHSE_VALUE=25000000 +DEFS = -DSTM32F30X STARTUP = lib/startup_stm32f30x.s MCU = cortex-m4 @@ -29,8 +29,14 @@ CFLAGS = $(MCFLAGS) $(OPTIMIZE) $(DEFS) \ $(STM32_INCLUDES) \ -I../embeddedcommon \ -Wl,-T,lib/stm32f303.ld + CFLAGS+=-DDEBUG -CFLAGS+=-I. + +#If you use a TQFP STM32F303. +CFLAGS+=-I. -DTQFP32 -DHSE_VALUE=8000000 + +#From the nucleos(sp?) +#CFLAGS+=-I. -DHSE_VALUE=25000000 AFLAGS = $(MCFLAGS) diff --git a/embeddedstm32f303/adc.c b/embeddedstm32f303/adc.c index bca4ec5..b4f6f26 100644 --- a/embeddedstm32f303/adc.c +++ b/embeddedstm32f303/adc.c @@ -11,6 +11,24 @@ static int calibration_value; extern RCC_ClocksTypeDef RCC_Clocks; +#ifdef TQFP32 +#define GPIOADCPORT GPIOA +#define GPIOADCNUM GPIO_Pin_0 +#define ADCPLLCLK RCC_ADC12PLLCLK_Div2 +#define ADCPERIPHEN RCC_AHBPeriph_ADC12 +#define ADCPORTAHB RCC_AHBPeriph_GPIOA +#define ADCNUM ADC1 +#define ADCCHAN ADC_Channel_1 +#else +#define GPIOADCPORT GPIOB +#define GPIOADCNUM GPIO_Pin_12 +#define ADCPLLCLK RCC_ADC34PLLCLK_Div2 +#define ADCPERIPHEN RCC_AHBPeriph_ADC34 +#define ADCPORTAHB RCC_AHBPeriph_GPIOB +#define ADCNUM ADC4 +#define ADCCHAN ADC_Channel_3 +#endif + void InitADC() { ADC_InitTypeDef ADC_InitStructure; @@ -19,25 +37,25 @@ void InitADC() TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /* Configure the ADC clock */ - RCC_ADCCLKConfig( RCC_ADC34PLLCLK_Div2 ); + RCC_ADCCLKConfig( ADCPLLCLK ); /* Enable ADC1 clock */ - RCC_AHBPeriphClockCmd( RCC_AHBPeriph_ADC34, ENABLE ); + RCC_AHBPeriphClockCmd( ADCPERIPHEN, ENABLE ); /* ADC Channel configuration */ /* GPIOC Periph clock enable */ - RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOB, ENABLE ); + RCC_AHBPeriphClockCmd( ADCPORTAHB, ENABLE ); /* Configure ADC Channel7 as analog input */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; + GPIO_InitStructure.GPIO_Pin = GPIOADCNUM; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; - GPIO_Init( GPIOB, &GPIO_InitStructure ); + GPIO_Init( GPIOADCPORT, &GPIO_InitStructure ); ADC_StructInit( &ADC_InitStructure ); /* Calibration procedure */ - ADC_VoltageRegulatorCmd( ADC4, ENABLE ); + ADC_VoltageRegulatorCmd( ADCNUM, ENABLE ); /* Insert delay equal to 10 µs */ _delay_us( 10 ); @@ -47,7 +65,7 @@ void InitADC() ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; ADC_CommonInitStructure.ADC_DMAMode = ADC_DMAMode_OneShot; ADC_CommonInitStructure.ADC_TwoSamplingDelay = 0; - ADC_CommonInit( ADC4, &ADC_CommonInitStructure ); + ADC_CommonInit( ADCNUM, &ADC_CommonInitStructure ); ADC_InitStructure.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Enable; ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; @@ -57,16 +75,16 @@ void InitADC() ADC_InitStructure.ADC_OverrunMode = ADC_OverrunMode_Disable; ADC_InitStructure.ADC_AutoInjMode = ADC_AutoInjec_Disable; ADC_InitStructure.ADC_NbrOfRegChannel = 1; - ADC_Init( ADC4, &ADC_InitStructure ); + ADC_Init( ADCNUM, &ADC_InitStructure ); /* ADC4 regular channel3 configuration */ - ADC_RegularChannelConfig( ADC4, ADC_Channel_3, 1, ADC_SampleTime_181Cycles5 ); + ADC_RegularChannelConfig( ADCNUM, ADCCHAN, 1, ADC_SampleTime_181Cycles5 ); /* Enable ADC4 */ - ADC_Cmd( ADC4, ENABLE ); + ADC_Cmd( ADCNUM, ENABLE ); /* wait for ADRDY */ - while( !ADC_GetFlagStatus( ADC4, ADC_FLAG_RDY ) ); + while( !ADC_GetFlagStatus( ADCNUM, ADC_FLAG_RDY ) ); NVIC_InitTypeDef NVIC_InitStructure; @@ -92,7 +110,7 @@ void InitADC() TIM_Cmd (TIM2, ENABLE); /* Start ADC4 Software Conversion */ - ADC_StartConversion( ADC4 ); + ADC_StartConversion( ADCNUM ); } @@ -104,8 +122,8 @@ void TIM2_IRQHandler (void) if (TIM_GetITStatus (TIM2, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit (TIM2, TIM_IT_Update); - int16_t value = ADC_GetConversionValue(ADC4); - ADC_StartConversion( ADC4 ); + int16_t value = ADC_GetConversionValue(ADCNUM); + ADC_StartConversion( ADCNUM ); oversampout += value; oversamp++; diff --git a/embeddedstm32f303/ccconfig.h b/embeddedstm32f303/ccconfig.h index 384459d..ae93cd4 100644 --- a/embeddedstm32f303/ccconfig.h +++ b/embeddedstm32f303/ccconfig.h @@ -2,9 +2,16 @@ #define _CCCONFIG_H #define CCEMBEDDED + +#ifdef TQFP32 +#define NUM_LIN_LEDS 20 +#define USE_NUM_LIN_LEDS 20 +#define DFREQ 12500 //XXX Incorrect. +#else #define NUM_LIN_LEDS 24 #define USE_NUM_LIN_LEDS 24 #define DFREQ 12500 +#endif #endif diff --git a/embeddedstm32f303/lib/stm32f303.ld b/embeddedstm32f303/lib/stm32f303.ld index 959adab..215432b 100644 --- a/embeddedstm32f303/lib/stm32f303.ld +++ b/embeddedstm32f303/lib/stm32f303.ld @@ -3,7 +3,7 @@ ENTRY( Reset_Handler ) /* Highest address of the user mode stack .*/ -_estack = 0x2000a000; /* end of 40K RAM */ +_estack = 0x20003000; /* end of 40K RAM */ /* Generate a link error if heap and s tack dont fit int o RAM */ @@ -12,9 +12,9 @@ _Min_Stack_Size = 0x200; /* required amount of stack .*/ MEMORY { - FLASH ( rx ) : ORIGIN = 0x08000000 , LENGTH = 256K - RAM ( xrw) : ORIGIN = 0x20000000 , LENGTH = 40K - CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 8K + FLASH ( rx ) : ORIGIN = 0x08000000 , LENGTH = 32K + RAM ( xrw) : ORIGIN = 0x20000000 , LENGTH = 12K + CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 4K } SECTIONS diff --git a/embeddedstm32f303/lib/system_stm32f30x.c b/embeddedstm32f303/lib/system_stm32f30x.c index 156160d..4000e1f 100644 --- a/embeddedstm32f303/lib/system_stm32f30x.c +++ b/embeddedstm32f303/lib/system_stm32f30x.c @@ -341,8 +341,15 @@ static void SetSysClock(void) /* PLL configuration */ RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); -// RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL9); + + + //If we're using an 8 MHz crystal. +#ifdef TQFP32 +// RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL9); // 8 * 9 = 72 MHz + RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL8); //8 * 8 = 64 MHz +#else RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL2); //25MHz*2 = 50 MHz +#endif /* Enable PLL */ RCC->CR |= RCC_CR_PLLON; diff --git a/embeddedstm32f303/main.c b/embeddedstm32f303/main.c index db8156a..c13f986 100644 --- a/embeddedstm32f303/main.c +++ b/embeddedstm32f303/main.c @@ -25,7 +25,11 @@ volatile int samples; void ADCCallback( uint16_t adcval ) { +#ifdef TQFP32 + sampbuff[last_samp_pos] = adcval*2.0; +#else sampbuff[last_samp_pos] = adcval; +#endif last_samp_pos = ((last_samp_pos+1)%CIRCBUFSIZE); samples++; } @@ -47,14 +51,18 @@ int main(void) { uint32_t i = 0; + send_text( "TEST1\n" ); + RCC_GetClocksFreq( &RCC_Clocks ); - ConfigureLED(); LED_OFF; GPIO_InitTypeDef GPIO_InitStructure; //Turn B10 (TX) on, so we can have something positive to bias the ADC with. +#ifndef TQFP32 + ConfigureLED(); LED_OFF; ConfigureGPIO( GetGPIOFromString( "PB10" ), INOUT_OUT | DEFAULT_ON ); +#endif /* SysTick end of count event each 10ms */ SysTick_Config( RCC_Clocks.HCLK_Frequency/100 ); /// 100); @@ -63,23 +71,30 @@ int main(void) InitSPI2812(); InitADC(); - Init(); //Colorchord + InitColorChord(); //Colorchord // printf( "Operating at %.3fMHz\n", fv ); + +#ifndef TQFP32 freepin = GetGPIOFromString( "PB11" ); ConfigureGPIO( freepin, INOUT_OUT | DEFAULT_ON ); +#endif int this_samp = 0; int wf = 0; +#ifndef TQFP32 LED_ON; +#endif while(1) { if( this_samp != last_samp_pos ) { +#ifndef TQFP32 GPIOOn( freepin ); +#endif PushSample32( sampbuff[this_samp] ); //Can't put in full volume. this_samp = (this_samp+1)%CIRCBUFSIZE; @@ -87,18 +102,25 @@ int main(void) wf++; if( wf == 128 ) { + //uint8_t rdat[20] = { 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }; + //static int countup; + //rdat[5] = sampbuff[last_samp_pos] ;//countup++; + //SendSPI2812( rdat, 4 ); NewFrame(); wf = 0; } - +#ifndef TQFP32 GPIOOff( freepin ); +#endif } } } void TimingDelay_Decrement() { +#ifndef TQFP32 LED_TOGGLE; +#endif } diff --git a/embeddedstm32f303/spi2812.c b/embeddedstm32f303/spi2812.c index 32ce0dd..4a1d70e 100644 --- a/embeddedstm32f303/spi2812.c +++ b/embeddedstm32f303/spi2812.c @@ -30,6 +30,30 @@ uint8_t MyBuffer[SPI2812_BUFFSIZE+ZERO_BUFFER]; //Currently, the 30X version does not have configurable ports. +#ifdef TQFP32 + + + +#define SPI_PORT SPI1 +#define SPI_PORT_CLOCK RCC_APB2Periph_SPI1 +#define SPI_PORT_CLOCK_INIT RCC_APB2PeriphClockCmd +#define SPI_MOSI_PIN GPIO_Pin_7 +#define SPI_MOSI_GPIO_PORT GPIOA +#define SPI_MOSI_GPIO_CLK RCC_AHBPeriph_GPIOA +#define SPI_MOSI_SOURCE GPIO_PinSource7 +#define SPI_MOSI_AF GPIO_AF_5 +#define SPI_PORT_DR_ADDRESS SPI_PORT->DR +#define SPI_PORT_DMA DMA1 +#define SPI_PORT_DMAx_CLK RCC_AHBPeriph_DMA1 +#define SPI_PORT_TX_DMA_CHANNEL DMA1_Channel3 +#define SPI_PORT_DMA_TX_IRQn DMA1_Channel3_IRQn + +#define DMA_HANDLER_IRQFN DMA1_Channel3_IRQHandler +#define DMA_FLAG_C DMA1_FLAG_TC3 //XXX May be wrong. +#define DMA_FLAG_E DMA1_FLAG_TE3 //XXX May be wrong + +#else + #define SPI_PORT SPI2 #define SPI_PORT_CLOCK RCC_APB1Periph_SPI2 #define SPI_PORT_CLOCK_INIT RCC_APB1PeriphClockCmd @@ -58,6 +82,8 @@ uint8_t MyBuffer[SPI2812_BUFFSIZE+ZERO_BUFFER]; #define SPI_PORT_DMA_TX_IRQHandler DMA1_Stream4_IRQHandler */ +#endif + #elif defined( STM32F40_41xxx ) #include @@ -135,6 +161,73 @@ void InitSPI2812() #ifdef STM32F30X +#ifdef TQFP32 + + //On SPI1, PORT A.7 + + RCC_AHBPeriphClockCmd(SPI_MOSI_GPIO_CLK, ENABLE); + RCC_AHBPeriphClockCmd(SPI_PORT_DMAx_CLK, ENABLE); + SPI_PORT_CLOCK_INIT(SPI_PORT_CLOCK, ENABLE); + SPI_I2S_DeInit(SPI_PORT); + + /* Configure the GPIO_LED pin */ + GPIO_InitStructure.GPIO_Pin = SPI_MOSI_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; + GPIO_Init(SPI_MOSI_GPIO_PORT, &GPIO_InitStructure); + + GPIO_PinAFConfig(SPI_MOSI_GPIO_PORT, SPI_MOSI_SOURCE, SPI_MOSI_AF); //MOSI //GPIO_AF_5??? GPIO_AF_6??? TODO + + /* SPI Config */ + SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx; + SPI_InitStructure.SPI_Mode = SPI_Mode_Master; + SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; + SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; + SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; + SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; + SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; + SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; + SPI_InitStructure.SPI_CRCPolynomial = 7; //TODO: Remove this??? + + SPI_CalculateCRC(SPI_PORT, DISABLE); + SPI_Init(SPI_PORT, &SPI_InitStructure); + RCC_I2SCLKConfig( RCC_I2S2CLKSource_SYSCLK); + SPI_Cmd(SPI_PORT, ENABLE); + + //We're on DMA1, channel 5. + + memset( MyBuffer, 0xAA, 128 ); + + DMA_DeInit(SPI_PORT_TX_DMA_CHANNEL); + DMA_StructInit(&dma_init_struct); + dma_init_struct.DMA_PeripheralBaseAddr = (uint32_t) &SPI_PORT->DR; + dma_init_struct.DMA_MemoryBaseAddr = (uint32_t)MyBuffer; //REmove this? somehow? + dma_init_struct.DMA_DIR = DMA_DIR_PeripheralDST; + dma_init_struct.DMA_BufferSize = 128; + dma_init_struct.DMA_PeripheralInc = DMA_PeripheralInc_Disable; + dma_init_struct.DMA_MemoryInc = DMA_MemoryInc_Enable; + dma_init_struct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; + dma_init_struct.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte; + dma_init_struct.DMA_Mode = DMA_Mode_Normal; + dma_init_struct.DMA_Priority = DMA_Priority_VeryHigh; + dma_init_struct.DMA_M2M = DMA_M2M_Disable; + DMA_Init(SPI_PORT_TX_DMA_CHANNEL, &dma_init_struct); + + /* Configure the Priority Group */ + NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); + + /* Initialize NVIC Struct for DMA */ + nvic_init_struct.NVIC_IRQChannel = SPI_PORT_DMA_TX_IRQn; + nvic_init_struct.NVIC_IRQChannelPreemptionPriority = 1; + nvic_init_struct.NVIC_IRQChannelSubPriority = 0; + nvic_init_struct.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&nvic_init_struct); + + SPI_I2S_DMACmd(SPI_PORT, SPI_I2S_DMAReq_Tx, ENABLE); + +#else + //On SPI2, PORT B.15 RCC_AHBPeriphClockCmd(SPI_MOSI_GPIO_CLK, ENABLE); @@ -198,6 +291,8 @@ void InitSPI2812() SPI_I2S_DMACmd(SPI_PORT, SPI_I2S_DMAReq_Tx, ENABLE); +#endif + #elif defined( STM32F40_41xxx ) // enable the SPI peripheral clock