华大单片机HC32F003串口发送一个字节数据后死机问题

本人最近在使用HC32F003单片机做一个项目中遇到串口发送完成后程序出现跑飞死机现象,第一次出现这个问题,之前使用HC32L136时候就没有这个问题。

HC32F003有2个异步串口功能,如图下为串口概述

以下是串口的内部结构框图

串口1初始化函数

//串口1初始化函数
static void Usart1_Init(uint32_t Baud)
{
    stc_gpio_cfg_t stcGpioCfg;
    stc_uart_cfg_t  stcCfg;
    stc_uart_baud_cfg_t stcBaud;
    stc_bt_cfg_t stcBtCfg;
    
    uint16_t timer=0;

    DDL_ZERO_STRUCT(stcGpioCfg);

    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //使能GPIO模块时钟

    ///<TX
    stcGpioCfg.enDir = GpioDirOut;
    Gpio_Init(GpioPort3, GpioPin2, &stcGpioCfg);
    Gpio_SetAfMode(GpioPort3, GpioPin2, GpioAf5);          //配置P32 端口为URART0_TX

    ///<RX
    stcGpioCfg.enDir = GpioDirIn;
    Gpio_Init(GpioPort3, GpioPin3, &stcGpioCfg);
    Gpio_SetAfMode(GpioPort3, GpioPin3, GpioAf5);          //配置P33 端口为URART0_RX
    

    DDL_ZERO_STRUCT(stcBaud);
    DDL_ZERO_STRUCT(stcBtCfg);

    //外设时钟使能
    Sysctrl_SetPeripheralGate(SysctrlPeripheralBt,TRUE);//模式0/2可以不使能
    Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1,TRUE);

    stcBaud.bDbaud  = 0u;//双倍波特率功能
    stcBaud.u32Baud = Baud;//更新波特率位置
    stcBaud.enMode  = UartMode1; //计算波特率需要模式参数
    stcBaud.u32Pclk = Sysctrl_GetPClkFreq(); //获取PCLK
    timer = Uart_SetBaudRate(M0P_UART1, &stcBaud);

    stcBtCfg.enMD = BtMode2;
    stcBtCfg.enCT = BtTimer;
    Bt_Init(TIM1, &stcBtCfg);//调用basetimer1设置函数产生波特率
    Bt_ARRSet(TIM1,timer);
    Bt_Cnt16Set(TIM1,timer);
    Bt_Run(TIM1);

    stcCfg.enRunMode = UartMode1;//测试项,更改此处来转换4种模式测试
    Uart_Init(M0P_UART1, &stcCfg);

    ///< UART中断配置
    Uart_EnableIrq(M0P_UART1, UartRxIrq);
    Uart_ClrStatus(M0P_UART1, UartRC);
    EnableNvic(UART0_IRQn, IrqLevel3, TRUE);
}

串口1发送函数

//UART1发送函数
static void Usart1_SendData(uint8_t Dat)
{
    Uart_SendDataPoll(M0P_UART1,Dat);
}

串口1中断函数

///< UART1 中断服务函数
void UART1_IRQHandler(void)
{
    volatile uint8_t u8RxData;
    
    if(TRUE == Uart_GetStatus(M0P_UART1, UartRC))
    {
            Uart_ClrStatus(M0P_UART1, UartRC);

            u8RxData = Uart_ReceiveData(M0P_UART1);
    }

}

刚开始一直以为是硬件问题后面经过多次的调试,最后才发现是中断服务函数问题,问题是出现在中断interrupt.C文件里面的中断服务函数,能进入中断函数,但是里面的调用的测无法进入,因为本人的中断是写在串口usart1.C文件的,所以会出现无法进入子函数里面,解决方案就是不要在interrupt.c文件中调用,在usart1.C文件的调用,需要将interrupt.c文件中的void UART1_IRQHandler(void)给屏蔽了

然后在usart1.C文件中调用void UART1_IRQHandler(void)中断服务函数即可解决HC32F003串口发送完成一个字节后出现程序跑飞现象

次问题就是中断部分程序跑飞引起的死机现象,国产的单片机的库肯定是会有些小问题的,需要我们开发应用者的支持,希望能够帮到你们,最后祝大家新年快乐,兔年吉祥,工作顺利!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值