1、首先我们拿到一份中继器的程序(基于GD32107rc)
2、烧录到GD32芯片的中继器板,确认程序可以运行
3、开始看Main函数,第一句话
rcu_osci_on(RCU_IRC40K);//启动用于给看门狗的内部40KHz的时钟
没有发现时钟配置函数,当前程序配置成多少主频率?
4、查看启动函数;
;/* reset Handler */ Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT __main IMPORT SystemInit LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 ENDP
从重置中断开始,
这里一共就执行了两个函数,SystemInit和__main。所以SystemInit在重启中断中执行了。
#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) system_clock_108m_hxtal();
时钟是108M。
5、修改这个工程为实现通用命令码的工程。主要工作:更新COMMCMD.c文件,配置CAN接口以及收发缓冲,达到可以收发命令;引入CAN2.c文件,实现通用命令码的回调函数;引入EEPROM.c文件,实现IIC读写;读芯片的UID(107rc的参考手册上有地址),并采用前6位(共有12位)作为模块序列号。
6、从GD32库文件 的参考例程(\GD32F10x_Demo_Suites_V2.1.0\GD32107C_EVAL_Demo_Suites\Projects\12_SPI_SPI_Flash),拷贝gd25qxx.c和gd25qxx.h文件到工程里面,改为SPI.c,实现SPI1_Send_5Bytes(uint64_t data),和SPI2_Send_5Bytes(uint64_t data)函数,在主程序引用,测试TMC4671\TMC6200.
SPITEST3 = SPI1_Send_5Bytes(0x0000000000);//读回来应该是"0x34363731" TMC6200_Reg.GCONF = SPI2_Send_5Bytes(0x0000000000);//读取TMC6200所有寄存器的值,应该不为0,也不全是FF TMC6200_Reg.GSTAT = SPI2_Send_5Bytes(0x0100000000); TMC6200_Reg.IOIN =SPI2_Send_5Bytes(0x0400000000); TMC6200_Reg.OTP_PROG =SPI2_Send_5Bytes(0x0600000000); TMC6200_Reg.OTP_READ =SPI2_Send_5Bytes(0x0700000000); TMC6200_Reg.FACTORY_CONF =SPI2_Send_5Bytes(0x0800000000); TMC6200_Reg.SHORT_CONF =SPI2_Send_5Bytes(0x0900000000); TMC6200_Reg.DRV_CONF =SPI2_Send_5Bytes(0x0a00000000);