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

STM32F103至STM32F407程序移植参考

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

; N  v  P& |! d2 w& E: q/ p
一、硬件兼容改造
先说一下硬件吧,两种芯片的大部分引脚是相同的,需要改动部分电源引脚。官方的芯片数据手册上给出了兼容版的设计图,以100引脚的为例:
3 f8 f; ~7 f! h  v; j# u
v2-a7c322002e96185dfc5782724fdbf779_b.png
& ~( l: D0 d' B0 d4 [8 f& V
其中19引脚从VSS改成VDD,49和73引脚分别从接VSS改成接电容,电容值为2.2uF。
* o4 ?, b+ X/ s9 q  I7 U: y

, F) u2 f. v: u/ o8 X/ \
二、系统时钟设置
F407的外部高速时钟的宏定义在system_stm32f4xx.c中。

. G7 ^* C: \, n# x# s
  1. #define HSE_BYPASS_INPUT_FREQUENCY   8000000
复制代码

1 P, l) z5 y( G
其中8000000代表外部时钟选用8M晶振,此处需对应实际情况修改。
时钟设置在函数SetSysClock()中进行设置,关键语句为:
& ?, \# q; C7 N0 j
  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>);
复制代码

9 o; v9 a- ?2 ?
主时钟PLL的值等为:PLL=M*N/(M*P),对应需求进行修改。
8 R- R& c+ }8 r4 v- B

2 c8 p9 ^- U  O* u7 f! B$ C
三、外设时钟使能
F407的外设时钟使能的函数和F103的相同,但是外设对应的外设时钟的映射关系发生了改变。具体的映射关系在文件stm32f4xx.h中有宏定义。
例如:在F103中GPIOA的外设时钟使能语句为:
  1. RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );
复制代码

& P% r% M$ S$ w4 S! `( B0 w4 ]$ m
在F407中,在stm32f4xx.h查找GPIOA,可以查到宏定义:
  1. #define RCC_AHB1Periph_GPIOA ((uint32_t)0x00000001)
复制代码

& D- B! B+ m, r" S# ~
因而该使能语句可以改为:
  1. RCC_AHB1PeriphClockCmd ( RCC_AHB1Periph_GPIOA, ENABLE );
复制代码

# B, d) Q0 g  Z$ ]1 V. R
+ j4 c) c& [. i
四、GPIO端口初始化
在F103中,GPIO_InitTypeDef结构体为:
  1. typedef struct
      y0 L( h7 W* n7 i; ?) @: t" v
  2. {
    ( I% z5 `$ T0 j# Z" I$ [1 [
  3.   uint16_t GPIO_Pin;        ' A5 H2 `' K5 _* i% F% ~
  4.   GPIOSpeed_TypeDef  GPIO_Speed; 4 k( Y" a, M: |( d
  5.   GPIOMode_TypeDef   GPIO_Mode;  
    ; i4 j7 V9 c+ Q; O% Z+ |' Z
  6. }GPIO_InitTypeDef;
复制代码
6 O9 N  R, L  D# n4 S
在F407中,该结构体为:
  1. typedef struct) {( M: n( H& G) t% l
  2. {# i/ Y& A# i, k/ L9 l+ V
  3.   uint32_t GPIO_Pin;         
    1 @- ~5 v! G! g0 W
  4.   GPIOMode_TypeDef  GPIO_Mode;    ( [. ?: |( L6 J- V6 m* s
  5.   GPIOSpeed_TypeDef GPIO_Speed;   3 X( Z2 D4 F6 P2 _
  6.   GPIOOType_TypeDef GPIO_OType;  
    3 s1 V4 T3 D& E% |
  7.   GPIOPuPd_TypeDef  GPIO_PuPd;      m$ w% y2 g  K
  8. }GPIO_InitTypeDef;
复制代码
7 T& N1 q" G% x( t8 |( S0 e6 E! Y
F103中的GPIO_Mode在F407中被拆解成了三个参数:GPIO_Mode、GPIO_OType和GPIO_PuPd。其中GPIO_Mode有输入、输出、复用和模拟四种模式可选,GPIO_OType选择推挽和开漏,GPIO_PuPd选择上拉、下拉和浮空。
. Z. Z; E; u2 Q
- k$ c5 W( j6 W3 B
五、DMA设置
F407中DMA的Channel统一换成了Stream与Channel组合的形式。DMA的初始化结构体DMA_InitTypeDef中多出了参数DMA_InitStructure.DDMA_Channel。不同外设请求对应的数据流和通道在官方参考手册中有明确的示例。DMA1和DMA2的请求映射如下:

9 W: o3 j7 K4 H
v2-b0219bbf80f4d668aee77a2e7da2a89e_b.png
6 m; B2 c. [5 [2 Z% b# S' B+ c( g- m2 e3 E  u
v2-c9239b3dd2b512bc059acb4bb8057c32_b.png ' g, e* k0 _# F- B/ [
8 ]8 v6 S9 c6 v6 D1 k0 f% ~* D. z3 L
另外还有一个小改动,在F103中DMA_Channel_TypeDef结构体中的元素为:
  1. typedef struct
    1 h2 f: G7 ^/ _+ z  |! a
  2. {
    ) O" H  P* e$ F
  3. __IO uint32_t CCR;
    : H5 v; K* ?& q9 ]6 Z: m2 y; i, i4 x
  4. __IO uint32_t CNDTR;
    % j& t) ?7 e# G; P8 I, |
  5. __IO uint32_t CPAR;! F- U2 A; d5 t3 `0 h$ Y
  6. __IO uint32_t CMAR;
    - \' ^9 i  b$ R/ K+ x
  7. } DMA_Channel_TypeDef;
复制代码

* E4 I1 g  @! j; Q- _
对应在F407中的DMA_Stream_TypeDef为:
  1. typedef struct4 r8 w5 ^5 C) k2 M1 @- e$ ~. p% G2 n
  2. {& b& R6 A- p$ o
  3. __IO uint32_t CR;   
    : }8 F* N$ N! _2 F) I
  4. __IO uint32_t NDTR;  
    , Q, l9 X4 u$ T7 I( W& n# b, Q
  5. __IO uint32_t PAR;  : F8 R( r! M2 Q& d8 |
  6. __IO uint32_t M0AR; 6 M/ G2 M+ Y/ z7 s! v7 u! V+ q
  7. __IO uint32_t M1AR;  $ T2 _8 ^0 b& T" X
  8. __IO uint32_t FCR;  
    2 W# V+ f$ C4 f. K
  9. } DMA_Stream_TypeDef;
复制代码

! B; K% m9 A  Y7 a
在调用到该结构体中参数时需要注意。
六、重映射
在F407中不存在重映射(REMAP)的概念了,取而代之的是引脚的复用映射(AF)。而相比于F103的重映射,引脚复用功能更加灵活和全面。引脚复用时是对单独引脚进行配置。例如对USART2的PA2和PA3的复用设置指令为:
  1. GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2);
    1 M" Y- ]# G, H% D
  2.        GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2);
复制代码

/ b( p: ?" P  v) _
Mr.括号我直接把复用映射表列出来,方便大家查询:
  ]& M$ ^$ E# O, X- X+ V/ E' k
v2-7d543ac15f3f837e050fe06015056563_b.png
( ^% W* `; x/ L! c' ?" Q
v2-b295befbde6a8e2d0eadd09cb04d7fb1_b.png
! j, J2 Z$ t9 X
v2-b961abddadbe9461fa99726c90b8df0e_b.png

, s7 M9 n+ e; v& {" s6 ^$ n; g! M
' e3 }  {( c1 a7 d
七、其他
用BSRRH代替了BRR
用BSRRL代替了BSRR
' q6 {" J, h  G1 G% X( R
转载自:qq_178357336 m/ t! f6 V9 E9 Q' o/ W. N8 u
赞 收藏 1 评论0 发布时间:2022-11-7 22:58

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版