2017-08-20 12:41:17 +00:00
|
|
|
/*
|
|
|
|
* it_handlers.c
|
|
|
|
*
|
|
|
|
* Created on: 28.05.2017
|
|
|
|
* Author: mateusz
|
|
|
|
*/
|
|
|
|
|
2021-06-13 06:36:32 +00:00
|
|
|
#include "station_config_target_hw.h"
|
|
|
|
|
2019-01-26 22:18:25 +00:00
|
|
|
#include <delay.h>
|
2021-06-13 06:36:32 +00:00
|
|
|
|
|
|
|
#ifdef STM32F10X_MD_VL
|
2017-08-20 12:41:17 +00:00
|
|
|
#include <stm32f10x.h>
|
2021-06-13 06:36:32 +00:00
|
|
|
#endif
|
|
|
|
#ifdef STM32L471xx
|
|
|
|
#include <stm32l4xx.h>
|
|
|
|
#include <stm32l4xx_ll_tim.h>
|
|
|
|
#include <stm32l4xx_ll_dma.h>
|
|
|
|
#include <stm32l471xx.h>
|
2021-09-10 20:38:13 +00:00
|
|
|
#include "cmsis/stm32l4xx/system_stm32l4xx.h"
|
|
|
|
#include "pwr_save.h"
|
2021-06-13 06:36:32 +00:00
|
|
|
#endif
|
|
|
|
|
2017-08-20 12:41:17 +00:00
|
|
|
#include "drivers/dallas.h"
|
|
|
|
#include "drivers/ms5611.h"
|
2019-01-13 20:55:09 +00:00
|
|
|
#include "drivers/serial.h"
|
2019-01-23 21:18:05 +00:00
|
|
|
#include "drivers/i2c.h"
|
2019-12-26 19:55:47 +00:00
|
|
|
#include "drivers/analog_anemometer.h"
|
2017-08-20 12:41:17 +00:00
|
|
|
#include "aprs/wx.h"
|
|
|
|
#include "aprs/telemetry.h"
|
|
|
|
#include "aprs/beacon.h"
|
|
|
|
#include "main.h"
|
2020-07-12 22:13:39 +00:00
|
|
|
#include "LedConfig.h"
|
2019-01-26 17:02:19 +00:00
|
|
|
//#include "afsk.h"
|
2017-08-20 12:41:17 +00:00
|
|
|
#include "diag/Trace.h"
|
2021-08-03 21:01:26 +00:00
|
|
|
#include "io.h"
|
2017-08-20 12:41:17 +00:00
|
|
|
|
2022-03-27 05:45:24 +00:00
|
|
|
#include "rte_main.h"
|
|
|
|
|
2018-01-01 18:57:29 +00:00
|
|
|
#include "station_config.h"
|
|
|
|
|
2017-08-20 12:41:17 +00:00
|
|
|
|
2019-01-27 12:14:36 +00:00
|
|
|
/*
|
|
|
|
* INTERRUPT PRIORITIES
|
|
|
|
*
|
|
|
|
* TIM2_IRQHandler - 1 -> Dallas delay (enable only during dallas comm)
|
|
|
|
* I2C1_EV_IRQHandler - 2 -> I2C comm interrupt (active & enable only during communication with i2c sensor)
|
|
|
|
* TIM4_IRQHandler - 3 -> APRS softmodem DAC (enable only during tx)
|
|
|
|
* TIM7_IRQHandler - 4 -> APRS softmodem ADC
|
|
|
|
* SysTick_Handler - 5
|
|
|
|
* TIM1_UP_TIM16_IRQHandler - 6 -> TX20 baudrate timer
|
|
|
|
* EXTI9_5_IRQHandler - 7 -> TX20 anemometer GPIO
|
|
|
|
* EXTI4_IRQHandler - 8 -> DHT22 sensor GPIO interrupt
|
|
|
|
* USART1_IRQHandler - 9 -> uart to comm with KISS host
|
|
|
|
* I2C1_ER_IRQHandler - 10 -> I2C error interrupt
|
|
|
|
*
|
2022-04-19 17:56:53 +00:00
|
|
|
* TIM8_ - PWM input
|
2019-01-27 12:14:36 +00:00
|
|
|
*/
|
|
|
|
|
2017-08-20 12:41:17 +00:00
|
|
|
|
|
|
|
// TIM1 w TX20
|
|
|
|
|
|
|
|
/* Zmienne używane do oversamplingu */
|
2019-12-26 19:55:47 +00:00
|
|
|
int adc_sample_count = 0, adc_sample_c2 = 0; // Zmienna odliczająca próbki
|
2017-08-20 12:41:17 +00:00
|
|
|
unsigned short int AdcBuffer[4]; // Bufor przechowujący kolejne wartości rejestru DR
|
|
|
|
short int AdcValue;
|
|
|
|
|
2020-10-29 18:48:06 +00:00
|
|
|
uint8_t it_handlers_cpu_load_pool = 0;
|
|
|
|
|
2019-01-27 12:14:36 +00:00
|
|
|
// this function will set all iterrupt priorities except systick
|
|
|
|
void it_handlers_set_priorities(void) {
|
2019-12-26 19:55:47 +00:00
|
|
|
NVIC_SetPriority(TIM2_IRQn, 1); // one-wire delay
|
2019-01-27 12:14:36 +00:00
|
|
|
NVIC_SetPriority(I2C1_EV_IRQn, 2);
|
2021-09-21 19:00:52 +00:00
|
|
|
#ifdef STM32F10X_MD_VL
|
2019-12-26 19:55:47 +00:00
|
|
|
NVIC_SetPriority(TIM4_IRQn, 3); // DAC
|
2021-09-21 19:00:52 +00:00
|
|
|
#else
|
|
|
|
NVIC_SetPriority(TIM5_IRQn, 3);
|
|
|
|
#endif
|
2019-12-26 19:55:47 +00:00
|
|
|
NVIC_SetPriority(TIM7_IRQn, 4); // ADC
|
2019-01-27 12:14:36 +00:00
|
|
|
// systick
|
2019-12-26 19:55:47 +00:00
|
|
|
NVIC_SetPriority(TIM1_UP_TIM16_IRQn, 6); // TX20 anemometer
|
|
|
|
NVIC_SetPriority(EXTI9_5_IRQn, 7); // TX20 anemometer
|
|
|
|
NVIC_SetPriority(EXTI4_IRQn, 8); // DHT22 humidity sensor
|
2020-04-13 12:01:07 +00:00
|
|
|
NVIC_SetPriority(USART2_IRQn, 9); // wx
|
|
|
|
NVIC_SetPriority(USART1_IRQn, 10); // kiss
|
|
|
|
NVIC_SetPriority(I2C1_ER_IRQn, 11);
|
2019-01-27 12:14:36 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2021-08-21 20:44:01 +00:00
|
|
|
#ifdef STM32L471xx
|
|
|
|
void RTC_WKUP_IRQHandler(void) {
|
|
|
|
|
2022-04-20 20:30:29 +00:00
|
|
|
main_woken_up = 1;
|
|
|
|
|
2021-08-21 20:44:01 +00:00
|
|
|
// clear pending interrupt
|
|
|
|
NVIC_ClearPendingIRQ(RTC_WKUP_IRQn);
|
|
|
|
|
|
|
|
RTC->ISR &= (0xFFFFFFFF ^ RTC_ISR_WUTF_Msk);
|
|
|
|
|
|
|
|
EXTI->PR1 |= EXTI_PR1_PIF20;
|
2021-08-23 19:20:38 +00:00
|
|
|
|
2022-04-20 20:30:29 +00:00
|
|
|
main_set_monitor(12);
|
|
|
|
|
2021-08-23 19:20:38 +00:00
|
|
|
system_clock_configure_l4();
|
|
|
|
|
2021-09-10 20:38:13 +00:00
|
|
|
pwr_save_exit_from_stop2();
|
|
|
|
|
2021-08-23 19:20:38 +00:00
|
|
|
|
2021-08-21 20:44:01 +00:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2019-01-26 17:02:19 +00:00
|
|
|
// Systick interrupt used for time measurements, checking timeouts and SysTick_Handler
|
2019-01-13 20:55:09 +00:00
|
|
|
void SysTick_Handler(void) {
|
2019-01-23 21:18:05 +00:00
|
|
|
|
|
|
|
// systick interrupt is generated every 10ms
|
2019-01-27 11:34:43 +00:00
|
|
|
master_time += SYSTICK_TICKS_PERIOD;
|
2019-01-13 20:55:09 +00:00
|
|
|
|
2020-10-29 18:48:06 +00:00
|
|
|
if ((it_handlers_cpu_load_pool++) > SYSTICK_TICKS_PER_SECONDS) {
|
|
|
|
main_service_cpu_load_ticks();
|
|
|
|
it_handlers_cpu_load_pool = 0;
|
|
|
|
}
|
|
|
|
|
2019-01-26 17:02:19 +00:00
|
|
|
// decrementing a timer to trigger meteo measuremenets
|
|
|
|
main_wx_decremenet_counter();
|
|
|
|
|
2019-01-27 13:23:20 +00:00
|
|
|
main_packets_tx_decremenet_counter();
|
|
|
|
|
2020-02-01 22:20:17 +00:00
|
|
|
main_one_second_pool_decremenet_counter();
|
|
|
|
|
2019-12-16 21:40:42 +00:00
|
|
|
main_two_second_pool_decrement_counter();
|
|
|
|
|
2020-01-04 13:15:33 +00:00
|
|
|
main_ten_second_pool_decremenet_counter();
|
|
|
|
|
2020-07-12 22:13:39 +00:00
|
|
|
led_service_blink();
|
|
|
|
|
2020-04-12 17:05:41 +00:00
|
|
|
srl_keep_timeout(main_kiss_srl_ctx_ptr);
|
|
|
|
srl_keep_timeout(main_wx_srl_ctx_ptr);
|
2022-01-25 20:00:55 +00:00
|
|
|
srl_keep_timeout(main_gsm_srl_ctx_ptr);
|
2019-01-23 21:18:05 +00:00
|
|
|
|
2020-09-26 19:03:28 +00:00
|
|
|
srl_keep_tx_delay(main_wx_srl_ctx_ptr);
|
|
|
|
|
2019-01-23 21:18:05 +00:00
|
|
|
i2cKeepTimeout();
|
|
|
|
|
2019-01-26 17:02:19 +00:00
|
|
|
delay_decrement_counter();
|
|
|
|
|
2019-01-13 20:55:09 +00:00
|
|
|
}
|
|
|
|
|
2018-12-29 17:45:28 +00:00
|
|
|
void USART1_IRQHandler(void) {
|
|
|
|
NVIC_ClearPendingIRQ(USART1_IRQn);
|
2020-04-12 17:05:41 +00:00
|
|
|
srl_irq_handler(main_kiss_srl_ctx_ptr);
|
|
|
|
}
|
|
|
|
|
|
|
|
void USART2_IRQHandler(void) {
|
|
|
|
NVIC_ClearPendingIRQ(USART2_IRQn);
|
|
|
|
srl_irq_handler(main_wx_srl_ctx_ptr);
|
2017-08-20 12:41:17 +00:00
|
|
|
}
|
|
|
|
|
2022-01-24 20:51:45 +00:00
|
|
|
#ifdef STM32L471xx
|
|
|
|
void USART3_IRQHandler() {
|
|
|
|
NVIC_ClearPendingIRQ(USART3_IRQn);
|
|
|
|
srl_irq_handler(main_gsm_srl_ctx_ptr);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2018-12-29 17:45:28 +00:00
|
|
|
void I2C1_EV_IRQHandler(void) {
|
|
|
|
NVIC_ClearPendingIRQ(I2C1_EV_IRQn);
|
2017-08-20 12:41:17 +00:00
|
|
|
|
2018-12-29 17:45:28 +00:00
|
|
|
i2cIrqHandler();
|
2017-08-20 12:41:17 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2018-12-29 17:45:28 +00:00
|
|
|
void I2C1_ER_IRQHandler(void) {
|
|
|
|
i2cErrIrqHandler();
|
|
|
|
}
|
2017-08-20 12:41:17 +00:00
|
|
|
|
2018-12-29 17:45:28 +00:00
|
|
|
void TIM2_IRQHandler( void ) {
|
|
|
|
TIM2->SR &= ~(1<<0);
|
|
|
|
if (delay_5us > 0)
|
|
|
|
delay_5us--;
|
2017-08-20 12:41:17 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2019-12-26 19:55:47 +00:00
|
|
|
void TIM1_TRG_COM_TIM17_IRQHandler(void) {
|
|
|
|
NVIC_ClearPendingIRQ(TIM1_TRG_COM_TIM17_IRQn);
|
|
|
|
TIM17->SR &= ~(1<<0);
|
|
|
|
|
2021-01-09 21:16:31 +00:00
|
|
|
#if defined(_ANEMOMETER_ANALOGUE) || defined(_ANEMOMETER_ANALOGUE_SPARKFUN)
|
2019-12-26 19:55:47 +00:00
|
|
|
analog_anemometer_timer_irq();
|
2020-02-23 06:50:22 +00:00
|
|
|
#endif
|
2019-12-26 19:55:47 +00:00
|
|
|
}
|
|
|
|
|
2021-09-21 19:00:52 +00:00
|
|
|
#ifdef STM32F10X_MD_VL
|
2021-06-13 06:36:32 +00:00
|
|
|
void DMA1_Channel7_IRQHandler() { // DMA1_Channel7_IRQn
|
2021-09-21 19:00:52 +00:00
|
|
|
#else
|
|
|
|
void DMA1_Channel5_IRQHandler() { // DMA1_Channel7_IRQn
|
|
|
|
#endif
|
2021-06-13 06:36:32 +00:00
|
|
|
#ifdef STM32F10X_MD_VL
|
2019-12-26 19:55:47 +00:00
|
|
|
NVIC_ClearPendingIRQ(DMA1_Channel7_IRQn);
|
2019-12-27 21:07:24 +00:00
|
|
|
DMA_ClearITPendingBit(DMA1_IT_GL7);
|
2021-06-13 06:36:32 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef STM32L471xx
|
|
|
|
LL_DMA_ClearFlag_TC5(DMA1);
|
|
|
|
#endif
|
2019-12-26 19:55:47 +00:00
|
|
|
|
2021-01-09 21:16:31 +00:00
|
|
|
#if defined(_ANEMOMETER_ANALOGUE) || defined(_ANEMOMETER_ANALOGUE_SPARKFUN)
|
2019-12-26 19:55:47 +00:00
|
|
|
analog_anemometer_dma_irq();
|
2020-02-23 06:50:22 +00:00
|
|
|
#endif
|
2019-12-26 19:55:47 +00:00
|
|
|
}
|
|
|
|
|
2021-09-21 19:00:52 +00:00
|
|
|
#ifdef STM32F10X_MD_VL
|
2018-12-29 17:45:28 +00:00
|
|
|
void TIM4_IRQHandler( void ) {
|
|
|
|
// obsluga przerwania cyfra-analog
|
|
|
|
TIM4->SR &= ~(1<<0);
|
2021-09-21 19:00:52 +00:00
|
|
|
|
2019-12-26 19:55:47 +00:00
|
|
|
DAC->DHR8R1 = AFSK_DAC_ISR(&main_afsk);
|
|
|
|
DAC->SWTRIGR |= 1;
|
2021-09-13 09:41:44 +00:00
|
|
|
|
|
|
|
#ifdef STM32L471xx
|
|
|
|
DAC->DHR8R2 = AFSK_DAC_ISR(&main_afsk);
|
|
|
|
DAC->SWTRIGR |= 2;
|
|
|
|
#endif
|
2019-01-27 13:23:20 +00:00
|
|
|
|
2021-05-26 19:28:29 +00:00
|
|
|
if ((main_config_data_mode->wx & WX_ENABLED) == 0) {
|
|
|
|
led_control_led2_bottom(main_afsk.sending);
|
|
|
|
}
|
2018-12-29 17:45:28 +00:00
|
|
|
|
|
|
|
}
|
2021-09-21 19:00:52 +00:00
|
|
|
#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
|
2018-12-29 17:45:28 +00:00
|
|
|
|
|
|
|
void TIM7_IRQHandler(void) {
|
|
|
|
// obsluga przetwarzania analog-cyfra. Wersja z oversamplingiem
|
|
|
|
TIM7->SR &= ~(1<<0);
|
|
|
|
#define ASC adc_sample_count
|
|
|
|
#define ASC2 adc_sample_c2
|
|
|
|
AdcBuffer[ASC] = ADC1->DR;
|
|
|
|
if(ASC == 3) {
|
2021-08-03 21:01:26 +00:00
|
|
|
// io_ext_watchdog_service();
|
2018-12-29 17:45:28 +00:00
|
|
|
AdcValue = (short int)(( AdcBuffer[0] + AdcBuffer[1] + AdcBuffer[2] + AdcBuffer[3]) >> 1);
|
2019-01-26 22:18:25 +00:00
|
|
|
AFSK_ADC_ISR(&main_afsk, (AdcValue - 4095) );
|
2021-09-21 19:39:05 +00:00
|
|
|
led_control_led1_upper(main_ax25.dcd);
|
2018-12-29 17:45:28 +00:00
|
|
|
ASC = 0;
|
|
|
|
|
|
|
|
if (ASC2++ == 2) {
|
|
|
|
// pooling AX25 musi być tu bo jak z przerwania wyskoczy nadawanie WX, BCN, TELEM przy dcd == true
|
|
|
|
// to bedzie wisialo w nieskonczonosc bo ustawiania dcd jest w srodku ax25_poll
|
2019-01-26 22:18:25 +00:00
|
|
|
ax25_poll(&main_ax25);
|
2018-12-29 17:45:28 +00:00
|
|
|
ASC2 = 0;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
else
|
|
|
|
ASC++;
|
|
|
|
|
|
|
|
}
|
|
|
|
|