一、 实验说明
实验硬件平台:NUCLEO-F303RE开发板
实验软件平台:MDK-5.25
实验内容:实现USART2的发送和接收 中断接收任意长度和任意格式的数据
实验的资源:(USART2_TX PA2) (USART2_RX PA3)
二、实验操作
1.硬件分析
1.NUCLEO-F303RE开发板自带的ST-Link调试器具备成串口调试功能。查看开发板的原理图,我们可以得知STM32F303RET6的PA2和PA3(USART2)和ST-Link的串口相连接。
2.检查跳线电阻SB61,SB62,SB63,SB13,SB14的情况。保证SB61,SB62,SB63处于断开状态。SB13和SB14处于连接状态。
2.新建工程
打开STM32CubeMX,创建名为“USART2”的工程。工程创建过程参考下面链接
【NUCLEO-F303RE】【HAL】STM32F303RET6学习笔记2–新建工程
3.时钟配置
时钟配置参考下面的链接
【NUCLEO-F303RE】【HAL】STM32F303RET6学习笔记3–创建工程以及GPIO的控制(按键控制LED灯)
3.USART2配置
1.打开Pinout&Configuration->Categories->Connectivity->USART2,选择Asynchronous。
2.设置参数,将波特率改成115200,其他的使用默认值
3.开启USART2中断。
4.修改管脚的别称(选做)
4.工程生成
配置已完成,点击“GENERATE CODE” 重新生成工程
5.代码编写
1.在usart.c中编写如下代码
/* USER CODE BEGIN 1 */
uint8_t buff[1024];
uint16_t buff_len=0;
uint8_t buff_Flag=0;
void USART2_IT_Enable(void)
{
__HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
__HAL_UART_ENABLE_IT(&huart2, UART_IT_ERR);
__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
}
/* USER CODE END 1 */
2.在stm32fxxx_it.c中编写如下代码
不使用官方的中断处理函数
不使用官方的中断处理函数
不使用官方的中断处理函数
void USART2_IRQHandler(void)
{
/* USER CODE BEGIN USART2_IRQn 0 */
uint8_t Res=0;
/* USER CODE END USART2_IRQn 0 */
//HAL_UART_IRQHandler(&huart2); //注释这条语句,不使用HAL库的回调处理
/* USER CODE BEGIN USART2_IRQn 1 */
//判读是否为接收中断
if((__HAL_UART_GET_FLAG(&huart2,UART_FLAG_RXNE)!=RESET))
{
HAL_UART_Receive(&huart2,&Res,1,1000);
buff[buff_len]=Res;
buff_len++;
}
//判读是否为溢出中断
if((__HAL_UART_GET_FLAG(&huart2,UART_FLAG_ORE)!=RESET))
{
__HAL_UART_CLEAR_IT(&huart2,UART_CLEAR_OREF);
}
//判读是否为接收空闲中断
if((__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE)!=RESET))
{
__HAL_UART_CLEAR_IT(&huart2,UART_CLEAR_IDLEF);
buff_Flag=1;
}
/* USER CODE END USART2_IRQn 1 */
}
3.在main.c中编写如下代码
/* Infinite loop */
/* USER CODE BEGIN WHILE */
USART2_IT_Enable(); //使能一些中断
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(buff_Flag==1)
{
HAL_UART_Transmit(&huart2 ,buff,buff_len,0xffff);
buff_Flag=0;
buff_len=0;
}
}
/* USER CODE END 3 */
三、实验结果
四 、实验总结
不使用的官方提供的中断处理函数的原因是:官方提供的中断处理函数逻辑太过复杂,函数处理是占用的资源过大。在使用115200波特的的情况下,发送速度过快时(50ms),极其容易造成程序卡死,而且无法恢复(本人研究了好久,也参考了网上的一些说明,但是一直无法解决,所以参考标准库的写法)。初步怀疑是官方中断服务函数占用的时间过长,导致上次接收中断还没用处理完,下一次中断就被触发了。若是你有好的处理方法,可在评论区交流下。