fixed wind speed handling & regarding dma configuration

pull/7/head
Mateusz Lubecki 2021-09-21 21:00:52 +02:00
rodzic e3d02dee3e
commit b85d88540e
7 zmienionych plików z 69 dodań i 8 usunięć

Wyświetl plik

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="ilg.gnumcueclipse.debug.gdbjtag.openocd.launchConfigurationType">
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.PERIPHERALS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;peripherals&gt;&#10; &lt;peripheral name=&quot;ADC1&quot;/&gt;&#10; &lt;peripheral name=&quot;DAC&quot;/&gt;&#10; &lt;peripheral name=&quot;GPIOC&quot;/&gt;&#10; &lt;peripheral name=&quot;GPIOA&quot;/&gt;&#10;&lt;/peripherals&gt;&#10;"/>
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.PERIPHERALS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;peripherals&gt;&#10; &lt;peripheral name=&quot;GPIOB&quot;/&gt;&#10; &lt;peripheral name=&quot;TIM4&quot;/&gt;&#10; &lt;peripheral name=&quot;DMA1&quot;/&gt;&#10;&lt;/peripherals&gt;&#10;"/>
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doContinue" value="true"/>
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doDebugInRam" value="false"/>
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doFirstReset" value="true"/>

Wyświetl plik

@ -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

Wyświetl plik

@ -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 ///
///////////////////////////////////////////

Wyświetl plik

@ -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

Wyświetl plik

@ -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);

Wyświetl plik

@ -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);

Wyświetl plik

@ -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 );