这里介绍一种比较简单好用的串口接收方法——空闲中断
原理就是使能非空中断,在接收到数据的时候进入中断。进入后再使能空闲中断,然后不断接收数据。在接收不到数据之后,触发空闲中断,设置对应标志位,说明完成了一次接收。
一、CubeMX
1.新建工程,选择芯片,F103RCT6
2.设置RCC时钟,选用外部晶振,设置时钟为72MHz
3.使能串口一,设置波特率为115200
4.使能串口一中断
5.生成MDK工程
二、编写代码
1.重定向printf
- #include "stdio.h"
- int fputc(int ch, FILE *f)
- {
- HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
- return ch;
- }
复制代码 2.使能非空中断
- __HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
复制代码 3.编写中断接收函数
- void USART1_IRQHandler(void)
- {
- /* USER CODE BEGIN USART1_IRQn 0 */
- if((__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET))
- {
- __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
- aRxBuffer[aRxCount++] = (uint8_t)(huart1.Instance->DR & (uint8_t)0x00ff);
- __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE);
- }
-
- if((__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE) != RESET))
- {
- __HAL_UART_DISABLE_IT(&huart1, UART_IT_IDLE);
- aRxState = 1;
- }
- return;
- /* USER CODE END USART1_IRQn 0 */
- HAL_UART_IRQHandler(&huart1);
- /* USER CODE BEGIN USART1_IRQn 1 */
- /* USER CODE END USART1_IRQn 1 */
- }
复制代码 5.接收完成后的输出代码
- while (1)
- {
- if(aRxState == 1)
- {
- aRxState = 0;
- HAL_UART_Transmit(&huart1, aRxBuffer, aRxCount, HAL_MAX_DELAY);
- aRxCount = 0;
- memset(aRxBuffer, 0, aRxSize);
- }
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- }
复制代码 6.下载代码
时钟树
串口配置
开启中断
效果
idleTest.rar
(504.71 KB, 下载次数: 6)
|