本项目详细介绍了如何将基于STM32F103RCT6平台的HAL库及RTOS操作系统代码移植至GD32F103RCT6平台,为开发者提供了一套完整的迁移方案与技术指导。
### STM32F103RCT6程序移植至GD32F103RCT6(HAL+RTOS)
#### 概述
随着国际形势的变化以及供应链成本的上升,很多开发团队开始考虑采用性价比更高的替代方案来替换原有的解决方案。本段落将详细介绍如何将基于STM32F103RCT6的程序移植到GD32F103RCT6,并同时使用HAL(硬件抽象层)和RTOS。虽然两种芯片的功能和特性较为相似,但仍然存在一些关键性的不同之处需要进行相应的调整。
#### 频率调整
STM32F103RCT6支持的最大工作频率为72MHz,而GD32F103RCT6则支持高达108MHz的工作频率。这一差异意味着在移植过程中需要调整时钟配置,特别是针对HSE(外部高速时钟)的启动超时时间。在`stm32f1xx_hal_conf.h`文件中,原设置为100毫秒的HSE启动超时时间可能不足以确保GD32F103RCT6正确启动。因此,将此值设置为一个较大的数值(例如0xFFFF),以确保芯片有足够的时间完成启动过程。
**修改前:**
```c
#define HSE_STARTUP_TIMEOUT ((uint32_t)100)
```
**修改后:**
```c
#define HSE_STARTUP_TIMEOUT ((uint32_t)0xFFFF)
```
#### CAN通信调整
在移植过程中,CAN模块的初始化问题尤为棘手。两个芯片在CAN初始化寄存器方面存在差异,导致初始化错误。具体来说,问题在于`CAN_MCR_SLEEP` 和 `INRQ` 位没有被正确设置,从而导致了初始化失败。解决方法是在初始化前将这两个位清零。
**修改前:**
```c
* Exit from sleep mode *
CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP);
* Request initialisation *
SET_BIT(hcan->Instance->MCR, CAN_MCR_INRQ);
```
**修改后:**
```c
* Request initialisation *
SET_BIT(hcan->Instance->MCR, CAN_MCR_INRQ);
* Exit from sleep mode *
CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP);
```
#### 内存地址配置
在某些特定的应用场景下,如IAP+APP程序模式,内存地址的配置至关重要。移植过程中需要注意的是,Xtal(晶振)频率应设置为8.0 MHz。此外,还需要根据实际情况正确配置IROM1和IRAM1。
#### FLASH解锁调整
对于FLASH的操作,两个芯片之间也存在一定的差异。GD32F103RCT6在解锁FLASH时需要额外插入两行代码(`__NOP()`),以确保正确的解锁流程。
**修改前:**
```c
HAL_StatusTypeDef HAL_FLASH_Unlock(void)
{
// 详细操作步骤...
}
```
**修改后:**
```c
HAL_StatusTypeDef HAL_FLASH_Unlock(void)
{
// 详细操作步骤,插入 __NOP()
}
#### 总结
以上四个关键点是STM32F103RCT6程序移植到GD32F103RCT6过程中需要重点关注的部分。通过适当的调整,可以确保程序在新平台上能够顺利运行。需要注意的是,在移植过程中还应当对程序的整体结构和代码质量进行审查,确保没有引入新的问题或缺陷。此外,在实际移植过程中还需检查其他外设(如UART、IIC、SPI等)是否需要进一步调整。