【沁恒蓝牙MESH】解决部分CH582单板无法正常启动的过程

本文讲述了在沁恒蓝牙MESHCH582开发中,由于忘记清除串口1接收中断和线路状态错误中断,导致单板上电后无法正常启动的问题。通过深入分析和调试,揭示了清除线路状态错误中断的重要性。
摘要由CSDN通过智能技术生成

本文主要记录了【沁恒蓝牙MESH】CH582单板无法正常启动的原因,
由于开发疏忽,注释了中断服务函数的代码,是入门嵌入式开发经常忽视的错误,用以记录,共勉!!
友情提示: 千万不要随便注释工程中你认为没有用的代码!!!!!!!!!!!!!!!!

【沁恒蓝牙MESH】CH582串口中断内存溢出导致MCU频繁重启

1. 问题二:串口1的接收中断,线路状态错误导致单板无法正常启动

1.1 问题描述:

之前自己开发的基于CH58x的固件在自己的手头的测试板中功能都正常,但是当大批量烧写100块卡发板时却遇到了问题,

问题表现为 有的单板上电无法正常启动,经过排查,发现代码中开启了串口1的接收中断和线路状态错误中断,但是在中断服务函数中却没有清除线路状态错误中断,导致单板无法启动。

1.2 错误的代码如下:

注意 UART1_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_LINE_STAT); 这行代码,开启线路中断和接收中断

但是我在中断服务函数中却没有清除线路状态错误中断,UART1_GetLinSTA();这行代码官方库中是有的,但是我因为开发过程中,编译总是报警告,所以我注释了这行代码,导致拍查浪费了几天的时间。

void ch58x_Uart_init()
{
    /*串口1   PA9 TX1   PA8--RX1*/
    GPIOA_SetBits(bTXD1 );  //;GPIO_Pin_9);
    GPIOA_ModeCfg(bTXD1, GPIO_ModeOut_PP_5mA);  	// PA9 TX
    GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU);      // PA8  RXD-配置上拉输入
    UART1_DefInit();
    UART1_ByteTrigCfg(UART_7BYTE_TRIG);
    UART1_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_LINE_STAT);//开启线路中断和接收中断
    PFIC_EnableIRQ(UART1_IRQn);
}

//中断服务函数
__INTERRUPT
__HIGH_CODE
void UART1_IRQHandler(void)
{
    volatile uint8_t i;

    switch(UART1_GetITFlag())
    {
        case UART_II_LINE_STAT: // 线路状态错误
        {
            //UART1_GetLinSTA();    // 我注释了这行代码
            break;
        }
    }
}

1.3 问题复现与定位

找了几块每次上电都无法正常启动的板子,修改代码如下,发现单板确实是因为进入了中断但是没有清中断导致无法正常启动。

image-20231221083134587

1.4 打破砂锅问到底

1.4.1 UART1_GetLinSTA 这行代码是什么意思?
// 官方解释:refer to LINE error and status define
#define UART1_GetLinSTA()     (R8_UART1_LSR)
#define R8_UART1_LSR        (*((PUINT8V)0x40003405))  // RO, UART1 line status

这行代码的意思就是读了一下 R8_UART1_LSR这个寄存器的值,由于代码中没有赋值,所以编译的时候报 warning 信息,如果改为

uint8_t regVlaue = R8_UART1_LSR 这种赋值的形式编译就不报错了?

继续看手册, 读取寄存器的值可以直接清中断,那么UART1_GetLinSTA()这行代码的作用就是 清除线路状态错误中断image-20231221083923443

1.4.2 读取线路状态寄存器的值,定位问题####

image-20231221090207055

为了测试,在中断服务函数中打印出寄存器的值(在中断中不要使用 printf ,这里仅仅是为了测试)

image-20231221085058627

上电数次后发现,正常启动的单板读取的线路状态寄存器(R8_UART1_LSR)的值都是复位值 0x60 ,但是有问题的单板的读取的复位值是 248 = 0xf8

那么问题就很清楚了,单板上电检测到线路状态错误,进入了中断,但是又没有清中断,所以卡在中断里就无法正常启动了

image-20231221090408155

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

积跬步、至千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值