高级会员

- 积分
- 697
- 金钱
- 697
- 注册时间
- 2014-10-15
- 在线时间
- 166 小时
|
1金钱
我用STM32CUBEMX生成了一个STM32L4R5ZI的串口程序,使能了接收中断。
部分代码:
- static void MX_USART1_UART_Init(void)
- {
- /* USER CODE BEGIN USART1_Init 0 */
- /* USER CODE END USART1_Init 0 */
- /* USER CODE BEGIN USART1_Init 1 */
- /* USER CODE END USART1_Init 1 */
- huart1.Instance = USART1;
- huart1.Init.BaudRate = 9600;
- huart1.Init.WordLength = UART_WORDLENGTH_8B;
- huart1.Init.StopBits = UART_STOPBITS_1;
- huart1.Init.Parity = UART_PARITY_NONE;
- huart1.Init.Mode = UART_MODE_TX_RX;
- huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
- huart1.Init.OverSampling = UART_OVERSAMPLING_16;
- huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
- huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
- huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
- if (HAL_UART_Init(&huart1) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
- {
- Error_Handler();
- }
- HAL_UART_Receive_IT(&huart1, (uint8_t *)buffer, 1);
- //HAL_NVIC_SetPriority(USART1_IRQn,0,0);
- //HAL_NVIC_EnableIRQ(USART1_IRQn);
- /* USER CODE BEGIN USART1_Init 2 */
- /* USER CODE END USART1_Init 2 */
- }
复制代码 中断处理函数:
- void USART1_IRQHandler(void)
- {
- /* USER CODE BEGIN USART1_IRQn 0 */
- /* USER CODE END USART1_IRQn 0 */
- HAL_UART_IRQHandler(&huart1);
- /* USER CODE BEGIN USART1_IRQn 1 */
- /* USER CODE END USART1_IRQn 1 */
- }
复制代码- void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
- {
- uint32_t isrflags = READ_REG(huart->Instance->ISR);
- uint32_t cr1its = READ_REG(huart->Instance->CR1);
- uint32_t cr3its = READ_REG(huart->Instance->CR3);
- uint32_t errorflags;
- uint32_t errorcode;
- //uint8_t buffer[1];
- /* If no error occurs */
- errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE | USART_ISR_RTOF));
- if (errorflags == 0U)
- {
- /* UART in mode Receiver ---------------------------------------------------*/
- #if defined(USART_CR1_FIFOEN)
- if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U)
- && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U)
- || ((cr3its & USART_CR3_RXFTIE) != 0U)))
- #else
- if (((isrflags & USART_ISR_RXNE) != 0U)
- && ((cr1its & USART_CR1_RXNEIE) != 0U))
- #endif /* USART_CR1_FIFOEN */
- {
- if (huart->RxISR != NULL)
- {
- huart->RxISR(huart);
- __HAL_UART_CLEAR_IDLEFLAG(&huart1);
- __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
- HAL_UART_Receive(&huart1,buffer,1,1000);
- HAL_UART_Transmit(&huart1,buffer,1,1000);
- }
复制代码 我试图先接收一个字节数据,然后再发送出去。
可是只能接收一个字节,我想可能是没有清中断标志。
我不知道怎么清,找了两个函数:
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
__HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
可是还是不管用。请高手指教,谢谢!
|
|