一、创建项目
创建一个STM32f103c8
的STM32CubeMX
项目:
SYS
设置:
RCC
设置:
- 时钟树设置,输入72后回车:
USART1
设置:
将Mode
设置为Asynchronous
:
使能串口中断:
- 设置
Project Manager
后,生成代码:
二、编写代码
打开main.c
文件
在文件中定义缓冲区大小:
#define LENGTH 10 // 接收缓冲区大小
定义缓冲区和标志位:
uint8_t RxBuffer[LENGTH]; // 接收缓冲区
uint8_t Rxflag = 0; // 标志位,0为接收未完成,1为接收完成
在main()
中定义接收成功信息:
HAL_UART_Receive_IT(&huart1, (uint8_t*)RxBuffer, LENGTH); // 使能接收中断
char data[] = "\nReveive Success\n"; // 接收成功信息
在while
循环中发送成功信息和接收到的信息:
if (Rxflag == 1){ // 若数据接收完成
Rxflag = 0; // 清除标志位
HAL_UART_Transmit(&huart1, (uint8_t *)data, 18, 0xFFFF); // 接收成功信息
// 发送接收到的字符
HAL_UART_Transmit_IT(&huart1, (uint8_t*)RxBuffer, LENGTH);
}
在main.c
中定义回调函数:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
if (huart->Instance == USART1){
Rxflag = 1; // 设置标志位为1
HAL_UART_Receive_IT(&huart1, (uint8_t*)&RxBuffer, LENGTH); // 使能接收中断
}
}
三、运行
编译并烧录后,打开串口调试工具,设置波特率等:
打开串口
,输入HelloWorld
并发送,成功接收:
四、总结
中断方式不必等待数据的传输过程,只需要在每字节数据收发完成后,由中断标志位触发中断,在中断服务程序中放入新的一字节数据或者读取接收到的一字节数据。