diff --git a/SHAL/Include/Peripheral/EXT/SHAL_EXTI_CALLBACK.h b/SHAL/Include/Peripheral/EXT/SHAL_EXTI_CALLBACK.h index 8e69a19..0cf3cc3 100644 --- a/SHAL/Include/Peripheral/EXT/SHAL_EXTI_CALLBACK.h +++ b/SHAL/Include/Peripheral/EXT/SHAL_EXTI_CALLBACK.h @@ -22,11 +22,11 @@ extern "C" void EXTI##EXTI_Channel##_IRQHandler(void) { \ }; #define DEFINE_MULTI_EXTI_IRQ(EXTI_Channel_Min, EXTI_Channel_Max) \ -extern "C" void EXTI##EXTI_Channel_Max##_##EXTI_Channel_Min##_IRQHandler(void) { \ +extern "C" void EXTI##EXTI_Channel_Min##_##EXTI_Channel_Max##_IRQHandler(void) { \ for(uint8_t line = EXTI_Channel_Min; line <= EXTI_Channel_Max; line++){ \ if (EXTI->PR & (1 << line)) { \ EXTI->PR |= (1 << line); /*clear flag */ \ - auto cb = EXTI_callbacks[line]; \ + auto cb = EXTI_callbacks[line]; \ if (cb) cb(); \ }; \ } \ diff --git a/SHAL/Include/Peripheral/GPIO/Reg/SHAL_GPIO_REG_F072xB.h b/SHAL/Include/Peripheral/GPIO/Reg/SHAL_GPIO_REG_F072xB.h index c76ee80..b05892f 100644 --- a/SHAL/Include/Peripheral/GPIO/Reg/SHAL_GPIO_REG_F072xB.h +++ b/SHAL/Include/Peripheral/GPIO/Reg/SHAL_GPIO_REG_F072xB.h @@ -209,7 +209,7 @@ constexpr SHAL_Peripheral_Register getGPIORCCEnable(const GPIO_Key g){ __builtin_unreachable(); } -constexpr unsigned int getGPIOPortNumber(const GPIO_Key g){ +constexpr uint32_t getGPIOPortNumber(const GPIO_Key g){ switch(g) { case GPIO_Key::A0: case GPIO_Key::A1: diff --git a/SHAL/Include/Peripheral/UART/SHAL_UART.h b/SHAL/Include/Peripheral/UART/SHAL_UART.h index ba7ba68..2a6ebfc 100644 --- a/SHAL/Include/Peripheral/UART/SHAL_UART.h +++ b/SHAL/Include/Peripheral/UART/SHAL_UART.h @@ -17,13 +17,13 @@ class UART{ public: //begins Tx and Usart TODO either modify this function or add a new one that supports Rx - void begin(uint32_t baudRate); + void begin(uint32_t baudRate) volatile; //Sends a string - void sendString(const char* s); + void sendString(const char* s) volatile; //Sends a char - void sendChar(char c); + void sendChar(char c) volatile; private: diff --git a/SHAL/Src/Peripheral/GPIO/SHAL_GPIO.cpp b/SHAL/Src/Peripheral/GPIO/SHAL_GPIO.cpp index 2783ad4..2c6a2b8 100644 --- a/SHAL/Src/Peripheral/GPIO/SHAL_GPIO.cpp +++ b/SHAL/Src/Peripheral/GPIO/SHAL_GPIO.cpp @@ -75,8 +75,9 @@ GPIO& GPIOManager::get(GPIO_Key key, PinMode pinMode) { } void GPIOManager::getInterruptGPIO(GPIO_Key key, TriggerMode triggerMode, EXTICallback callback) { - unsigned int gpioPort = getGPIOPortNumber(key); - unsigned long gpioPin = getGPIORegister(key).global_offset; //Use existing structs to get offset + + uint32_t gpioPort = getGPIOPortNumber(key); + uint32_t gpioPin = getGPIORegister(key).global_offset; //Use existing structs to get offset if (m_gpios[gpioPort][gpioPin].m_GPIO_KEY == GPIO_Key::INVALID){ m_gpios[gpioPort][gpioPin] = GPIO(key,PinMode::INPUT_MODE); //Hardcode input mode for interrupt @@ -112,4 +113,6 @@ void GPIOManager::getInterruptGPIO(GPIO_Key key, TriggerMode triggerMode, EXTICa //Set callback registerEXTICallback(key,callback); + + __enable_irq(); //Enable IRQ just in case } \ No newline at end of file diff --git a/SHAL/Src/Peripheral/UART/SHAL_UART.cpp b/SHAL/Src/Peripheral/UART/SHAL_UART.cpp index ee35724..8b653ad 100644 --- a/SHAL/Src/Peripheral/UART/SHAL_UART.cpp +++ b/SHAL/Src/Peripheral/UART/SHAL_UART.cpp @@ -41,7 +41,7 @@ UART::UART(const UART_Pair pair) : m_UARTPair(pair){ *pairUARTEnable.reg |= pairUARTEnable.mask; //Enable UART line } -void UART::begin(uint32_t baudRate) { +void UART::begin(uint32_t baudRate) volatile { USART_TypeDef* usart = getUARTPair(m_UARTPair).USARTReg; @@ -57,11 +57,11 @@ void UART::begin(uint32_t baudRate) { } -void UART::sendString(const char *s) { +void UART::sendString(const char *s) volatile { while (*s) sendChar(*s++); //Send chars while we haven't reached end of s } -void UART::sendChar(char c) { +void UART::sendChar(char c) volatile { USART_TypeDef* usart = getUARTPair(m_UARTPair).USARTReg; diff --git a/SHAL/Src/main.cpp b/SHAL/Src/main.cpp index 1b880a1..9069cdd 100644 --- a/SHAL/Src/main.cpp +++ b/SHAL/Src/main.cpp @@ -4,12 +4,10 @@ volatile GPIO* blueLED = nullptr; volatile GPIO* greenLED = nullptr; +volatile UART* uart2; -extern "C" void EXTI0_1_IRQHandler(void) { - if (EXTI->PR & (1 << 0)) { //Check pending flag - EXTI->PR |= (1 << 0); //Clear it by writing 1 - greenLED->toggle(); - } +void c3Interrupt(){ + greenLED->toggle(); } void tim2Handler(){ @@ -18,11 +16,11 @@ void tim2Handler(){ int main() { - UART uart2 = getUART(UART_Pair::Tx2A2_Rx2A3); + uart2 = &getUART(UART_Pair::Tx2A2_Rx2A3); - uart2.begin(115200); + uart2->begin(115200); - RCC->AHBENR |= RCC_AHBENR_GPIOBEN; + useGPIOAsInterrupt(GPIO_Key::C3,TriggerMode::RISING_EDGE,c3Interrupt); Timer timer2 = getTimer(Timer_Key::S_TIM2); @@ -34,20 +32,7 @@ int main() { timer2.setCallbackFunc(tim2Handler); timer2.start(); - RCC->APB2ENR |= RCC_APB2ENR_SYSCFGCOMPEN; //Enable SYSCFG clock (needed for EXTI) - - SYSCFG->EXTICR[0] &= ~SYSCFG_EXTICR1_EXTI0; //Clear EXTI0 mapping - SYSCFG->EXTICR[0] |= SYSCFG_EXTICR1_EXTI0_PB; //Map PA0 -> EXTI0 - - EXTI->IMR |= (1 << 0); //Unmask EXTI0 - EXTI->RTSR |= (1 << 0); //Trigger on rising edge - - NVIC_EnableIRQ(EXTI0_1_IRQn); //EXTI lines 0 and 1 share an IRQ vector - - __enable_irq(); - while (true) { __WFI(); - uart2.sendString("Hello\r\n"); } }