本人最近在使用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串口发送完成一个字节后出现程序跑飞现象

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