完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、 实验说明
实验硬件平台: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”的工程。 3.时钟配置 时钟配置参考下面的链接 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),极其容易造成程序卡死,而且无法恢复(本人研究了好久,也参考了网上的一些说明,但是一直无法解决,所以参考标准库的写法)。初步怀疑是官方中断服务函数占用的时间过长,导致上次接收中断还没用处理完,下一次中断就被触发了。若是你有好的处理方法,可在评论区交流下。 |
|
|
|
只有小组成员才能发言,加入小组>>
3254 浏览 9 评论
2937 浏览 16 评论
3439 浏览 1 评论
8941 浏览 16 评论
4030 浏览 18 评论
1072浏览 3评论
557浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
550浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2285浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1843浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-5 12:21 , Processed in 1.016905 second(s), Total 49, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号