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

2019-07-21 05:36发布

如题:基于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)
{}

不知道这到底是怎么回事!!
应该如何在程序运行过程中重启一个外设呢??
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
嘴角的上弦月
1楼-- · 2019-07-21 07:32
wxjhby 发表于 2019-1-19 15:46
建议单步调试吧,HAL库把底层封装的太厉害了,光看程序很难查清楚

差不多找到原因了,是DMA缓冲区的数据不管用不用,中断后都要清空,然后再开启接收。尤其是第一个字节。不然就会一直进中断,程序就死了。
路人曦
2楼-- · 2019-07-21 09:17
HAL库里面函数挺全的,不一定非要用配置好的,而且你发的这个两个函数....也不是串口初始化的....重新init外设,就从头初始化一次就好了,中断回调函数什么的应该就不用了
嘴角的上弦月
3楼-- · 2019-07-21 11:43
路人曦 发表于 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__);
    }



这个函数,在上电初始化中调用 串口就能正常工作,在主函数中更改波特率后调用,程序就进到硬件错误中断里面了!!
路人曦
4楼-- · 2019-07-21 15:35
嘴角的上弦月 发表于 2019-1-18 14:06
void MX_USART2_Init(void)
{
    huart2.Instance = USART2;

...这个函数不是把波特率改成9600么.....=-=你是不是波特率都没改成功.....
零一三南宫南
5楼-- · 2019-07-21 21:03
 精彩回答 2  元偷偷看……
嘴角的上弦月
6楼-- · 2019-07-21 21:19
建议单步调试吧,HAL库把底层封装的太厉害了,光看程序很难查清楚

一周热门 更多>