AnsweredAssumed Answered

STM32F4Nucleo UART Rx interrupt doesn't work

Question asked by lee.michael.004 on Jul 13, 2015
Hi

I have been working with UART Rx interrupt but still not working.
If someone can help me to figure out the problem I will appreciate it.

I am using
- STM32F411RE Nucleo Bd
- STM32CubeMX
- IAR

I am thinking 2 UARTs interrupt mode (UART1 for a GPS module and UART2 for a PC).
And I have finished some basic testings such as...
- Button, B1 (GPIOC 13)
- LED LD2 (GPIOA 5)
- UART2(PA2, PA3) echo test without using the interrupt
- UART1(PA9, PA10) Tx test without using the interrupt
- I am using 2 differnt computers for UART1 and UART2 respectively.

It seems to me like UART IRQ handler is never called.

My codes are like this.
I edited only "main.c" and "stm32f4xx_it.c" files in the "User" folder
001./*main.c*/
002. 
003. 
004.int main(void)
005.{
006. 
007.  /* USER CODE BEGIN 1 */
008. 
009.  /* USER CODE END 1 */
010. 
011.  /* MCU Configuration----------------------------------------------------------*/
012. 
013.  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
014.  HAL_Init();
015. 
016.  /* Configure the system clock */
017.  SystemClock_Config();
018. 
019.  /* System interrupt init*/
020.  /* Sets the priority grouping field */
021.  HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);
022.  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 15);
023. 
024.  /* Initialize all configured peripherals */
025.  MX_GPIO_Init();
026.  MX_TIM3_Init();
027.  MX_USART1_UART_Init();
028.  MX_USART2_UART_Init();
029. 
030.  /* USER CODE BEGIN 2 */
031.  char msg[15];
032.  HAL_Delay(5000); 
033.  HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
034.  sprintf(msg, ">> UART2 (ST-Link) Init \n");  
035.  HAL_UART_Transmit(&huart2, (uint8_t*)msg, strlen(msg), 0x12c);
036.  HAL_Delay(5000);
037.  HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
038.  sprintf(msg, ">> UART1 (GPS) Init\n");  
039.  HAL_UART_Transmit(&huart1, (uint8_t*)msg, strlen(msg), 0x12c);
040.  /* USER CODE END 2 */
041. 
042.  /* USER CODE BEGIN 3 */
043.  /* Infinite loop */
044.  while (1)
045.  {
046.    if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == (uint32_t)GPIO_PIN_RESET) // Push Button B1
047.    {
048.      HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); //LED, LD2
049.    }
050. 
051.  }
052.  /* USER CODE END 3 */
053. 
054.}
055. 
056./** System Clock Configuration
057.*/
058.void SystemClock_Config(void)
059.{
060. 
061.  RCC_OscInitTypeDef RCC_OscInitStruct;
062. 
063.  __PWR_CLK_ENABLE();
064. 
065.  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);
066. 
067.  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
068.  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
069.  RCC_OscInitStruct.HSICalibrationValue = 6;
070.  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
071.  HAL_RCC_OscConfig(&RCC_OscInitStruct);
072. 
073.}
074. 
075./* TIM3 init function */
076.void MX_TIM3_Init(void)
077.{
078. 
079.  TIM_ClockConfigTypeDef sClockSourceConfig;
080.  TIM_MasterConfigTypeDef sMasterConfig;
081. 
082.  htim3.Instance = TIM3;
083.  htim3.Init.Prescaler = 0;
084.  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
085.  htim3.Init.Period = 0;
086.  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
087.  HAL_TIM_Base_Init(&htim3);
088. 
089.  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
090.  HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig);
091. 
092.  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
093.  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
094.  HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig);
095. 
096.}
097. 
098./* USART1 init function */
099.void MX_USART1_UART_Init(void)
100.{
101. 
102.  huart1.Instance = USART1;
103.  huart1.Init.BaudRate = 9600;
104.  huart1.Init.WordLength = UART_WORDLENGTH_8B;
105.  huart1.Init.StopBits = UART_STOPBITS_1;
106.  huart1.Init.Parity = UART_PARITY_NONE;
107.  huart1.Init.Mode = UART_MODE_TX_RX;
108.  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
109.  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
110.  HAL_UART_Init(&huart1);
111. 
112.}
113. 
114./* USART2 init function */
115.void MX_USART2_UART_Init(void)
116.{
117. 
118.  huart2.Instance = USART2;
119.  huart2.Init.BaudRate = 115200;
120.  huart2.Init.WordLength = UART_WORDLENGTH_8B;
121.  huart2.Init.StopBits = UART_STOPBITS_1;
122.  huart2.Init.Parity = UART_PARITY_NONE;
123.  huart2.Init.Mode = UART_MODE_TX_RX;
124.  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
125.  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
126.  HAL_UART_Init(&huart2);
127. 
128.}
129. 
130./** Configure pins as
131.        * Analog
132.        * Input
133.        * Output
134.        * EVENT_OUT
135.        * EXTI
136.        * Free pins are configured automatically as Analog (this feature is enabled through
137.        * the Code Generation settings)
138.*/
139.void MX_GPIO_Init(void)
140.{
141. 
142.  GPIO_InitTypeDef GPIO_InitStruct;
143. 
144.  /* GPIO Ports Clock Enable */
145.  __GPIOC_CLK_ENABLE();
146.  __GPIOH_CLK_ENABLE();
147.  __GPIOA_CLK_ENABLE();
148.  __GPIOB_CLK_ENABLE();
149.  __GPIOD_CLK_ENABLE();
150. 
151.  /*Configure GPIO pin : PC13 */
152.  GPIO_InitStruct.Pin = GPIO_PIN_13;
153.  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
154.  GPIO_InitStruct.Pull = GPIO_PULLUP;
155.  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
156. 
157.  /*Configure GPIO pins : PC14 PC15 PC0 PC1
158.                           PC2 PC3 PC4 PC5
159.                           PC6 PC7 PC8 PC9
160.                           PC10 PC11 PC12 */
161.  GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1
162.                          |GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5
163.                          |GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9
164.                          |GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12;
165.  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
166.  GPIO_InitStruct.Pull = GPIO_NOPULL;
167.  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
168. 
169.  /*Configure GPIO pins : PA0 PA1 PA4 PA6
170.                           PA7 PA8 PA11 PA12
171.                           PA15 */
172.  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_6
173.                          |GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_11|GPIO_PIN_12
174.                          |GPIO_PIN_15;
175.  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
176.  GPIO_InitStruct.Pull = GPIO_NOPULL;
177.  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
178. 
179.  /*Configure GPIO pin : PA5 */
180.  GPIO_InitStruct.Pin = GPIO_PIN_5;
181.  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
182.  GPIO_InitStruct.Pull = GPIO_NOPULL;
183.  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
184.  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
185. 
186.  /*Configure GPIO pins : PB0 PB1 PB2 PB10
187.                           PB12 PB13 PB14 PB15
188.                           PB3 PB4 PB5 PB6
189.                           PB7 PB8 PB9 */
190.  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_10
191.                          |GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15
192.                          |GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6
193.                          |GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
194.  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
195.  GPIO_InitStruct.Pull = GPIO_NOPULL;
196.  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
197. 
198.  /*Configure GPIO pin : PD2 */
199.  GPIO_InitStruct.Pin = GPIO_PIN_2;
200.  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
201.  GPIO_InitStruct.Pull = GPIO_NOPULL;
202.  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
203. 
204.}

01./*stm32f4xx_it.c*/
02. 
03. 
04.void SysTick_Handler(void)
05.{
06.  HAL_IncTick();
07.  HAL_SYSTICK_IRQHandler();
08.}
09. 
10./**
11.* @brief This function handles USART2 global interrupt.
12.*/
13.void USART2_IRQHandler(void)
14.{
15.  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
16.  HAL_NVIC_ClearPendingIRQ(USART2_IRQn);
17.  HAL_UART_IRQHandler(&huart2);
18.}
19. 
20./**
21.* @brief This function handles USART1 global interrupt.
22.*/
23.void USART1_IRQHandler(void)
24.{
25.  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
26.  HAL_NVIC_ClearPendingIRQ(USART1_IRQn);
27.  HAL_UART_IRQHandler(&huart1);
28.}

01./*stm32f4xx_hal_msp.c*/
02. 
03. 
04.void HAL_UART_MspInit(UART_HandleTypeDef* huart)
05.{
06. 
07.  GPIO_InitTypeDef GPIO_InitStruct;
08.  if(huart->Instance==USART1)
09.  {
10.    /* Peripheral clock enable */
11.    __USART1_CLK_ENABLE();
12.   
13.    /**USART1 GPIO Configuration   
14.    PA9     ------> USART1_TX
15.    PA10     ------> USART1_RX
16.    */
17.    GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
18.    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
19.    GPIO_InitStruct.Pull = GPIO_NOPULL;
20.    GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
21.    GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
22.    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
23. 
24.    /* Peripheral interrupt init*/
25.    /* Sets the priority grouping field */
26.    HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);
27.    HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
28.    HAL_NVIC_EnableIRQ(USART1_IRQn);
29.  }
30.  else if(huart->Instance==USART2)
31.  {
32.    /* Peripheral clock enable */
33.    __USART2_CLK_ENABLE();
34.   
35.    /**USART2 GPIO Configuration   
36.    PA2     ------> USART2_TX
37.    PA3     ------> USART2_RX
38.    */
39.    GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
40.    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
41.    GPIO_InitStruct.Pull = GPIO_NOPULL;
42.    GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
43.    GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
44.    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
45. 
46.    /* Peripheral interrupt init*/
47.    /* Sets the priority grouping field */
48.    HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);
49.    HAL_NVIC_SetPriority(USART2_IRQn, 0, 4);
50.    HAL_NVIC_EnableIRQ(USART2_IRQn);
51.  }
52. 
53.}

Thank you in advance

Outcomes