本帖最后由 liangzaixl 于 2020-10-19 22:03 编辑
各位大佬好,
因为项目需要,自己做了个booloader程序和一个电脑串口上位机来实现通过串口烧写用户程序的功能(其实之前已经在ST平台上实现功能,使用没问题,现在是要移植到GD平台上,然后发现存在问题)。
芯片用的是GD32F130C8,仿真器用的是ST-LINK,开发环境用的是Keil 5。用户程序中,用timer0做了个定时1ms中断(示波器测试过没问题),然后再在主循环中做一个1s的LED闪烁处理(通过LED闪烁可以看出用户程序有没有运行)。 用户程序测试过如果直接用仿真器烧写进去是可以正常运行的。
然后尝试通过自己写的bootloader来烧写程序。因为这样烧写后,程序上电是从bootloader跳到用户程序运行的,所以需要重新给用户程序指定存放地址,这里设置0x08005000以上存放用户程序,以下是存放bootloader的。而且这个涉及到中断向量重映射,所以在用户程序main函数开开头加了下面两句代码:
Memcpy((void*)0x20000000, (void*)0x08005000, 0x168);
nvic_vector_table_set(NVIC_VECTTAB_RAM, 0);
现在遇到的问题是,通过串口烧写用户程序之后,发现用户程序没有运行(LED不闪烁),然后如果把在timer0中调用的某个函数(该函数是在其他.c文件定义的,且是空函数),重新烧写用户程序就可以运行。重新加上此空函数的调用,用户程序又不运行了。
请教下,是不是我哪里写的有问题,或者是重映射中断向量有问题?感谢指点!
(备注:用户程序通过bootloader串口烧写,和直接通过仿真器烧写,已经用仿真器再读取出来并用代码对比软件对比,用户程序是没有烧写出错的)
|