你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103至STM32F407程序移植参考

[复制链接]
攻城狮Melo 发布时间:2022-11-7 22:58
最近做了从STM32F103到STM32F407的程序移植工作。在做这项工作之前发现网上没有太全面的移植攻略,因而确实费了一番功夫和走了一些弯路。现在程序移植工作基本做完,趁着还能记起来遇到的问题,把程序移植需要注意的点整理在这里,希望对以后做这个工作的朋友能有些帮助。
虽然我做的是F407的移植,但是大部分内容对于F40xx_41xx,乃至F4其他系列的芯片都适用。
文章如要转载请私信与我联系,并注明作者Mr.括号。

/ F7 V. S' A( w4 B
一、硬件兼容改造
先说一下硬件吧,两种芯片的大部分引脚是相同的,需要改动部分电源引脚。官方的芯片数据手册上给出了兼容版的设计图,以100引脚的为例:
7 Z' V: u) R. Q) i3 C9 M
v2-a7c322002e96185dfc5782724fdbf779_b.png
( O1 _1 [. [: Y  L+ T. X
其中19引脚从VSS改成VDD,49和73引脚分别从接VSS改成接电容,电容值为2.2uF。
5 ~# H2 H; l1 F" T# k# O7 D
  b- d1 {. e+ c
二、系统时钟设置
F407的外部高速时钟的宏定义在system_stm32f4xx.c中。
6 ]7 Y* E0 ?: |9 _, i+ W4 _5 y
  1. #define HSE_BYPASS_INPUT_FREQUENCY   8000000
复制代码
1 F0 F, Y/ K# S) B1 B, n
其中8000000代表外部时钟选用8M晶振,此处需对应实际情况修改。
时钟设置在函数SetSysClock()中进行设置,关键语句为:
0 D" L- k3 A0 K- y
  1. RCC->PLLCFGR = PLL_M | (PLL_N << <font color="rgb(152, 104, 1)"><font face="" "="">6</font></font>) | (((PLL_P >> <font color="rgb(152, 104, 1)"><font face="" "="">1</font></font>)<font color="rgb(152, 104, 1)"><font face="" "="">-1</font></font>) << <font color="rgb(152, 104, 1)"><font face="" "="">16</font></font>) |(RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << <font color="rgb(152, 104, 1)"><font face="" "="">24</font></font>);
复制代码

- p1 E0 j3 M/ u, f. S% T
主时钟PLL的值等为:PLL=M*N/(M*P),对应需求进行修改。

: r# w, S' W+ F( ]+ K

2 d" C% A( R- K
三、外设时钟使能
F407的外设时钟使能的函数和F103的相同,但是外设对应的外设时钟的映射关系发生了改变。具体的映射关系在文件stm32f4xx.h中有宏定义。
例如:在F103中GPIOA的外设时钟使能语句为:
  1. RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );
复制代码
. U2 O" T  }0 k8 p$ l. }
在F407中,在stm32f4xx.h查找GPIOA,可以查到宏定义:
  1. #define RCC_AHB1Periph_GPIOA ((uint32_t)0x00000001)
复制代码
* ^' q- S+ @- R& d% u7 h
因而该使能语句可以改为:
  1. RCC_AHB1PeriphClockCmd ( RCC_AHB1Periph_GPIOA, ENABLE );
复制代码
% Y  C/ H, {8 p, K

: K: m: T* A1 {1 g. B1 M
四、GPIO端口初始化
在F103中,GPIO_InitTypeDef结构体为:
  1. typedef struct
    - g8 C! y+ T6 [9 L1 z1 p& B
  2. {
    $ q2 b6 G+ G9 T, i, F; b
  3.   uint16_t GPIO_Pin;        2 E& v' P1 K7 {& @4 |; ?
  4.   GPIOSpeed_TypeDef  GPIO_Speed;
    ) m, Z6 d- s% L
  5.   GPIOMode_TypeDef   GPIO_Mode;  
    / Q. m4 s) ?  V4 u, W6 P
  6. }GPIO_InitTypeDef;
复制代码
' f) e7 v/ j# b, a, P/ t9 A  t$ t
在F407中,该结构体为:
  1. typedef struct
    2 y) c. x% p' T5 l
  2. {  O5 \" R  r& G' }
  3.   uint32_t GPIO_Pin;          . [) M; M9 N! n- R
  4.   GPIOMode_TypeDef  GPIO_Mode;   
    ; b' D- @. H" ^" `$ @
  5.   GPIOSpeed_TypeDef GPIO_Speed;   # W3 A8 D0 O% [
  6.   GPIOOType_TypeDef GPIO_OType;  
    ) _! @0 i4 e* X' g4 @
  7.   GPIOPuPd_TypeDef  GPIO_PuPd;    . ^2 I/ A: Q3 B# h; ?9 r& g
  8. }GPIO_InitTypeDef;
复制代码

7 L) H; F& Q2 D/ G
F103中的GPIO_Mode在F407中被拆解成了三个参数:GPIO_Mode、GPIO_OType和GPIO_PuPd。其中GPIO_Mode有输入、输出、复用和模拟四种模式可选,GPIO_OType选择推挽和开漏,GPIO_PuPd选择上拉、下拉和浮空。

; X7 C4 G+ \$ j
- _; H: I. ?: f( a; O% y
五、DMA设置
F407中DMA的Channel统一换成了Stream与Channel组合的形式。DMA的初始化结构体DMA_InitTypeDef中多出了参数DMA_InitStructure.DDMA_Channel。不同外设请求对应的数据流和通道在官方参考手册中有明确的示例。DMA1和DMA2的请求映射如下:

- ~7 P, I6 K+ G
v2-b0219bbf80f4d668aee77a2e7da2a89e_b.png
  r! ~, Q7 g& _' K' w0 v1 u; o; R
+ C1 l8 N" o4 y* N1 n, A v2-c9239b3dd2b512bc059acb4bb8057c32_b.png
2 G; _$ a& b5 m- b( T/ e9 k
" F$ t1 s, P% x4 p8 O" O
另外还有一个小改动,在F103中DMA_Channel_TypeDef结构体中的元素为:
  1. typedef struct% ?/ _6 H, m+ T& F% C( L( o% U9 Z3 I
  2. {
    ( \) ?, B) f/ g0 S) \
  3. __IO uint32_t CCR;7 F8 `0 u7 Z; x/ I4 F& V
  4. __IO uint32_t CNDTR;
    4 f. u, y. P1 c+ @( ~
  5. __IO uint32_t CPAR;  e3 x0 H3 J, u! K) S0 t9 f# J# u
  6. __IO uint32_t CMAR;: @  L8 a: W1 M9 ^6 o: p; T" |* b
  7. } DMA_Channel_TypeDef;
复制代码
& ]0 V/ S$ e9 v8 ]& P* J
对应在F407中的DMA_Stream_TypeDef为:
  1. typedef struct# ^& M7 x* i. _7 [
  2. {% N- F' {( m) r% b6 @
  3. __IO uint32_t CR;    0 ]9 r+ B& V- {( x4 o
  4. __IO uint32_t NDTR;  " t$ V/ d) p" w7 y) W) J, d
  5. __IO uint32_t PAR;  
    3 T# Y6 g, S. `
  6. __IO uint32_t M0AR; 3 Q1 d6 U4 f+ }
  7. __IO uint32_t M1AR;  
    6 W3 E1 V; z4 Q8 S. B% ?
  8. __IO uint32_t FCR;  6 W' a7 ^0 L1 `7 @6 f  a: Q% l8 l
  9. } DMA_Stream_TypeDef;
复制代码

9 ~; e+ A& I  N( o/ `
在调用到该结构体中参数时需要注意。
六、重映射
在F407中不存在重映射(REMAP)的概念了,取而代之的是引脚的复用映射(AF)。而相比于F103的重映射,引脚复用功能更加灵活和全面。引脚复用时是对单独引脚进行配置。例如对USART2的PA2和PA3的复用设置指令为:
  1. GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2);! c, Y3 ], J. u0 e2 t
  2.        GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2);
复制代码
9 z$ [2 f) g' S0 d0 Y: ]
Mr.括号我直接把复用映射表列出来,方便大家查询:

, C4 s, {9 e5 y& [8 ]
v2-7d543ac15f3f837e050fe06015056563_b.png
3 F3 Y  ^$ H4 [+ N; F0 O
v2-b295befbde6a8e2d0eadd09cb04d7fb1_b.png
( r/ L  E7 ^: b( l2 Z7 c
v2-b961abddadbe9461fa99726c90b8df0e_b.png

  @7 ~5 m2 i7 Q* r& J- S
+ f" Z3 Z8 N: R" M) k4 C
七、其他
用BSRRH代替了BRR
用BSRRL代替了BSRR
: L$ a/ o+ L1 N, y2 x
转载自:qq_17835733
3 ~% x8 k* ?/ @- |5 `
收藏 1 评论0 发布时间:2022-11-7 22:58

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版