本帖最后由 a976209770 于 2023-5-31 15:00 编辑
GXX32303和APM32E103均兼容SXX103系列,两者在兼容性上有所不同,APM系列相对兼容性更佳,GXX略有差异。 部分工程如之前用GXX的库进行开发的项目,选用APM后需要在以下部分进行修改:
1.由于SXX以及APM的flash特性,均需要插入flash等待周期,GXX无此寄存器,库中未定义,所以需要通过基地址方式写入等待周期,以下为关系:主频0-24M 0
主频24-48M 1
主频48-72M 2
主频72-96M 3
主频96-128M 4
无法贴出图片,可查找对应的函数添加(*((volatile uint32_t *)0x40022000)) = 0x14;到对应地方
static void system_clock_120m_hxtal(void)
{
uint32_t timeout = 0U;
uint32_t stab_flag = 0U;
/* enable HXTAL */
RCU_CTL |= RCU_CTL_HXTALEN;
/* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */
do{
timeout++;
stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB);
}while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout));
/* if fail */
if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){
while(1){
}
}
(*((volatile uint32_t *)0x40022000)) = 0x14;
RCU_APB1EN |= RCU_APB1EN_PMUEN;
PMU_CTL |= PMU_CTL_LDOVS;
//RCU_CFG1 &= ~(1 << 30); // 将 RCU_CFG1 寄存器的 bit30 置为 0
/* HXTAL is stable */
/* AHB = SYSCLK */
RCU_CFG0 |= RCU_AHB_CKSYS_DIV1;
/* APB2 = AHB/1 */
RCU_CFG0 |= RCU_APB2_CKAHB_DIV1;
/* APB1 = AHB/2 */
RCU_CFG0 |= RCU_APB1_CKAHB_DIV2;
#if (defined(GD32F30X_HD) || defined(GD32F30X_XD))
/* select HXTAL/2 as clock source */
RCU_CFG0 &= ~(RCU_CFG0_PLLSEL );
RCU_CFG0 |= (RCU_PLLSRC_HXTAL_IRC48M );
2.SXX以及APM的io功能相同,不区分高驱低驱等,部分代码需要屏蔽。
// /* enable the high-drive to extend the clock frequency to 120 MHz */
// PMU_CTL |= PMU_CTL_HDEN;
// while(0U == (PMU_CS & PMU_CS_HDRF)){
// }
// /* select the high-drive mode */
// PMU_CTL |= PMU_CTL_HDS;
// while(0U == (PMU_CS & PMU_CS_HDSRF)){
// }
其他部分GXX与SXX差异修改后与之前兼容, 故可忽略。
经修改后使用apm32E103的芯片可正常使用仿真。
|