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

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

[复制链接]
STMCU小助手 发布时间:2021-11-20 22:00
这段时间在公司里做了一个移植的项目,是stm32f103c8t6——>stm32f070cbt6,管脚基本上一样,移植一下库就行了,大概是为了节省成本吧。一开始是懵逼的,以前从来没有移植过stm32,都是想用哪个功能,发现一个是F1一个是F4,就耍小聪明,把其中没有用到库函数的部分复制到另一个上,然后开始编啊编啊……现在遇到项目要做了没办法,网上也找不到资料(我是小白),只能自己硬着头皮改啦!1 r3 o$ P( z. P3 S- P1 M! V
3 p8 [6 h7 ?- a; P% T1 @" Y  U
    想想想,想到后来就是先创建一个工程再说吧!* w+ Q. z0 i. ?0 s. b, }

! {8 t: M6 ]* Y  K& V5 ]    于是乎,第一步来了:创建一个STM32F0的工程。% x3 Z7 }5 `% H8 B) i1 e0 }

6 \( T) ]! o) q6 L    如果你在选择芯片的时候没有你想要的F0芯片,说明你没有那个pack,得下载一个,具体步骤不详细说了。
- d( ?5 }! d. c" `1 x5 m* P0 x& R: \9 h7 g: f: p4 e1 ~* v" ]/ D
    你需要用到的文件有:F0的库、F0的启动文件、F0的各种头文件、CORTEX-M0、系统文件……详细的不说了,对照图中的文件放就行了% E9 Z% m* C, q% H  f
# M5 b3 L! I9 r$ v$ Q. L
20180725134343215.png
5 o. O# P; \- I3 g% M3 D2 J; z

+ @  z5 M% u; ~% g4 o8 {    图中没有红线的不用管,其他都必须有,还有一些头文件没在上面,记得在设置——>C/C++里面引用一下,这些文件基本上在官网例程里都能下到。" D+ j* x" W; B, M( R$ s  w

/ y& c' x4 g+ {5 `1 B0 G* M    同时要在C/C++一栏里加这么一行字:USE_STDPERIPH_DRIVER,STM32F0XX_MD$ v: v% B( {- i7 e* r( v. a& B

5 M% h/ ~8 w, H! U/ L5 i
20180725134837925.png
: F3 q) d- T/ K1 [

) t2 z) w5 l6 u! J2 N; j2 T+ s+ [    然后再把你自己的程序贴上去,一编译,肯定不会通过的拉,哈哈哈,但是会把你程序中F1用到的库函数和F0库中相冲突的地方显示出来,这时候你就只需要一个个改就成了。
7 P# `6 Z, ~* n1 F" l. E! L( {: x9 F) Z/ i
    1.GPIO.c方面
, M2 f& X% J" K! ?9 n* H    gpio这方面比较简单,错误大部分都是引脚时钟设置、引脚的模式设置方面会出错误。
. i' ^( w- K: d$ \6 g6 D0 P' f5 l, S( {( Y* e
    1.时钟的话由于F0库中没有使用PCLK作为GPIO时钟源的命令,所以一般都使用HCLK来作为GPIO的时钟源;
  [) Z# z1 I( K: N
2 E8 I( a# `/ K/ ]7 O5 y! D" [    2.引脚的模式设置方面你可以右键“GPIO_InitTypeDef”——>go to Definition看一下这个结构体里面的定义,比较一下F1和F0的设置的不同。
+ r) l2 M* h1 P/ @: I' U4 E2 U, K! @1 o
    这里放两种图,一张是F1的,一张是F0的GPIO设置,大家可以对比一下
$ U  ]6 k! G0 q# z3 d
20180725135841124.png

& \- [' }+ a4 l; C9 T. |
  Z# u" r1 p7 F4 h6 x) R- z7 w1 t
F1 GPIO设置F0 GPIO设置
, v7 Z* k# y# m5 s% F) j$ J4 c" f; R& ]+ ^/ F
20180725140255219.png

* K# _. l2 `. H" z1 V3 b$ `! ~3 @7 s2 Q0 {" l
    另外,如果引脚模式为AF_PP,复用输出模式时需要用函数配置一下复用的用途:
7 t* S( |% Y4 z6 v6 ^/ n
2 I+ T9 b  G) ]# z0 T    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);GPIO_AF_1对应一些外设,比如说我这里用到了USART1,故要用GPIO_AF_1,你可以右键Definition看一下各个模式的定义。
" k* l9 v- Y5 h! |! z. v) ^4 y  Q8 Q- K/ `
    是不是感觉F0的设置很啰嗦,呵呵。
7 Q% _2 _) }% A" O( P
4 G3 s2 u/ C% X* J1 Z! ?    2.MISC.c(NVIC,即中断)、EXTI.C(外部中断)+ `0 F8 S7 d' E# L  B& N& ]
    1.模式设置7 F% Z# W+ j) Q" Q4 Z& q
+ b7 e& k2 x. R3 P8 n: C% A
    与GPIO模式配置差不多,修改方式大同小异。右键Definition一下“NVIC_InitTypeDef”、“EXTI_InitTypeDef”查看异同,相同不用改,不同就改,多删少补。
4 @" O, x  A- h; |  p2 ?7 N8 ^$ K; x( l
    还有在配置外部中断源时注意F1和F0是不同的,F1配得外部中断源在哪个通道范围,F0也得相应换:
  x" C6 v$ Z, d+ A
+ N% g# R8 T/ Y, Z5 O    F1的中断源有:EXTI15_10_IRQn(10-15)、EXTI9_5_IRQn(5-9)、EXTI1_IRQn、EXTI2_IRQn……(1、2、3、4、5)
; r6 _4 k9 w6 j( v1 k& w
9 o/ I- y' s5 p% ~- x. H1 {    F0的中断源有:EXTI0_1_IRQn(0-1)、EXTI2_3_IRQn(2-3)、EXTI4_15_IRQn(4-15)" A: N2 y& u  J  k4 C7 H8 Z5 |2 e5 t

  J& L# S! y# _    F1的中断源比如说是EXTI15_10_IRQn,那在F0中就得配EXTI4_15_IRQn,如果不在范围中,就得看你外部中断的引脚了,中断源和你引脚号相同
: {' I' O( o& k
* R1 N5 D: x* s    3.定时器方面
" X6 _5 b! L* Z" S2 T9 v* }( w8 w    这部分由于项目中没有用到,我这里也不敢乱贴以致误导。相信小伙伴们上面的会改了,这个也不是难事,大部分都是修改模式配置的问题。# Z0 U) L2 K2 D+ Q8 a
$ l- R) e& @" I
    4.USART.c方面
0 S3 s/ U4 T# w9 g) N3 f# k    串口配置首先是GPIO的配置和中断方面的配置,上面已经有方法了。这里的模式配置MS是不需要改的:
7 c+ q+ v  J6 a# u4 r+ b1 g
: q3 L8 T: o; `    F0:
  H* y5 U# h* b# H& m; \# I$ O1 P! F
; D: A5 U9 w, E: }  q  Z" z% o
  1. /* USART1 mode config */
    - _+ [5 N& C: n% E0 t
  2.     USART_InitStructure.USART_BaudRate = bps;$ S2 @3 Q/ B) A$ m% b) B! j5 v
  3.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;" K* V$ N9 S( }% _* W6 w& w
  4.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
    $ [$ e1 A5 M1 @
  5.     USART_InitStructure.USART_Parity = USART_Parity_No ;
    & Y- {% A! f- M
  6.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    - U4 G& z" i9 j/ {  n
  7.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    9 o& }, M3 d1 v, K2 F
  8.     USART_Init(RS485_UART, &USART_InitStructure);5 Q/ M" E7 ?: g0 ]8 L
  9.     USART_ITConfig(RS485_UART, USART_IT_RXNE, ENABLE);
    ( {: @$ a2 @* b% ~8 K

  10. - Y9 l1 \0 ^6 _4 l' D
  11.     USART_Cmd(RS485_UART, ENABLE);
复制代码

7 L& j% i" B9 _- n* q/ x    F1:
$ ]' R) ?& J% F' y4 ]
/ x8 ?! a: T$ |& ~- t+ _; v
  1. /* USART1 mode config */
    0 ^% T* K8 T- t0 Y4 ?+ T, }* R% v9 f
  2.     USART_InitStructure.USART_BaudRate = bps;- z+ Y+ A2 H: X/ m: k1 ^
  3.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    + ?) {2 p) z5 @% I1 q/ K
  4.     USART_InitStructure.USART_StopBits = USART_StopBits_1;, m7 \0 i2 M( [$ v7 p( |7 r
  5.     USART_InitStructure.USART_Parity = USART_Parity_No ;
    ! Q! V8 Z, p; U4 _  V7 z; t
  6.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    & t( x+ u1 P/ O  j7 s' i8 r
  7.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    6 |; H3 o9 w5 |+ {! d& Z/ u
  8.     USART_Init(RS485_UART, &USART_InitStructure);
    5 _9 }6 ?0 T4 M- \
  9.     USART_ITConfig(RS485_UART, USART_IT_RXNE, ENABLE);
    5 \: }' I2 q: e& o9 N4 L( s) Y

  10. 4 d, N7 [; S+ x: T, q, C
  11.     USART_Cmd(RS485_UART, ENABLE);
复制代码
   嗯....一样一样的。注意这里有个寄存器是不一样的:1 O& k( l0 g) [" k- i7 q' [
3 z& g" e5 v& L( V" C  }  H
就是在接收中断中,有些项目可能需要将这个寄存器重置一下:
8 `2 {8 g8 G' v* m
& P  r/ ~8 j% y, U3 k$ iF1中为“RS485_UART->SR=0x00;”,SR寄存器,只有16位
& n) N2 ~$ }; @2 i: c, G: L8 w/ J( u6 _- q
而F0中则为“RS485_UART->ISR=0x00C0; ”,ISR寄存器,有32位# M) k2 M5 @8 ?- L- N" X7 ^
. k! p, x! k, W5 h! R9 R* G$ n# b
这些好像不是必要的,具体的功能可以看一下数据手册里怎么介绍的...似乎是中断接收标志位?
6 ~# Q. u. _/ H+ ?: ~8 x1 }5 T9 x0 G9 k9 Q3 A0 s
    5.中断向量表的重映射
. x' ?: ^% c9 L1 x! f3 _* X    如果你的项目用到了软件bootloader,中断向量表就得重映射,而F1中有函数可以直接用,然后你会发现F0中没有* P, K' S7 \* U4 q, I( i! j

- \0 b5 O8 J0 z/ ?7 m) m! g# W" ^8 W    F1中的函数:
6 p/ u4 v+ h+ B' b9 v$ Q( V7 ]0 o$ z' f; \9 h% w3 |
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, BSP_ADDR_Boot);
7 V. C1 f: V. H# J" y6 h
8 W( R, C! S5 |. ~6 k/ D: F) p
9 g  p( u; J3 g# F    通过查资料得知我们可以用memcpy,将中断向量表拷贝到ram下(F0的中断向量表可以放在RAM中),然后保证存储中断向量表的这部分不会被修改就行了,方法在上面这个网址中。
: p' E. x, i1 W6 q$ r- r$ h% {
# p, m; s  Y, N. v, g8 q! y    F0中的函数:8 g* _8 E5 r& |, U3 d; G" y. f
' h( `) d, O7 u6 w: I8 l5 g5 ^
    memcpy((void*)0x20000000, (void*)0x08000000, VECTOR_SIZE);
- L, v$ b5 f9 G  j5 U    SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);
7 z/ }) i& n5 T% l! n: |
& k' m7 J4 j! M    至于JTAG口的复用问题,STM32F0并不存在,可以将相应的函数删掉即可。6 i# @2 R( E1 A! k( A/ `
5 [  Z( o- R! b' F
# y% i8 e0 L$ ~& _) H( t" v

2 U3 f& x7 t$ \) t0 J7 a( Q6 w0 m9 Z+ i

0 J, u) T4 o, d# H
收藏 评论0 发布时间:2021-11-20 22:00

举报

0个回答

所属标签

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