完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
首先介绍一下实验环境:单片机为STM32f415
调试器:st-link 硬件初始化: *串口波特率为614400 *采用定时器每隔500us触发一次串口中断发送 *发送完成后进入中断接收模式 定时器中断回调函数如下: void HAL_tiM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim==&htim14) { GYRO_Handle.cmd_GYRO=GYRO_CMD; HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET); 使能发送 HAL_UART_Transmit_IT(&huart3, &GYRO_Handle.cmd_GYRO, 1); 开启中断发送,然后进入发送模式 } } 发送完成后进入发送中断完成回调函数: void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { if(huart==&huart3) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET); 使能接收 HAL_UART_Receive_IT(&huart3, GYRO_Handle.frame_GYRO, 7); 开启中断接收,然后进入接收模式 } } 接收中断完成回调函数: void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart==&huart3) { 用户函数区域 } } 实验结果: 发送没有问题,可成功发送。 接收只能收到第一个字节。 接收服务函数老是进入错误服务函数,错误号为数据溢出 已经分析两天了,还是没有找到问题,求大师分析。 |
|
相关推荐
40个回答
|
|
|
怎么可能有问题,你去看看我的帖子。
|
|
|
|
|
|
不是很明白你的意思,可不可以说细点 |
|
|
|
|
|
|
|
|
|
|
|
应该是HAL库的中断服务函数太臃肿了,导致入队列操作跟不上节奏。已经移步DMA处理,无压力轻松完成高波特率传送。辛苦了 |
|
|
|
|
|
还是DMA来的快啊 |
|
|
|
|
|
那么DMA的优势体现出来了。 否则处理上述情况会增加复杂度(在没有DMA的场景还需要)。 |
|
|
|
|
|
学习了,顺便帮顶
|
|
|
|
|
|
学习中……感谢分享!
|
|
|
|
|
|
楼主可以试下把HAL_UART_Receive_IT(xxx,xxx,xxx);这个函数移到接收完成回调函数里试下,最好不要随便改HAL库函数……
|
|
|
|
|
|
学习中……感谢分享!
|
|
|
|
|
|
发送的频率可能过快乐
|
|
|
|
|
|
|
|
|
|
|
|
你确定是100us不是100ms?串口9600波特率差不多1ms一个数据。你说的串口中断臃肿,采用DMA方式正常我觉得不像,你可以把MCU的频率调到最高,串口的速率没有那么快,不可能处理不完那些东西。 |
|
|
|
|
|
本帖最后由 0721de 于 2016-5-9 15:08 编辑
uint8_t uart_receive[3]={0}; int main(void) { HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_TIM1_Init(); MX_USART2_UART_Init(); /* USER CODE BEGIN 2 */ HAL_UART_Receive_IT(&huart2,uart_receive, uart_len);//只这一句开接收中断, //数组指针uart_receive /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ } } stm32f4xx_it.c中 void USART2_IRQHandler(void) { HAL_UART_IRQHandler(&huart2);//只这两句就行 HAL_UART_Receive_IT(&huart2,uart_receive, 1); } 实验表明,我上位机发1字节数据,就会进一次中断,虽然开接收中断函数里是一个数组指针,但HAL进中断是接一字节便进一次中断。 |
|
|
|
|
|
为何是将HAL_UART_Receive_IT((&huart2,uart_receive, 1)函数放在了void USART2_IRQHandler(void)里? 我试了放在回调函数里,结果执行不了。感觉是接收没有满足调用回调函数的条件。 |
|
|
|
|
|
放在一个任务里。收完数据或一秒调用一次。
|
|
|
|
|
|
关注,感恩无私的分享与奉献
|
|
|
|
|
|
我也倾向于认为是串口中断太臃肿了。
现在用的是STM32F103,串口波特率是9600,如果是再回调函数里再次开启串口中断接收的话,接收一个数据,然后就串口溢出错误了。 改成DMA方式的话,不知道该怎么处理,帧长度不固定。 |
|
|
|
|
|
最近正在调试F042的USART,学习,看看
|
|
|
|
|
|
DMA,高速率,这个很搭
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32F405驱动DS1302时钟模块,输出时间错乱该怎么排查?
2810 浏览 2 评论
stm32f405rgt6驱动DS1302ZN出现时间错乱问题
2420 浏览 1 评论
stm32用fsmc读取ad7606采集数据,数据不变,只有开发版复位才更新数据
2288 浏览 0 评论
2404 浏览 1 评论
1643 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 15:59 , Processed in 1.143615 second(s), Total 109, Slave 92 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2733