STM32 REG设置注意延时

本文介绍了TIMx寄存器中EGR的使用方法,包括如何通过置位LSBUG来触发更新中断及注意事项。此外,还提到了在配置GPIO时进行IDR读回操作所需的延时细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、TIMx->EGR |= 1;EGR的LSB UG置位,将重新初始化ARR,并触发一次更新中断,

       所以在扩展TIM为32Bit时,需特别注意,操作完之后需即时Clear;->TIM_ClearITPendingBit(TIMx,TIM_IT_Update);

如果需测试该效果,务必在置位后,进行小的延时,才能看到触发效果,此时查看的PendingBit才是置位态;


2、在GPIO设置时,如果需要立即读回IDR等操作,同样需要小的delay (uS);

<think>我们正在处理一个关于微控制器代码移植的问题:将GD32F103的代码移植到STM32F103。GD32STM32都是基于ARMCortex-M3内核的微控制器,它们在硬件设计和外设上有很多相似之处,但也存在一些差异。因此,移植代码时需要注意这些差异。根据用户的问题,他需要教程或指南。我们可以参考已有的知识,特别是引用中提到的资源。虽然引用[1]是关于从标准外设库迁移到STM32Cube低层库的,但其中可能包含一些通用的移植思想。引用[2]提到了STM32CubeIDE,它是一个集成开发环境,可以帮助生成STM32的初始化代码,这可能对移植有帮助。引用[3]则涉及到Qemu模拟STM32F103,这可能不是直接相关,但我们可以忽略。引用[4]是一个Flyway迁移错误,与当前问题无关。因此,我们主要参考引用[1]和[2]来提供指导。步骤:1.**了解差异**:首先需要了解GD32F103和STM32F103之间的差异。主要差异可能包括:-时钟系统:GD32的主频通常比STM32高(GD32F103可达108MHz,而STM32F103为72MHz),且GD32的时钟树配可能与STM32不同。-外设:虽然外设相似(如GPIO、USART、SPI、I2C、ADC等),但寄存器定义和某些行为可能有细微差别。-启动时间:GD32的启动时间可能更短。-Flash访问:GD32的Flash访问需要等待状态的不同设置。-供电:供电电压范围可能略有不同。2.**硬件抽象层**:如果原代码使用了硬件抽象层(HAL)或标准外设库(SPL),那么移植工作会相对简单。否则,需要手动调整寄存器操作。3.**使用STM32CubeMX/IDE**:使用STM32CubeIDE(引用[2])可以生成STM32F103的初始化代码。用户可以将GD32的应用程序代码移植到生成的框架上。4.**具体移植步骤**:-**时钟配**:修改系统时钟初始化代码,确保时钟配符合STM32F103的特性(例如,最大72MHz)。-**外设初始化**:检查并修改外设初始化代码,特别是GPIO、USART等外设的配,因为它们的寄存器定义可能不同。-**中断向量表**:确保中断向量表指向正确的地址。STM32F103的中断向量表可能于不同的地址,且中断服务函数的名称可能不同(但通常可以保持一致)。-**Flash编程**:如果涉及内部Flash操作,需要修改等待周期和编程序列。-**延时函数**:由于时钟频率不同,需要调整基于系统时钟的延时函数。-**外设驱动**:检查所有外设驱动(如SPI、I2C、ADC)的时序,因为GD32STM32的外设时序可能不同。5.**调试**:使用调试工具(如ST-Link)逐步调试,确保每个外设工作正常。6.**参考文档**:-STM32F103参考手册(RM0008)和GD32F103的数据手册,对比寄存器。-引用[1]中提到的迁移指南,虽然是从SPL到LL,但其中关于外设配的对比思想可以借鉴。由于用户要求生成相关问题,我们在回答后生成几个相关问题。现在,我们按照要求组织回答:</think>### GD32F103 到 STM32F103 代码移植指南 #### **一、核心差异分析** 1. **时钟系统差异** - GD32F103 主频可达 108MHz,STM32F103 最高 72MHz - GD32 的 PLL 配公式:$f_{PLL} = \frac{f_{input} \times PLL\_mul}{PLL\_div}$ STM32 需调整为:$f_{PLL} = f_{input} \times \frac{PLL\_mul}{PLL\_div}$ - **关键修改**:重写时钟初始化函数(如 `system_gd32f10x.c` → `system_stm32f10x.c`) 2. **外设寄存器差异** | 外设 | GD32 特性 | STM32 适配方案 | |------------|----------------------------|------------------------------| | GPIO | 驱动能力更强 | 降低输出电流配 | | ADC | 采样时间单不同 | 调整 `ADC_SampleTime` 参数 | | Flash 等待 | 0等待@≤72MHz | 必须设置 2 等待周期@72MHz | | USART | 波特率计算误差更小 | 重新校准波特率寄存器值 | 3. **中断向量表偏移** GD32 默认偏移地址 0x08000000,STM32 需在启动文件设置: ```c __Vectors DCD __initial_sp ; Top of Stack DCD Reset_Handler ; Reset Handler DCD NMI_Handler ; NMI Handler ... /* 其他中断向量 */ ``` #### **二、移植步骤** 1. **工程框架迁移** - 使用 STM32CubeIDE 创建新工程(参考引用[2]) - 替换为 STM32 标准库/HAL 库([官方迁移指南 AN5044](https://www.st.com/resource/en/application_note/an5044-stm32-standard-peripheral-library-to-stm32cube-lowlayer-migration-stmicroelectronics.pdf)) 2. **时钟配修改** ```c // STM32 时钟配示例 (system_stm32f10x.c) #define SYSCLK_FREQ_72MHz 72000000 void SystemInit(void) { RCC->CFGR |= RCC_CFGR_PLLMULL9; // 8MHz x 9 = 72MHz RCC->CFGR |= RCC_CFGR_PPRE1_DIV2; // APB1 分频 } ``` 3. **外设驱动适配** **ADC 修改示例**: ```c // GD32 采样时间 55.5 周期 → STM32 改为 41.5 周期 ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_41Cycles5); ``` 4. **Flash 等待周期设置** ```c FLASH->ACR |= FLASH_ACR_LATENCY_2; // 72MHz 必须配 ``` 5. **中断处理兼容** - 保留相同的中断服务函数名(如 `USART1_IRQHandler`) - 检查 NVIC 优先级分组:`NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);` #### **三、调试与验证** 1. **常见问题排查** - 时钟不工作:检查 HSE 启动时间(GD32 通常更快) - 通信失败:用示波器对比 USART 波形时序 - HardFault:检查堆栈大小(STM32 默认堆栈更小) 2. **工具链配** - 在 `Makefile`/`IDE` 中替换链接脚本:`gd32f103.ld` → `stm32f103c8tx_flash.ld` - 更新设备宏定义:`-DGD32F10X_HD` → `-DSTM32F10X_HD` #### **四、最佳实践** 1. **抽象硬件层** 创建硬件抽象层(HAL)隔离差异: ```c // hal_uart.h #ifdef USE_GD32 #define UART_REG USART_STAT #else // STM32 #define UART_REG USART_SR #endif ``` 2. **利用 QEMU 仿真** 使用 `CONFIG_STM32F103_ST_OPENMCU`(引用[3])进行虚拟验证 > **移植耗时参考**:简单项目约 1-3 天,复杂外设项目需 1-2 周。建议优先验证定时器、GPIO、USART 等核心功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值