完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近做了从STM32F103到STM32F407的程序移植工作。在做这项工作之前发现网上没有太全面的移植攻略,因而确实费了一番功夫和走了一些弯路。现在程序移植工作基本做完,趁着还能记起来遇到的问题,把程序移植需要注意的点整理在这里,希望对以后做这个工作的朋友能有些帮助。
虽然我做的是F407的移植,但是大部分内容对于F40xx_41xx,乃至F4其他系列的芯片都适用。 一、硬件兼容改造 先说一下硬件吧,两种芯片的大部分引脚是相同的,需要改动部分电源引脚。官方的芯片数据手册上给出了兼容版的设计图,以100引脚的为例: 其中19引脚从VSS改成VDD,49和73引脚分别从接VSS改成接电容,电容值为2.2uF。 二、系统时钟设置 F407的外部高速时钟的宏定义在system_stm32f4xx.c中。 #define HSE_BYPASS_INPUT_FREQUENCY 8000000 其中8000000代表外部时钟选用8M晶振,此处需对应实际情况修改。 时钟设置在函数SetSysClock()中进行设置,关键语句为: RCC-》PLLCFGR = PLL_M | (PLL_N 《《 6) | (((PLL_P 》》 1)-1) 《《 16) |(RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q 《《 24); 主时钟PLL的值等为:PLL=M*N/(M*P),对应需求进行修改。 三、外设时钟使能 F407的外设时钟使能的函数和F103的相同,但是外设对应的外设时钟的映射关系发生了改变。具体的映射关系在文件stm32f4xx.h中有宏定义。 例如:在F103中GPIOA的外设时钟使能语句为: RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE ); 在F407中,在stm32f4xx.h查找GPIOA,可以查到宏定义: #define RCC_AHB1Periph_GPIOA ((uint32_t)0x00000001) 因而该使能语句可以改为: RCC_AHB1PeriphClockCmd ( RCC_AHB1Periph_GPIOA, ENABLE ); 四、GPIO端口初始化 在F103中,GPIO_InitTypeDef结构体为: typedef struct { uint16_t GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed; GPIOMode_TypeDef GPIO_Mode; }GPIO_InitTypeDef; 在F407中,该结构体为: typedef struct { uint32_t GPIO_Pin; GPIOMode_TypeDef GPIO_Mode; GPIOSpeed_TypeDef GPIO_Speed; GPIOOType_TypeDef GPIO_OType; GPIOPuPd_TypeDef GPIO_PuPd; }GPIO_InitTypeDef; F103中的GPIO_Mode在F407中被拆解成了三个参数:GPIO_Mode、GPIO_OType和GPIO_PuPd。其中GPIO_Mode有输入、输出、复用和模拟四种模式可选,GPIO_OType选择推挽和开漏,GPIO_PuPd选择上拉、下拉和浮空。 五、DMA设置 F407中DMA的Channel统一换成了Stream与Channel组合的形式。DMA的初始化结构体DMA_InitTypeDef中多出了参数DMA_InitStructure.DDMA_Channel。不同外设请求对应的数据流和通道在官方参考手册中有明确的示例。DMA1和DMA2的请求映射如下: 另外还有一个小改动,在F103中DMA_Channel_TypeDef结构体中的元素为: typedef struct { __IO uint32_t CCR; __IO uint32_t CNDTR; __IO uint32_t CPAR; __IO uint32_t CMAR; } DMA_Channel_TypeDef; 对应在F407中的DMA_Stream_TypeDef为: typedef struct { __IO uint32_t CR; __IO uint32_t NDTR; __IO uint32_t PAR; __IO uint32_t M0AR; __IO uint32_t M1AR; __IO uint32_t FCR; } DMA_Stream_TypeDef; 在调用到该结构体中参数时需要注意。 六、重映射 在F407中不存在重映射(REMAP)的概念了,取而代之的是引脚的复用映射(AF)。而相比于F103的重映射,引脚复用功能更加灵活和全面。引脚复用时是对单独引脚进行配置。例如对USART2的PA2和PA3的复用设置指令为: GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2); GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2); Mr.括号我直接把复用映射表列出来,方便大家查询: 七、其他 用BSRRH代替了BRR 用BSRRL代替了BSRR 目前想到的就是上述这些,如果还有其他没提及的欢迎补充,如有纰漏敬请指正! |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
936 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
829 浏览 1 评论
450 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
354 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
789 浏览 2 评论
1502浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
180浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
208浏览 3评论
186浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
187浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-7-19 04:30 , Processed in 0.563279 second(s), Total 44, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号