stm32f105 spi 移植到stm32f103上

本文详细介绍了如何将STM32F100系列的程序移植至STM32F103版本,并着重讨论了在移植过程中涉及到的时钟配置调整、JLINK接口复用问题,以及如何通过SWD模式进行正常下载操作。

最近移植dw1000的程序,把stm32f105版本移植到103版本上去。

(1)发现两者的区别主要在于时钟上,具体请参考stm32 datasheet:
这里写图片描述
将始终改掉之后,SPI就可以运行stm32f103上了。

(2)PA15和PB3默认是用于JLINK的,需要启用复用时钟,代码如下:
RCC_APB2PeriphClockCmd(
RCC_APB2Periph_GPIOA ,ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);
  GPIO_ResetBits(GPIOA, GPIO_Pin_15);

同时使用SWD模式下载,才能使PA15和PB3作为普通的IO口使用。

<think>嗯,用户现在想知道如何将STM32F105的工程移植STM32F103上需要注意什么。我之前回答过GD32F305到GD32F303的移植问题,但这次是STM32的不同型号,我需要参考用户提供的引用内容以及自己的知识来组织答案。 首先,用户提供的引用[1]和[2]提到了STM32F103F105之间的移植问题,尤其是时钟配置和启动文件的更换。引用中提到,F105用了8M晶振,而原工程可能配置的是25M,导致时钟错误。还有提到需要修改系统宏定义和启动文件,因为F105属于互联网型,而F103是基础型,可能存在外设差异。 接下来,我需要考虑这两个型号的具体差异。比如,F105属于互联型(Connectivity line),有更多外设,比如以太网、USB OTG等,而F103是基础型,没有这些功能。所以移植时需要检查工程中是否用到了F105特有的外设,如果有的话,可能需要删除或替换相关代码。 然后,时钟系统也是重点。F105的时钟树可能更复杂,支持更高的主频,而F103的最高主频是72MHz。用户提到需要修改HSE_VALUE的定义,从25M改为8M,这说明在系统头文件中的晶振配置必须与实际硬件匹配,否则时钟相关的外设(如UART、定时器等)都会出问题。 启动文件的不同也是一个关键点。不同的STM32型号需要不同的启动文件,比如startup_stm32f103xe.s和startup_stm32f105xc.s。如果启动文件不正确,可能导致堆栈初始化错误或中断向量表错位,进而程序无法正常运行。 此外,外设库的兼容性需要注意。虽然ST的标准外设库(SPL)在不同型号间有一定兼容性,但具体到某些寄存器或函数可能会有差异。例如,F105的某些外设配置寄存器在F103中可能不存在,需要调整代码以避免访问这些寄存器。 中断向量表的位置和中断服务函数的名称可能不同,需要检查启动文件和链接脚本中的定义是否正确。比如,USB中断在F105和F103中的处理方式可能不同,需要相应调整。 还有,用户可能需要修改链接脚本,特别是Flash和RAM的地址和大小,因为F105和F103的内存容量可能不同。如果原工程使用了超出F103可用内存的部分,会导致编译失败或运行时错误。 另外,用户提到的案例中,直接使用F103工程在F105上运行可能可以工作,但反过来可能会有问题,因为F103不支持F105的某些功能。这时候需要确保工程中没有调用F105特有的函数或配置。 总结下来,移植注意事项应包括:时钟配置、启动文件更换、外设库调整、中断处理、内存地址修改、特有外设处理以及系统宏定义的更改。此外,验证步骤也很重要,比如用示波器检查时钟信号,逐步测试各外设功能,确保移植后的稳定性。</think>将STM32F105工程移植STM32F103时需重点关注以下差异及操作要点: --- ### 一、核心硬件差异对比 1. **时钟系统配置** - **HSE晶振差异**:STM32F105默认可能使用25MHz外部晶振,而STM32F103通常使用8MHz[^1]。需修改`system_stm32f10x.c`中的`HSE_VALUE`定义: ```c // STM32F105可能配置为25MHz #define HSE_VALUE ((uint32_t)25000000) // STM32F103需改为实际晶振频率(如8MHz) #define HSE_VALUE ((uint32_t)8000000) ``` - **主频限制**:F103最高主频72MHz,F105可达72MHz(互联型需注意PLL分频配置差异) 2. **存储器差异** - Flash/RAM容量需匹配目标芯片型号(如F103C8T6仅64KB Flash/20KB RAM) - **必须修改链接脚本**(.ld/.sct文件),避免地址越界 --- ### 二、外设与库兼容性 1. **外设模块差异** - **删除互联型外设代码**:F105特有的以太网(ETH)、USB OTG等外设需移除或条件编译 - **GPIO复用功能差异**:部分引脚复用映射不同(如CAN、USB引脚),需重新验证`GPIO_Init`配置 2. **标准外设库调整** - 替换为STM32F10x标准库(互联型库与基础型库不兼容) - 修改设备宏定义: ```c // F105可能使用 #define STM32F10X_CL // F103需改为 #define STM32F10X_HD // 根据具体型号选择HD/MD等 ``` --- ### 三、关键移植步骤 1. **启动文件更换** - 使用F103对应的启动文件(如`startup_stm32f10x_hd.s`) - 检查中断向量表偏移量(F103向量表起始地址为0x08000000) 2. **时钟树重构** - 重新配置RCC寄存器,尤其是PLL参数: ```c // F105可能的配置(基于25MHz HSE) RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); // 25MHz*9=225MHz(需分频) // F103典型配置(8MHz HSE→72MHz) RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); // 8MHz*9=72MHz ``` - 使用`SystemCoreClockUpdate()`更新全局时钟变量 3. **中断服务函数调整** - 检查中断向量名称差异(如F105的`OTG_FS_IRQHandler`在F103中不存在) - 修改`stm32f10x_it.c`中未使用的中断服务函数 --- ### 四、移植验证与调试 1. **基础功能验证** - **时钟检测**:通过`RCC_GetClocksFreq()`读取时钟频率,或测量MCO引脚输出 - **GPIO测试**:实现LED闪烁验证基本时序(若闪烁周期异常,优先检查时钟配置) 2. **外设逐项排查** | 外设类型 | 重点检查项 | |---------------|---------------------------| | USART | 波特率计算(依赖系统时钟) | | SPI/I2C | 时序配置与时钟分频 | | ADC | 采样周期与时钟源(ADCCLK) | | 定时器 | 自动重装载值计算 | 3. **资源限制处理** - 若原工程使用F105的大容量Flash/RAM,移植到F103时需优化代码体积(如启用编译器优化-O2) - 使用`arm-none-eabi-size`工具分析内存占用 --- ### 五、常见问题与解决方案 | 现象 | 可能原因 | 解决方法 | |---------------------|-------------------------|----------------------------------| | 程序卡死在启动阶段 | 堆栈初始化错误(启动文件不匹配) | 更换正确密度的启动文件(LD/MD/HD) | | 外设无响应 | 时钟未使能 | 检查`RCC_APBxPeriphClockCmd()`调用 | | 通信波特率错误 | HSE_VALUE定义与实际晶振不符 | 用示波器测量HSE引脚频率并校正定义 | | HardFault异常 | 内存访问越界 | 检查链接脚本的Flash/RAM区域定义 | --- ### 六、引用差异说明 根据用户提供的参考案例[^1][^2],需特别注意: - **时钟配置陷阱**:直接使用未修改的F105工程可能导致时钟频率翻倍(如8MHz晶振误配为25MHz),引发定时器/USART等外设严重偏差 - **启动文件必要性**:互联型(F105)与基础型(F103)的中断向量表结构不同,混用会导致不可预测行为[^2] ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值