记录在MCU出现未按照预期工作的解决方案或思路
MCU发送一帧数据后,立刻又收到一个字节数据(GD32E230)
一、测试条件、故障现象、复现过程
- 在bootloader中,使用CDBus协议。使用上位机多次读写会高概率出现舵机不响应情况
- 舵机串口原理图,使用USART0 PA9引脚

- 串口初始化时配置为TX RX都使能;切换发送和接收时只切换485的DE RE引脚上的电平:
1 |
|
二、分析故障
- 调试时发现:MCU回复主机命令后,可以看到,MCU又接收到了一个字节的数据(此时主机并没有发送数据),这个字节的数据和MCU自己发送的第一个字节相同

- 在GD32e23x用户手册中写明了:通讯冲突由软件处理

- 根据手册我推测:MCU初始化串口时同时开启了TX 和 RX,在MCU回包时RX没有关闭,导致MCU把TX的数据认为时RX的数据,由于RX的缓冲区RDATA只有一个深度,仅在被MCU读出后才能接收新的数据,因此当MCU发送完所有数据后,MCU判断到有新的串口数据。
四、解决故障
- MCU串口初始化时进开启RX
- MCU在回包时打开TX,关闭RX
- MCU在回包结束后关闭TX,打开RX
1 |
|
农业无刷电机,快速下上电,出现电机不工作(AT32F413)
一、测试条件和故障现象
- 电源网络:220V—->24V–DCDC–>9V–LDO–>5V/3.3V
- 上电,客户使用脚本让电机在允许范围内随机高频运动。
- 突然拍下急停(断开220V—->24V链路),立刻恢复,电机无法通讯,无法工作。
二、复现过程
- 用python写脚本让电机在允许范围内随机高频运动。串口通过RS-485连接程控电源。在一定时间内随机关闭电源,然后立刻开启电源。无法复现。
- 手动将电源电压调到0V。开启电源,然后1V/step增加电压,逐渐到9V。电机无法通讯。
三、分析故障
- 使用示波器抓晶振,不起振。重新给复位信号,晶振起振,电机工作正常。
- 在system_init函数中增加IO toggle(不要太多次,会导致电压稳定,故障消失)。
1 | void SystemInit (void) |
- MCU卡在了while(CRM->cfg_bit.sclksts != CRM_SCLK_HICK);

四、解决故障
- 由于MCU在system_init 阶段就已经不工作,因此需要在system_init启动阶段就开启看门狗
1 | void SystemInit (void) |