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

【经验分享】STM32F1移植到F0的各种经验总结

[复制链接]
STMCU小助手 发布时间:2021-11-20 22:00
这段时间在公司里做了一个移植的项目,是stm32f103c8t6——>stm32f070cbt6,管脚基本上一样,移植一下库就行了,大概是为了节省成本吧。一开始是懵逼的,以前从来没有移植过stm32,都是想用哪个功能,发现一个是F1一个是F4,就耍小聪明,把其中没有用到库函数的部分复制到另一个上,然后开始编啊编啊……现在遇到项目要做了没办法,网上也找不到资料(我是小白),只能自己硬着头皮改啦!8 w- F$ {$ f: b7 g6 W& R% D
4 v& }# v$ r$ F& \6 X
    想想想,想到后来就是先创建一个工程再说吧!! r) J. C' A% n2 }2 N$ r

0 q! P5 B/ c' m4 b# W, f    于是乎,第一步来了:创建一个STM32F0的工程。
  ^. w$ z2 G6 E/ E9 `- F
. b' }! V! r6 G$ h8 O6 r7 z! W    如果你在选择芯片的时候没有你想要的F0芯片,说明你没有那个pack,得下载一个,具体步骤不详细说了。$ H) Z1 V- j! j
& c8 _0 R  }. `4 w6 J, v7 |8 g
    你需要用到的文件有:F0的库、F0的启动文件、F0的各种头文件、CORTEX-M0、系统文件……详细的不说了,对照图中的文件放就行了
  X0 e/ z( d0 H  ~# n' e2 `" Z+ t8 u& o" E& G
20180725134343215.png

% M4 n3 Y4 d$ H3 S/ d4 e( Z3 j" H- o3 ~4 n, _" x
    图中没有红线的不用管,其他都必须有,还有一些头文件没在上面,记得在设置——>C/C++里面引用一下,这些文件基本上在官网例程里都能下到。
- A# v4 s. x/ b
' K" J7 H: `0 Y, G8 \9 V! N) G/ \7 M  `    同时要在C/C++一栏里加这么一行字:USE_STDPERIPH_DRIVER,STM32F0XX_MD
" C9 a" g: ?) Y) v/ X
( \, J5 f  i3 T  Z9 G7 ?, S7 n) \
20180725134837925.png

4 {) ^+ {9 n! Y0 f. v( S) H- c
7 F# F- Y: I! g. p' T- q- h- e    然后再把你自己的程序贴上去,一编译,肯定不会通过的拉,哈哈哈,但是会把你程序中F1用到的库函数和F0库中相冲突的地方显示出来,这时候你就只需要一个个改就成了。
- C+ _: i+ i: B, q8 f  `8 h) }
/ s2 n% d2 x/ P, b8 K, W$ ]    1.GPIO.c方面
3 v0 N4 y( M# X7 Z. X    gpio这方面比较简单,错误大部分都是引脚时钟设置、引脚的模式设置方面会出错误。7 J' ^& G6 X3 j- f/ W

6 I7 J! q# p' [$ N8 ~    1.时钟的话由于F0库中没有使用PCLK作为GPIO时钟源的命令,所以一般都使用HCLK来作为GPIO的时钟源;: v( k! G6 G$ D
" u5 i5 X  G; W7 y
    2.引脚的模式设置方面你可以右键“GPIO_InitTypeDef”——>go to Definition看一下这个结构体里面的定义,比较一下F1和F0的设置的不同。
0 q5 v( b0 a- f. a% {  d3 t, d9 \7 M+ z# k" E# a
    这里放两种图,一张是F1的,一张是F0的GPIO设置,大家可以对比一下
8 y9 f* E1 t; e9 r
20180725135841124.png

4 H1 h9 G+ M0 d3 s6 k0 D* t5 x, |1 K* A9 J! }; @2 A
9 f9 r/ R. j" f6 ?
F1 GPIO设置F0 GPIO设置0 G% E: A' \  a* R6 f9 `9 |
, c* e* j9 g  u0 O1 N3 g* J
20180725140255219.png
5 ^8 X" G8 L; g$ X& u1 A

# K" D+ V& H# ]  u2 c( V    另外,如果引脚模式为AF_PP,复用输出模式时需要用函数配置一下复用的用途:
, {& F( G0 [9 X( q: P' `  z: [$ ?% q5 |1 g+ Z+ J& x! ]2 C3 j
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);GPIO_AF_1对应一些外设,比如说我这里用到了USART1,故要用GPIO_AF_1,你可以右键Definition看一下各个模式的定义。
* `5 M0 k) d+ t9 M/ q$ `* F6 P
; u! O+ g) ?* M( ]" @) H& L    是不是感觉F0的设置很啰嗦,呵呵。2 x! x% ?2 X  T8 F1 Y3 u
) t/ f- ?" ^- K2 ~* o) X3 V* O# j
    2.MISC.c(NVIC,即中断)、EXTI.C(外部中断)
6 e) @2 R. r) t! Z# E    1.模式设置/ g/ m1 ]: Q6 ~: X  P; h
! Z4 F! z" ~( i- T; ~
    与GPIO模式配置差不多,修改方式大同小异。右键Definition一下“NVIC_InitTypeDef”、“EXTI_InitTypeDef”查看异同,相同不用改,不同就改,多删少补。' c( t2 m% Y/ {: s6 h7 d$ D/ ?2 s

% H$ C3 y+ Y1 [; Y( W8 {    还有在配置外部中断源时注意F1和F0是不同的,F1配得外部中断源在哪个通道范围,F0也得相应换:# O* h) h. K- r! L
' b, z4 n9 r! L. e! o
    F1的中断源有:EXTI15_10_IRQn(10-15)、EXTI9_5_IRQn(5-9)、EXTI1_IRQn、EXTI2_IRQn……(1、2、3、4、5)& l9 v3 Y2 b+ i7 Y+ K* z* ]

5 e4 h$ ?) K- i5 g; b6 J% @    F0的中断源有:EXTI0_1_IRQn(0-1)、EXTI2_3_IRQn(2-3)、EXTI4_15_IRQn(4-15)
# |/ |5 o/ i8 p5 Q: x& D  `9 |
; g" V. O/ n3 O; n    F1的中断源比如说是EXTI15_10_IRQn,那在F0中就得配EXTI4_15_IRQn,如果不在范围中,就得看你外部中断的引脚了,中断源和你引脚号相同
1 O( [: v+ q5 T2 H; R. x- `: O
  Z" I# R3 T, n" e1 S6 l+ y; |    3.定时器方面
0 N! l: n! H* x2 D    这部分由于项目中没有用到,我这里也不敢乱贴以致误导。相信小伙伴们上面的会改了,这个也不是难事,大部分都是修改模式配置的问题。0 R/ K: x# m3 x2 M7 X( [
+ A' B3 n9 y, R/ i( _! s( \0 ]/ t
    4.USART.c方面& d% I$ y3 P% k
    串口配置首先是GPIO的配置和中断方面的配置,上面已经有方法了。这里的模式配置MS是不需要改的:) d5 c; `( i0 _! Y9 \5 I

% q$ e' |% M" P5 Y1 U4 i) b' |    F0:
& x0 ?  E) o# `. D' m- a7 b2 ~; \- @7 ]' h2 }
  1. /* USART1 mode config */
    , R1 O, [+ k; H! ~' C$ k
  2.     USART_InitStructure.USART_BaudRate = bps;5 D. G) q. w' x% Z6 S8 t
  3.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    9 ]" _; S9 W3 z6 V7 e7 [; M
  4.     USART_InitStructure.USART_StopBits = USART_StopBits_1;: g' S1 _, C. W6 g! L
  5.     USART_InitStructure.USART_Parity = USART_Parity_No ;( a: ~" D7 @, J
  6.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    ! Y/ a' p6 r  `. f& Y9 \6 N- b8 j" z
  7.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
      N# d% y' B. q
  8.     USART_Init(RS485_UART, &USART_InitStructure);
    - q" V" q6 t! y- i" {
  9.     USART_ITConfig(RS485_UART, USART_IT_RXNE, ENABLE);. t5 l$ G5 T2 U

  10. 1 F9 T' l* m) d9 A/ e
  11.     USART_Cmd(RS485_UART, ENABLE);
复制代码
: [5 M9 K" t) q# o& k0 B$ w
    F1:
; ~- P9 o! k, g. Z$ d" p
" X0 b5 X: l; a; p+ A5 b1 t0 b
  1. /* USART1 mode config */$ F6 P+ ^+ P+ }! [
  2.     USART_InitStructure.USART_BaudRate = bps;" P! z" w7 s& ]  }) ?
  3.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    2 x  R3 t* |0 [4 K4 l! {) K2 `% n
  4.     USART_InitStructure.USART_StopBits = USART_StopBits_1;0 A0 v- p; T2 F, Q4 M; h, h
  5.     USART_InitStructure.USART_Parity = USART_Parity_No ;/ t3 M( f2 P7 g) v7 H% \
  6.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    6 C. @& g$ E8 I
  7.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;# Q. l7 t; C0 L: J  h$ E& ^# A1 I
  8.     USART_Init(RS485_UART, &USART_InitStructure);3 a- a/ n) b3 O/ }6 L+ y
  9.     USART_ITConfig(RS485_UART, USART_IT_RXNE, ENABLE);$ b% T) `* g) F8 H& N) ]

  10. 7 {% X9 v0 }' v" n3 B
  11.     USART_Cmd(RS485_UART, ENABLE);
复制代码
   嗯....一样一样的。注意这里有个寄存器是不一样的:
3 L3 a, y% a- B5 a8 P$ B
6 M7 b& o7 t) N. H( n/ i就是在接收中断中,有些项目可能需要将这个寄存器重置一下:
( X" [4 W  T9 h6 R, C7 m0 f9 S7 o3 S8 N, \" q1 W% j; ?; C
F1中为“RS485_UART->SR=0x00;”,SR寄存器,只有16位
$ R" @" a# W1 K5 h# P/ c$ p. S$ G& M
而F0中则为“RS485_UART->ISR=0x00C0; ”,ISR寄存器,有32位
  m2 z( A' D) S, l
7 p8 w/ d' _. L& K, Z( j' e, I7 q这些好像不是必要的,具体的功能可以看一下数据手册里怎么介绍的...似乎是中断接收标志位?" N" ^3 e" l+ X" M- Z

$ k, L0 R' U# F: }7 Q; B7 ?    5.中断向量表的重映射
  e8 b9 `0 w2 ^. h  O    如果你的项目用到了软件bootloader,中断向量表就得重映射,而F1中有函数可以直接用,然后你会发现F0中没有9 h& [1 h1 r6 S, x9 r8 Y& ]
; i& h, C, ^% r$ R
    F1中的函数:; U5 `4 q. H3 |+ B

' r8 u0 M$ ?8 T* A4 Q    NVIC_SetVectorTable(NVIC_VectTab_FLASH, BSP_ADDR_Boot);
6 }. R" P2 n. c$ L) u; h0 Z- f- B: o
8 C) I- V7 I( u" ]
    通过查资料得知我们可以用memcpy,将中断向量表拷贝到ram下(F0的中断向量表可以放在RAM中),然后保证存储中断向量表的这部分不会被修改就行了,方法在上面这个网址中。
3 i' D3 ~( ?1 N' j  b+ h9 c# G
/ @' A7 `5 r6 e  s/ s4 z    F0中的函数:
* l3 }3 @; Y' @- W5 v4 z& r
, O" n( G1 W0 I* T1 `    memcpy((void*)0x20000000, (void*)0x08000000, VECTOR_SIZE);  s/ ]+ d3 u( L9 Z+ I7 K9 y
    SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);9 j) o1 t' n' B9 {2 Y  B0 e
  l6 u' y$ m1 m5 ?  V2 |) @
    至于JTAG口的复用问题,STM32F0并不存在,可以将相应的函数删掉即可。- S- V  k5 _  w

6 d5 n% W3 h& F. X! q/ u3 X5 K
: l" D& Z& ?5 P  M# q& D2 t+ `+ m
4 q& z; n3 _1 {2 U9 ~8 k4 |% U
# Z, v& f* i% }" d; I" ~! D% f1 M5 c$ Y# S) ~* f% _/ U5 J7 N: H
收藏 评论0 发布时间:2021-11-20 22:00

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版