你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

求助!HAL库函数 串口中断接收!急急急!加入悬赏  

[复制链接]
magnbudie 提问时间:2015-1-16 10:32 /
悬赏30ST金币已解决
首先介绍一下实验环境:单片机为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)
        {
                 用户函数区域
        }
}


实验结果:

发送没有问题,可成功发送。
接收只能收到第一个字节。
接收服务函数老是进入错误服务函数,错误号为数据溢出

已经分析两天了,还是没有找到问题,求大师分析。

最佳答案

查看完整内容

根据现像,乱码一般是时钟配置问题。楼主检查下时钟配置。
收藏 2 评论40 发布时间:2015-1-16 10:32

举报

40个回答
党国特派员 回答时间:2015-1-16 10:32:56
magnbudie 发表于 2015-1-16 13:48
我把原有中断服务函数的标志位处理函数的顺序改了一下。
现在可以收到数据了,但是第一个数据经常出现跟帧 ...

根据现像,乱码一般是时钟配置问题。楼主检查下时钟配置。
党国特派员 回答时间:2015-1-16 10:56:34
HAL_UART_Receive_IT 不要放在HAL_UART_TxCpltCallback 里,放在主函数里,在初始化的时候调用,总之要在HAL_UART_Transmit_IT之前。
magnbudie 回答时间:2015-1-16 11:13:04
党国特派员 发表于 2015-1-16 10:56
HAL_UART_Receive_IT 不要放在HAL_UART_TxCpltCallback 里,放在主函数里,在初始化的时候调用,总之要在HA ...

改后如下
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
        if(htim==&htim14)
        {
                GYRO_Handle.cmd_GYRO=GYRO_CMD;               
                HAL_UART_Receive_IT(&huart3, GYRO_Handle.frame_GYRO, 7);       
                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);                       
        }
}

还是进入错误中断,无法进入接收完成中断
大秦正声 回答时间:2015-1-16 11:25:27
关注!
波特率降低测试
magnbudie 回答时间:2015-1-16 11:27:05
大秦正声 发表于 2015-1-16 11:25
关注!
波特率降低测试

9600木有问题!
大秦正声 回答时间:2015-1-16 11:30:37
通信距离有多远?用max3232?
党国特派员 回答时间:2015-1-16 11:37:47
本帖最后由 党国特派员 于 2015-1-16 11:40 编辑

HAL_UART_Receive_IT 只需要调用一次。
还有就是你的接收函数里都干了些什么,会不会时间超长了。
党国特派员 回答时间:2015-1-16 12:03:59
如果 是还出现数据溢出的话,那你就用HAL_UART_Receive_DMA吧,最好是双缓冲的。
埃斯提爱慕 回答时间:2015-1-16 12:08:19
提示: 作者被禁止或删除 内容自动屏蔽
damiaa 回答时间:2015-1-16 13:31:44
本帖最后由 damiaa 于 2015-1-16 13:37 编辑

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);                                使能接收
                这个IO和时间搭配问题吧。
用232试试。或者只接收。IO搞个低 死的     ?
magnbudie 回答时间:2015-1-16 13:48:57
我把原有中断服务函数的标志位处理函数的顺序改了一下。
现在可以收到数据了,但是第一个数据经常出现跟帧头不匹配的现象,我感觉是第一个字节丢掉。

求分析!

服务函数修改后顺序

服务函数修改后顺序

偶尔收到正确帧

偶尔收到正确帧

错误帧

错误帧
magnbudie 回答时间:2015-1-16 13:49:49
大秦正声 发表于 2015-1-16 11:30
通信距离有多远?用max3232?

50cm通信距离
magnbudie 回答时间:2015-1-16 13:50:22
大秦正声 发表于 2015-1-16 11:30
通信距离有多远?用max3232?

max422. 硬件没有问题,poll模式可以正常接收
magnbudie 回答时间:2015-1-16 13:51:03
党国特派员 发表于 2015-1-16 11:37
HAL_UART_Receive_IT 只需要调用一次。
还有就是你的接收函数里都干了些什么,会不会时间超长了。
...

接收回调只是加了一个标志位,没干别的
123下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版