OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2883|回复: 7

基于HAL库,STM32F0芯片通信过程中更改通信波特率,串口重启函数会挂掉!不知道问题出在哪里。。。

[复制链接]

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
发表于 2019-1-16 10:37:13 | 显示全部楼层 |阅读模式
3金钱
如题:基于HAL库,STM32F0芯片通信过程中更改通信波特率,串口重启函数会挂掉!不知道问题出在哪里。。。

串口的初始化函数,是自动生成的,包括DMA配置、USART2配置,以及
    HAL_UART_Receive_DMA(&huart2, UsartType.RX_pData, RX_LEN); //开启串口DMA接收
    __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);               //开启串口接收空闲中断


正常上电初始化流程没有任何问题,通信可以以配置的9600波特率跑起来。
但是使用通信报文更换通信波特率后,然后将串口初始化函数重新调用了一遍,
然后,就导致程序挂掉了,仿真显示进入了硬件错误:
void HardFault_Handler(void)
{}

不知道这到底是怎么回事!!
应该如何在程序运行过程中重启一个外设呢??

最佳答案

查看完整内容[请看2#楼]

差不多找到原因了,是DMA缓冲区的数据不管用不用,中断后都要清空,然后再开启接收。尤其是第一个字节。不然就会一直进中断,程序就死了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
 楼主| 发表于 2019-1-16 10:37:14 | 显示全部楼层
wxjhby 发表于 2019-1-19 15:46
建议单步调试吧,HAL库把底层封装的太厉害了,光看程序很难查清楚

差不多找到原因了,是DMA缓冲区的数据不管用不用,中断后都要清空,然后再开启接收。尤其是第一个字节。不然就会一直进中断,程序就死了。
回复

使用道具 举报

7

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
438
金钱
438
注册时间
2017-8-21
在线时间
76 小时
发表于 2019-1-16 14:09:00 | 显示全部楼层
HAL库里面函数挺全的,不一定非要用配置好的,而且你发的这个两个函数....也不是串口初始化的....重新init外设,就从头初始化一次就好了,中断回调函数什么的应该就不用了
回复

使用道具 举报

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
 楼主| 发表于 2019-1-18 14:06:04 | 显示全部楼层
路人曦 发表于 2019-1-16 14:09
HAL库里面函数挺全的,不一定非要用配置好的,而且你发的这个两个函数....也不是串口初始化的....重新init ...

void MX_USART2_Init(void)
{
    huart2.Instance = USART2;
    huart2.Init.BaudRate = 9600;
    huart2.Init.WordLength = UART_WORDLENGTH_9B;
    huart2.Init.StopBits = UART_STOPBITS_1;
    huart2.Init.Parity = UART_PARITY_EVEN;
    huart2.Init.Mode = UART_MODE_TX_RX;
    huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart2.Init.OverSampling = UART_OVERSAMPLING_16;
    huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
    huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
    if (HAL_UART_Init(&huart2) != HAL_OK)
    {
        _Error_Handler(__FILE__, __LINE__);
    }



这个函数,在上电初始化中调用 串口就能正常工作,在主函数中更改波特率后调用,程序就进到硬件错误中断里面了!!
回复

使用道具 举报

7

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
438
金钱
438
注册时间
2017-8-21
在线时间
76 小时
发表于 2019-1-18 16:03:08 | 显示全部楼层
嘴角的上弦月 发表于 2019-1-18 14:06
void MX_USART2_Init(void)
{
    huart2.Instance = USART2;

...这个函数不是把波特率改成9600么.....=-=你是不是波特率都没改成功.....
回复

使用道具 举报

头像被屏蔽

18

主题

184

帖子

0

精华

禁止发言

积分
258
金钱
258
注册时间
2019-1-10
在线时间
10 小时
发表于 2019-1-18 18:13:59 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
 楼主| 发表于 2019-1-19 14:13:05 | 显示全部楼层
路人曦 发表于 2019-1-18 16:03
...这个函数不是把波特率改成9600么.....=-=你是不是波特率都没改成功.....

实际程序中 9600这个位置是个变量的,而且 即使我就把它重新改为9600,那按理说9600也应该依然通信正常啊,但现在的问题是,直接程序挂掉了
回复

使用道具 举报

4

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1046
金钱
1046
注册时间
2017-5-19
在线时间
335 小时
发表于 2019-1-19 15:46:56 | 显示全部楼层
建议单步调试吧,HAL库把底层封装的太厉害了,光看程序很难查清楚
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-23 07:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表