From 07bcf204e1abf15a0f886e2a36de7ade1a3cf3bf Mon Sep 17 00:00:00 2001 From: Dominic Clifton Date: Sun, 22 Mar 2015 20:54:38 +0000 Subject: [PATCH] STM32F3 - Add sonar support. --- src/main/drivers/nvic.h | 1 + src/main/drivers/sonar_hcsr04.c | 28 +++++++++++++++++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/main/drivers/nvic.h b/src/main/drivers/nvic.h index 2d8b10ac5..8c16e1b59 100644 --- a/src/main/drivers/nvic.h +++ b/src/main/drivers/nvic.h @@ -21,6 +21,7 @@ #define NVIC_PRIO_I2C_EV NVIC_BUILD_PRIORITY(0, 0) #define NVIC_PRIO_USB NVIC_BUILD_PRIORITY(2, 0) #define NVIC_PRIO_USB_WUP NVIC_BUILD_PRIORITY(1, 0) +#define NVIC_PRIO_SONAR_ECHO NVIC_BUILD_PRIORITY(0x0f, 0x0f) #define NVIC_PRIO_CALLBACK NVIC_BUILD_PRIORITY(0x0f, 0x0f) // utility macros to join/split priority diff --git a/src/main/drivers/sonar_hcsr04.c b/src/main/drivers/sonar_hcsr04.c index ee1c78904..9210b1352 100644 --- a/src/main/drivers/sonar_hcsr04.c +++ b/src/main/drivers/sonar_hcsr04.c @@ -22,6 +22,7 @@ #include "system.h" #include "gpio.h" +#include "nvic.h" #include "sonar_hcsr04.h" @@ -74,22 +75,37 @@ void hcsr04_init(const sonarHardware_t *initialSonarHardware) sonarHardware = initialSonarHardware; +#ifdef STM32F10X // enable AFIO for EXTI support RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); +#endif - // tp - trigger pin +#ifdef STM32F303xC + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); + + /* Enable SYSCFG clock otherwise the EXTI irq handlers are not called */ + RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); +#endif + + // trigger pin gpio.pin = sonarHardware->trigger_pin; gpio.mode = Mode_Out_PP; gpio.speed = Speed_2MHz; gpioInit(GPIOB, &gpio); - // ep - echo pin + // echo pin gpio.pin = sonarHardware->echo_pin; gpio.mode = Mode_IN_FLOATING; gpioInit(GPIOB, &gpio); +#ifdef STM32F10X // setup external interrupt on echo pin gpioExtiLineConfig(GPIO_PortSourceGPIOB, sonarHardware->exti_pin_source); +#endif + +#ifdef STM32F303xC + gpioExtiLineConfig(EXTI_PortSourceGPIOB, sonarHardware->exti_pin_source); +#endif EXTI_ClearITPendingBit(sonarHardware->exti_line); @@ -99,7 +115,13 @@ void hcsr04_init(const sonarHardware_t *initialSonarHardware) EXTIInit.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTIInit); - NVIC_EnableIRQ(sonarHardware->exti_irqn); + NVIC_InitTypeDef NVIC_InitStructure; + + NVIC_InitStructure.NVIC_IRQChannel = sonarHardware->exti_irqn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_PRIORITY_BASE(NVIC_PRIO_SONAR_ECHO); + NVIC_InitStructure.NVIC_IRQChannelSubPriority = NVIC_PRIORITY_SUB(NVIC_PRIO_SONAR_ECHO); + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); lastMeasurementAt = millis() - 60; // force 1st measurement in hcsr04_get_distance() }