tag 标签: 移植到

相关博文
  • 热度 1
    2024-8-31 06:49
    142 次阅读|
    0 个评论
    1. 前言 对于使用 GD32 系列微控制器进行产品开发的设计人员来说,因产品及功能升级,往往需要将一种 微控制器替换成另一种微控制器,在保留既有功能的情况下增加新功能。为了更快地推出新产品, 设计人员经常要将应用程序移植到新的微控制器。 本应用笔记旨在帮助您快速将应用程序从 GD32F10x 系列微控制器移植到 GD32F30x 系列微控制 器。 为了更好的利用本应用笔记中的信息,您需要对 GD32 系列微控制器有比较深刻的了解。您可在兆 易创新资料网站 gd32mcu.21ic.com 或网盘 https://pan.baidu.com/s/1mhQsNpu 下载 GD32 各系列 微控制器资料,如 Datasheet 、用户手册、官方例程及各种开发工具等。 2. 引脚兼容性 GD32F10x 与 GD32F30x 在相同封装下是 Pin To Pin 兼容的。但由于 GD32F30x 较 GD32F10x 增 加了内部 48MHz RC 振荡器给 USBD 模块提供固定频率,为满足精度要求, GD32F30x 含有一个 时钟校准控制器 (CTC) ,所以两者引脚定义有细微差别,如下表所示: 表 1 GD32F10x 系列和 GD32F30x 系列引脚区别 3. 内部资源兼容性 下表给出了 GD32F10x 与 GD32F30x 的资源对比总览(以 GD32F103xE 和 GD32F303xE 对比为 例 ) : 表 2 GD32F10x 系列和 GD32F30x 系列内部资源对比总览 4. 程序移植 由上节可看出,GD32F10x 和 GD32F30x 的主要差异性在于主频(RCU 系统时钟)、内核版本和 CTC 上,而 M4 内核是向下兼容 M3 的,所以无需修改,现就 RCU 方面阐述程序移植过程。 4.1 RCU 系统时钟配置 GD32F10x 系列和 GD32F30x 系列的时钟配置过程相同,但 GD32F30x 支持更高的系统时钟。若 用户选择继续使用原有的时钟频率,则在应用程序中无需做任何改变;若用户选择使用更高的时钟 频率,按以下步骤进行程序修改 ( 以 GD32F103 移植到 GD32F303 、使用外部 8MHz 高速晶振 HXTAL 为例,其他对应型号、使用内部晶振的移植过程类似 ) : (1) 在 system_gd32f10x.c 文件中增加宏定义: # define __SYSTEM_CLOCK_120M_PLL_HXTAL (uint32_t)(120000000) 如图 1 所示: 图 1 在 system_gd32f10x.c 文件中增加宏定义 (2) 在 system_gd32f10x.c 文件中增加使用 120MHz 频率函数的声明,如图 2 所示: 图 2 120MHz 函数声明 (3) 在 system_gd32f10x.c 文件中增加使用 120MHz 频率函数的定义: staticvoidsystem_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 */ d o{ timeout++; stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); } while ((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); /* if fail */ i f(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ while ( 1 ){ } } /* 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(GD32F10X_MD) || defined(GD32F10X_HD) || defined(GD32F10X_XD)) / * select HXTAL/ 2 as clock source * / RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0); RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_CFG0_PREDV0); / * CK_PLL = (CK_HXTAL/ 2 ) * 30 = 120 MHz * / RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); RCU_CFG0 |= RCU_PLL_MUL30; #elif defined(GD32F10X_CL) / * CK_PLL = (CK_PREDIV0) * 30 = 120MHz * / RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL30); / * CK_PREDIV0 = (CK_HXTAL)/ 5 * 8 / 10 = 4 MHz * / RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 |RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); / * enable PLL1 * / RCU_CTL |= RCU_CTL_PLL1EN; / * wait till PLL1 is ready * / while(0U == (RCU_CTL & RCU_CTL_PLL1STB)){ }#endif / * GD32F10X_MD and GD32F10X_HD and GD32F10X_XD * / / * enable PLL * / RCU_CTL |= RCU_CTL_PLLEN; / * wait until PLL is stable * / while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ } / * select PLL as system clock * / RCU_CFG0 &= ~RCU_CFG0_SCS; RCU_CFG0 |= RCU_CKSYSSRC_PLL; / * wait until PLL is selected as system clock */ while (0U == (RCU_CFG0 & RCU_SCSS_PLL)){ }} (4) 在 system_gd32f10x.c 文件中增加使用 120MHz 频率函数的调用,如图 3 所示: 5. 外设差异性 GD32F10x 与 GD32F30x 在外设上都是兼容的,但 GD32F30x 作为更高级的 MCU,较 GD32F10x 在很多外设上增加了部分功能,用户可根据以下罗列出的外设差异性选择是否使用这些功能。 5.1 通用和备用输入/输出接口(GPIO 和 AFIO) I/O 端口在作为输出使用时,GD32F30x 可将 IO 的速度设置为 120MHz(GD32F10x 最大 50MHz), 当 I/O 端口输出速度大于 50MHz 时,建议使用 I/O 补偿单元对 I/O 端口进行斜率控制,从而降低 I/O 端口噪声对电源的影响。具体功能以及寄存器设置,请用户参考 GD32F30x 用户手册。 5.2 模数转换器 ADC 为减轻 CPU 的负担,GD32F30x 较 GD32F10x 增加了片上硬件过采样单元。它能够处理多个转换, 并将多个转换的结果取平均,得出一个 16 位宽的数据。 片上硬件过采样单元是以降低数据输出 率为代价,换取较高的数据分辨率。 具体功能以及寄存器设置,请用户参考 GD32F30x 用户手册。 5.3 通用同步异步收发器 USART GD32F30x 较 GD32F10x 在 USART 上增加了块模式(GD32F10x 只支持字节模式)、数据极性设置、 数据位反转以及 TX 、 RX 引脚电平反转等功能,因此, GD32F30x 多了三个寄存器,分别为: USART_CTL3 、 USART_RT 、 USART_STAT1 。具体功能以及寄存器设置,请用户参考 GD32F30x 用户手册。 5.4 内部集成电路总线接口 I²C GD32F30x 和 GD32F10x 的 I²C 都支持标速(最高 100KHz)和快速(最高 400KHz),同时 GD32F30x 可支持高速模式 ( 最高 1MHz) ,要使能高速模式,需将 I2C_FMPCFG 寄存器的 FMPEN 置 1 。具 体功能以及寄存器设置,请用户参考 GD32F30x 用户手册。 5.5 串行外设接口/片上音频接口 SPI/I²S GD32F30x 和 GD32F10x 的 SPI/I²S 模块差异性主要表现在 GD32F30x 支持 SPI TI 模式、SPI NSS 脉冲模式和 SPI 四线功能 ( 只有 SPI0) ,其中 SPI 的四线模式是用于控制四线 SPI Flash 外设,此模 式下,数据传输速率是普通模式下的 4 倍。具体功能以及寄存器设置,请用户参考 GD32F30x 用 户手册。 5.6 通用串行总线全速设备接口 USBD GD32F30x 较 GD32F10x 在 USBD 外设中增加了 USB2.0 链接电源管理(LPM)等级 L1,目的是为 了优化在挂起 / 恢复状态下的电源消耗。 LPM 包括从 L0 到 L3 共 4 种状态。 LPM L1 状态(睡眠状 态) 是新的电源管理状态。具体功能以及寄存器设置,请用户参考 GD32F30x 用户手册。 5.7 闪存控制器 FMC GD32F30x 较 GD32F10x 增加了位编程功能,为用户节省一定的 Flash 空间。其特点是,存储在 闪存中的数据,其值为“ 1 ”的 bit 位可以改写为“ 0 ”,而不影响其它位。例如,地址 0x0800 0400 存储的数据为 0x5a5a 5a5a ,使用位编程功能,可直接将此地址的数据写为 0x0a0a 0a0a ,而不需 要先把该地址的数据擦除,然后写 0x0a0a 0a0a 。 请注意,位编程功能不能将值为“0”的 bit 位写“1”,如上面的例子,将 0x0800 0400 地址写为 0xfafa fafa ,将不会成功。 关于 FMC 中位编程具体功能以及寄存器设置,请用户参考 GD32F30x 用户手册。