- 问题一
背景:偶发出现烧写不成功,重启电脑,插拔烧录器、更换烧录器都无效
开始下载程序:2025-02-17 15:15:26
C:\RT-ThreadStudio>cd /d C:\RT-ThreadStudio\repo\Extract\Debugger_Support_Packages\RealThread\PyOCD\0.1.3
C:\RT-ThreadStudio\repo\Extract\Debugger_Support_Packages\RealThread\PyOCD\0.1.3>pyocd.exe flash --target=STM32F103RE --erase=auto -a=0x08000000 --frequency=1000000 D:\senye\02_code\01_mcu\01_HaiYuan\02_11_28_cost_reduction\ac_charger_reduction\Debug\ac_charger_debug.bin
0000791:WARNING:rom_table:Invalid coresight component, cidr=0x0
0000862:CRITICAL:__main__:SWD/JTAG Transfer Fault @ 0x0803c068-0x0803c797
Traceback (most recent call last):
File "pyocd\__main__.py", line 362, in run
File "pyocd\__main__.py", line 527, in do_flash
File "pyocd\flash\file_programmer.py", line 158, in program
File "pyocd\flash\loader.py", line 168, in commit
File "pyocd\flash\builder.py", line 421, in program
File "pyocd\flash\builder.py", line 319, in _build_sectors_and_pages
File "pyocd\flash\builder.py", line 264, in fill_end_of_page_gap
File "pyocd\core\coresight_target.py", line 341, in read_memory_block8
File "pyocd\coresight\cortex_m.py", line 661, in read_memory_block8
File "pyocd\core\memory_interface.py", line 89, in read_memory_block8
File "pyocd\probe\stlink_probe.py", line 271, in read_memory_block32
File "pyocd\probe\stlink\stlink.py", line 387, in read_mem32
File "pyocd\probe\stlink\stlink.py", line 345, in _read_mem
pyocd.core.exceptions.TransferFaultError: SWD/JTAG Transfer Fault @ 0x0803c068-0x0803c797
执行完毕, 耗时:1808ms.
使用通义千问查询后,排除几个问题后发现,之前应该用了一下离线烧录器
离线烧录器里面有配置写保护。所以重新打开st-link 下载器点击连接,进入下载,弹出警告忽略后,再使用rt-thredio 就能正常下载了
从你提供的信息来看,在尝试使用PyOCD工具对STM32F103RE目标设备进行编程时遇到了一个SWD/JTAG传输故障。具体错误信息为TransferFaultError: SWD/JTAG Transfer Fault @ 0x0803c068-0x0803c797,这意味着在试图访问或写入指定地址范围的内存时出现了问题。
这里有几个可能的原因和解决方法:
硬件连接问题:确保你的调试器(如ST-LINK)正确连接到目标板,并且连线没有损坏。有时,简单的重新插拔可以解决问题。
目标板电源:确认目标板已正确供电。低电压可能导致通信不稳定。
目标MCU状态:尝试复位目标MCU或者通过其他方式(比如按下复位按钮)让其进入正确的状态以接受编程。
固件或硬件保护:有些MCU具有读写保护功能,需要先解除保护才能进行编程。查阅STM32F103RE的手册了解如何检查和解除这种保护。
PyOCD版本兼容性:根据错误日志,使用的PyOCD版本是0.1.3,考虑到这是一次较旧的版本,可能存在一些bug或与当前硬件不完全兼容的地方。尝试更新PyOCD到最新版本看看是否能解决问题。
内存地址问题:确认你试图编程的.bin文件起始地址(在这个例子中是0x08000000)是否正确。如果目标MCU上的闪存起始地址与此不同,可能会导致编程失败。
希望这些建议能够帮助你解决问题。如果仍然无法解决,考虑提供更多关于你的开发环境、硬件设置等细节,以便进一步诊断问题。
- 问题二
背景:以太网和4G模块共用一个串口,需要再开机时识别对应的模块,因为at client 初始化完成后,无对应的函数,去除初始化,所以先让以太网进行初始化,握手,失败后再切换4G模块进行握手。
问题:串口打开->配置中断模式->发送数据->关闭串口,再使用at client初始化->收发正常。串口打开->配置DMA模式->发送数据->关闭串口,再使用at client初始化->收发数据偶发丢失
at client 配置
串口配置
serial = rt_device_find(devname);
if(serial == RT_NULL){
/* 没有发现串口设备 */
return RT_EIO;
}
ret = rt_device_open(serial, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_DMA_RX);
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; /* 初始化配置参数 */
/* step2:修改串口配置参数 */
config.baud_rate = BAUD_RATE_9600; //修改波特率
config.data_bits = DATA_BITS_8; //数据位 8
config.stop_bits = STOP_BITS_1; //停止位 1
config.bufsz = 512; //修改缓冲区
config.parity = PARITY_NONE; //无奇偶校验位
/* step3:控制串口设备。通过控制接口传入命令控制字,与控制参数 */
if (rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config) != RT_EOK)
return RT_ERROR;
if(ret != RT_EOK){/* 打开设备失败 */
serial = RT_NULL;
return ret;
}
测试1:以太网初始化(使用DMA接收)初始化完成后,修改缓冲区,波特率,都无效
测试2:以太网初始化(使用中断接收)at client收发数据正常,4G可正常收发
测试3:以太网初始化(使用DMA接收),再次用中断打开关闭一次, at client收发数据丢失
测试4: 以太网初始化(使用DMA接收),初始化配置串口接收缓冲区大小512,关闭串口后,at client收发数据正常,4G可正常收发(缓冲区大小和配置的不一致会导致串口初始化失败)
???跟串口的接收缓冲大小有关 1;
测试5: 以太网初始化(使用DMA接收),初始化配置串口接收缓冲区1024,关闭串口后,at client收发数据丢失
测试6: 以太网初始化(使用DMA接收),初始化配置串口接收缓冲区大小700,关闭串口后,at client收发数据正常,串口初始化失败(缓冲区大小和配置的不一致会导致串口初始化失败)
测试7: 以太网初始化(使用DMA接收),at_clinet的缓冲区大小改为1024,at client收发数据丢失
测试8:以太网初始化时 复位后时间拉长,4G模块初始化时间较长,太早发送数据会导致模块回复数据丢失
解决:复位引脚操作后需要2个模块等待的时间不一致,以太网200ms ,4G模块要10s,所以延长再统一发送数据,避免导致4g模块出现故障