cancel
Showing results for 
Search instead for 
Did you mean: 

Configuration of USART4 interrupts STM32F030CC

karlis
Associate II
Posted on February 16, 2016 at 16:58

Hello everyone.

I am beginner in programming, and I was not able to find working example for USART4 interrupt configuration for STM32F030CC. Until now I was just using USART4 to send messages, but now I need to read them too. I wanted to make a interrupt routine that saves received messages in buffer. I have made an working interrupt for push button and I tried to apply same principles to USART, but there are several problems. This is my interrupt configuration for push button:

/* Tell system that you will use PA0 for EXTI_Line_0 */
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, BAT_PLUGIN_PIN); // EXTI_PinSource0 var rakstit BAT_PLUGIN_PIN
/* PA0 is connected to EXTI_Line0 */
EXTI_InitStruct.EXTI_Line = EXTI_Line7;
/* Enable interrupt */
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
/* Interrupt mode */
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
/* Triggers on rising and falling edge */
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
/* Add to EXTI */
EXTI_Init(&EXTI_InitStruct);
NVIC_SetPriority(EXTI4_15_IRQn, 0);
NVIC_EnableIRQ(EXTI4_15_IRQn);

First I wanted to configure which line I am using. In datasheet it's written that USART4 is in Position 29, but when I open stm32f0xx_exti.h I can't locate it. It seems that there is a incompatibility.

#define EXTI_Line0 ((uint32_t)0x00000001) /*!< External interrupt line 0 */
#define EXTI_Line1 ((uint32_t)0x00000002) /*!< External interrupt line 1 */
#define EXTI_Line2 ((uint32_t)0x00000004) /*!< External interrupt line 2 */
#define EXTI_Line3 ((uint32_t)0x00000008) /*!< External interrupt line 3 */
#define EXTI_Line4 ((uint32_t)0x00000010) /*!< External interrupt line 4 */
#define EXTI_Line5 ((uint32_t)0x00000020) /*!< External interrupt line 5 */
#define EXTI_Line6 ((uint32_t)0x00000040) /*!< External interrupt line 6 */
#define EXTI_Line7 ((uint32_t)0x00000080) /*!< External interrupt line 7 */
#define EXTI_Line8 ((uint32_t)0x00000100) /*!< External interrupt line 8 */
#define EXTI_Line9 ((uint32_t)0x00000200) /*!< External interrupt line 9 */
#define EXTI_Line10 ((uint32_t)0x00000400) /*!< External interrupt line 10 */
#define EXTI_Line11 ((uint32_t)0x00000800) /*!< External interrupt line 11 */
#define EXTI_Line12 ((uint32_t)0x00001000) /*!< External interrupt line 12 */
#define EXTI_Line13 ((uint32_t)0x00002000) /*!< External interrupt line 13 */
#define EXTI_Line14 ((uint32_t)0x00004000) /*!< External interrupt line 14 */
#define EXTI_Line15 ((uint32_t)0x00008000) /*!< External interrupt line 15 */
#define EXTI_Line16 ((uint32_t)0x00010000) /*!< External interrupt line 16 Connected to the PVD Output, not applicable for STM32F030 devices */
#define EXTI_Line17 ((uint32_t)0x00020000) /*!< Internal interrupt line 17 Connected to the RTC Alarm event */
#define EXTI_Line18 ((uint32_t)0x00040000) /*!< Internal interrupt line 18 Connected to the USB event, only applicable for STM32F072 devices */
#define EXTI_Line19 ((uint32_t)0x00080000) /*!< Internal interrupt line 19 Connected to the RTC Tamper and Time Stamp events */
#define EXTI_Line20 ((uint32_t)0x00100000) /*!< Internal interrupt line 20 Connected to the RTC wakeup
event, only applicable for STM32F072 devices */ 
#define EXTI_Line21 ((uint32_t)0x00200000) /*!< Internal interrupt line 21 Connected to the Comparator 1 event, only applicable for STM32F051 ans STM32F072 devices */
#define EXTI_Line22 ((uint32_t)0x00400000) /*!< Internal interrupt line 22 Connected to the Comparator 2 event, only applicable for STM32F051 and STM32F072 devices */
#define EXTI_Line23 ((uint32_t)0x00800000) /*!< Internal interrupt line 23 Connected to the I2C1 wakeup event, not applicable for STM32F030 devices */
#define EXTI_Line25 ((uint32_t)0x02000000) /*!< Internal interrupt line 25 Connected to the USART1 wakeup event, not applicable for STM32F030 devices */
#define EXTI_Line26 ((uint32_t)0x04000000) /*!< Internal interrupt line 26 Connected to the USART2 wakeup event, applicable only for STM32F072 devices */
#define EXTI_Line27 ((uint32_t)0x08000000) /*!< Internal interrupt line 27 Connected to the CEC wakeup event, applicable only for STM32F051 and STM32F072 devices */
#define EXTI_Line31 ((uint32_t)0x80000000) /*!< Internal interrupt line 31 Connected to the VDD USB monitor event, applicable only for STM32F072 devices */

After this failure, which I did not know how to solve Itried to use some examples what I found here, like in [DEAD LINK /public/STe2ecommunities/mcu/Lists/STM32Discovery/Flat.aspx?RootFolder=/public/STe2ecommunities/mcu/Lists/STM32Discovery/UART%20example%20code%20for%20STM32F0&FolderCTID=0x01200200770978C69A1141439FE559EB459D75800084C20D8867EAD444A5987D47BE638E0F&currentviews=38320]this thread. Especially clive1 post at 6:42, but I have same problem as that guy with NVIC_InitTypeDef beingundefinied. I added preprocessor macro, butNVIC_InitTypeDef is still undefined. 0690X00000605GZQAY.png I have configured the USART4 and I know I have to write theUSART4_IRQHandler(void) , but how to configure/enable this interrupt? Can someone please help? #usart-interrupt #st32f030cc
3 REPLIES 3
gbm
Lead III
Posted on February 16, 2016 at 17:52

USART interrrupt (and interrupts from other peripherals) has nothing to do with EXTI. There are plenty of examples o the net. To enable the interrupt, configure it in USART control registers (RXEIE bit), then call

NVIC_EnableIRQ(USART4_IRQn);

My STM32 stuff on github - compact USB device stack and more: https://github.com/gbm-ii/gbmUSBdevice
karlis
Associate II
Posted on February 16, 2016 at 21:27

Thanks! I guess I should read more about interrupts and find a solution to 

NVIC_InitTypeDef being undefinied.

Posted on February 16, 2016 at 21:48

Suspect you need the right startup_stm32f0xx.s file, and the define for your CPU line.

Somehow I think you are mixing EXTI# with Cortex-Mx vector numbers.

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..