diff --git a/doc/eclipse_debugger_launch/ParaMETEO-STM32L476RG.launch b/doc/eclipse_debugger_launch/ParaMETEO-STM32L476RG.launch index 20ca621..4d44981 100644 --- a/doc/eclipse_debugger_launch/ParaMETEO-STM32L476RG.launch +++ b/doc/eclipse_debugger_launch/ParaMETEO-STM32L476RG.launch @@ -1,6 +1,6 @@ - + diff --git a/include/main.h b/include/main.h index d30c67b..315585e 100644 --- a/include/main.h +++ b/include/main.h @@ -6,7 +6,7 @@ #include "config_data.h" #define SW_VER "EA00" -#define SW_DATE "15092021" +#define SW_DATE "21092021" #define SYSTICK_TICKS_PER_SECONDS 100 #define SYSTICK_TICKS_PERIOD 10 diff --git a/src/TimerConfig.c b/src/TimerConfig.c index 6203396..245b4c9 100644 --- a/src/TimerConfig.c +++ b/src/TimerConfig.c @@ -38,6 +38,7 @@ void TimerConfig(void) { TIM2->DIER |= 1; NVIC_EnableIRQ( TIM2_IRQn ); +#ifdef STM32F10X_MD_VL // ////////////////////////////// // //// konfiguracja TIM4 -- dac /// // ////////////////////////////// @@ -49,6 +50,19 @@ void TimerConfig(void) { // TIM4->CR1 |= TIM_CR1_CEN; /* timer powinien byc uruchamiany tylko przy wysylaniu danych */ TIM4->DIER |= 1; NVIC_EnableIRQ( TIM4_IRQn ); +#else + // ////////////////////////////// + // //// konfiguracja TIM4 -- dac /// + // ////////////////////////////// + //NVIC_SetPriority(TIM4_IRQn, 2); + TIM5->PSC = 0; + TIM5->ARR = 2499; + TIM5->CR1 |= TIM_CR1_DIR; + TIM5->CR1 &= (0xFFFFFFFF ^ TIM_CR1_DIR); + // TIM4->CR1 |= TIM_CR1_CEN; /* timer powinien byc uruchamiany tylko przy wysylaniu danych */ + TIM5->DIER |= 1; + NVIC_EnableIRQ( TIM5_IRQn ); +#endif /////////////////////////////////////////// /// konfiguracja TIM7 --adc /// /////////////////////////////////////////// diff --git a/src/it_handlers.c b/src/it_handlers.c index 91184c6..cdb8599 100644 --- a/src/it_handlers.c +++ b/src/it_handlers.c @@ -68,7 +68,11 @@ uint8_t it_handlers_cpu_load_pool = 0; void it_handlers_set_priorities(void) { NVIC_SetPriority(TIM2_IRQn, 1); // one-wire delay NVIC_SetPriority(I2C1_EV_IRQn, 2); +#ifdef STM32F10X_MD_VL NVIC_SetPriority(TIM4_IRQn, 3); // DAC +#else + NVIC_SetPriority(TIM5_IRQn, 3); +#endif NVIC_SetPriority(TIM7_IRQn, 4); // ADC // systick NVIC_SetPriority(TIM1_UP_TIM16_IRQn, 6); // TX20 anemometer @@ -172,7 +176,11 @@ void TIM1_TRG_COM_TIM17_IRQHandler(void) { #endif } +#ifdef STM32F10X_MD_VL void DMA1_Channel7_IRQHandler() { // DMA1_Channel7_IRQn +#else +void DMA1_Channel5_IRQHandler() { // DMA1_Channel7_IRQn +#endif #ifdef STM32F10X_MD_VL NVIC_ClearPendingIRQ(DMA1_Channel7_IRQn); DMA_ClearITPendingBit(DMA1_IT_GL7); @@ -187,13 +195,13 @@ void DMA1_Channel7_IRQHandler() { // DMA1_Channel7_IRQn #endif } +#ifdef STM32F10X_MD_VL void TIM4_IRQHandler( void ) { // obsluga przerwania cyfra-analog TIM4->SR &= ~(1<<0); -#ifdef STM32F10X_MD_VL + DAC->DHR8R1 = AFSK_DAC_ISR(&main_afsk); DAC->SWTRIGR |= 1; -#endif #ifdef STM32L471xx DAC->DHR8R2 = AFSK_DAC_ISR(&main_afsk); @@ -205,6 +213,21 @@ void TIM4_IRQHandler( void ) { } } +#else +void TIM5_IRQHandler( void ) { + // obsluga przerwania cyfra-analog + TIM5->SR &= ~(1<<0); + + + DAC->DHR8R2 = AFSK_DAC_ISR(&main_afsk); + DAC->SWTRIGR |= 2; + + if ((main_config_data_mode->wx & WX_ENABLED) == 0) { + led_control_led2_bottom(main_afsk.sending); + } + +} +#endif void TIM7_IRQHandler(void) { // obsluga przetwarzania analog-cyfra. Wersja z oversamplingiem diff --git a/src/main.c b/src/main.c index 51735c1..6f4cc68 100644 --- a/src/main.c +++ b/src/main.c @@ -278,7 +278,7 @@ int main(int argc, char* argv[]){ system_clock_configure_rtc_l4(); - RCC->APB1ENR1 |= (RCC_APB1ENR1_TIM2EN | RCC_APB1ENR1_TIM3EN | RCC_APB1ENR1_TIM4EN | RCC_APB1ENR1_TIM7EN | RCC_APB1ENR1_USART2EN | RCC_APB1ENR1_USART3EN | RCC_APB1ENR1_DAC1EN | RCC_APB1ENR1_I2C1EN); + RCC->APB1ENR1 |= (RCC_APB1ENR1_TIM2EN | RCC_APB1ENR1_TIM3EN | RCC_APB1ENR1_TIM4EN | RCC_APB1ENR1_TIM5EN | RCC_APB1ENR1_TIM7EN | RCC_APB1ENR1_USART2EN | RCC_APB1ENR1_USART3EN | RCC_APB1ENR1_DAC1EN | RCC_APB1ENR1_I2C1EN); RCC->APB2ENR |= (RCC_APB2ENR_TIM1EN | RCC_APB2ENR_USART1EN); RCC->AHB1ENR |= (RCC_AHB1ENR_CRCEN | RCC_AHB1ENR_DMA1EN); RCC->AHB2ENR |= (RCC_AHB2ENR_ADCEN | RCC_AHB2ENR_GPIOAEN | RCC_AHB2ENR_GPIOBEN | RCC_AHB2ENR_GPIOCEN | RCC_AHB2ENR_GPIODEN); diff --git a/system/src/aprs/dac.c b/system/src/aprs/dac.c index 95b12fb..d2c481f 100644 --- a/system/src/aprs/dac.c +++ b/system/src/aprs/dac.c @@ -107,8 +107,13 @@ void DA_Start() { #endif - TIM4->CR1 |= TIM_CR1_CEN; +#ifdef STM32F10X_MD_VL + TIM4->CR1 |= TIM_CR1_CEN; +#else + TIM5->CR1 |= TIM_CR1_CEN; + +#endif #if (!defined(_METEO)) GPIO_SetBits(GPIOC, GPIO_Pin_9); @@ -132,7 +137,12 @@ void DA_Stop() { #endif // //Timer2 DISABLE +#ifdef STM32F10X_MD_VL TIM4->CR1 &= ~TIM_CR1_CEN; +#else + TIM5->CR1 &= ~TIM_CR1_CEN; + +#endif #if (!defined(_METEO)) GPIO_ResetBits(GPIOC, GPIO_Pin_9); diff --git a/system/src/drivers/analog_anemometer.c b/system/src/drivers/analog_anemometer.c index 0681bb0..bae03a4 100644 --- a/system/src/drivers/analog_anemometer.c +++ b/system/src/drivers/analog_anemometer.c @@ -243,6 +243,14 @@ void analog_anemometer_init(uint16_t pulses_per_meter_second, uint8_t anemometer #ifdef STM32L471xx + GPIO_InitTypeDef.Mode = LL_GPIO_MODE_ALTERNATE; + GPIO_InitTypeDef.Pin = LL_GPIO_PIN_9; + GPIO_InitTypeDef.Pull = LL_GPIO_PULL_NO; + GPIO_InitTypeDef.Speed = LL_GPIO_SPEED_FREQ_MEDIUM; + GPIO_InitTypeDef.Alternate = LL_GPIO_AF_2; + + LL_GPIO_Init(GPIOB, &GPIO_InitTypeDef); + // set parameters for TIM4 used for windspeed TIM_InitTypeDef.Prescaler = 23999; TIM_InitTypeDef.Autoreload = 60000; @@ -265,8 +273,10 @@ void analog_anemometer_init(uint16_t pulses_per_meter_second, uint8_t anemometer // configure and activate fourth channel LL_TIM_IC_Init(TIM4, LL_TIM_CHANNEL_CH3, &TIM_IC_InitTypeDef); + LL_TIM_EnableDMAReq_UPDATE(TIM4); + // enable DMA request for fourth channel - LL_TIM_EnableDMAReq_CC4(TIM4); + LL_TIM_EnableDMAReq_CC3(TIM4); DMA_InitStruct.Direction = LL_DMA_DIRECTION_PERIPH_TO_MEMORY; DMA_InitStruct.MemoryOrM2MDstAddress = (uint32_t)analog_anemometer_windspeed_pulses_time; @@ -275,12 +285,16 @@ void analog_anemometer_init(uint16_t pulses_per_meter_second, uint8_t anemometer DMA_InitStruct.Mode = LL_DMA_MODE_NORMAL; DMA_InitStruct.NbData = ANALOG_ANEMOMETER_SPEED_PULSES_N; DMA_InitStruct.PeriphOrM2MSrcAddress = (uint32_t)&TIM4->CCR3; - DMA_InitStruct.PeriphOrM2MSrcDataSize = LL_DMA_MDATAALIGN_HALFWORD; + DMA_InitStruct.PeriphOrM2MSrcDataSize = LL_DMA_PDATAALIGN_HALFWORD; DMA_InitStruct.PeriphOrM2MSrcIncMode = LL_DMA_MEMORY_NOINCREMENT; DMA_InitStruct.PeriphRequest = LL_DMA_REQUEST_6; // LL_DMAMUX_REQ_TIM4_CH3 LL_DMA_Init(DMA1, LL_DMA_CHANNEL_5, &DMA_InitStruct); + LL_DMA_EnableIT_TC(DMA1, LL_DMA_CHANNEL_5); + + LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_5); + LL_TIM_EnableCounter(TIM4); NVIC_EnableIRQ( DMA1_Channel5_IRQn );