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

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

[复制链接]
STMCU小助手 发布时间:2021-11-20 22:00
这段时间在公司里做了一个移植的项目,是stm32f103c8t6——>stm32f070cbt6,管脚基本上一样,移植一下库就行了,大概是为了节省成本吧。一开始是懵逼的,以前从来没有移植过stm32,都是想用哪个功能,发现一个是F1一个是F4,就耍小聪明,把其中没有用到库函数的部分复制到另一个上,然后开始编啊编啊……现在遇到项目要做了没办法,网上也找不到资料(我是小白),只能自己硬着头皮改啦!) ^- c& q3 w/ K  W5 J

, O  Y- p4 i2 d" x3 g6 G) q    想想想,想到后来就是先创建一个工程再说吧!" i5 ~! s+ c, l7 w

) L3 J+ U9 ?; a/ |! a' e4 P5 F    于是乎,第一步来了:创建一个STM32F0的工程。
9 i. _( f% @# S+ G: M! q% V7 f; t" k0 T& B# \
    如果你在选择芯片的时候没有你想要的F0芯片,说明你没有那个pack,得下载一个,具体步骤不详细说了。
. C# h9 H$ h6 ~, K- v  K3 v8 D6 f; m+ d2 [
    你需要用到的文件有:F0的库、F0的启动文件、F0的各种头文件、CORTEX-M0、系统文件……详细的不说了,对照图中的文件放就行了
6 R8 _% {" }: e$ B: C
/ a. e: j& ^# T7 G. U
20180725134343215.png

8 v: [' ^+ U$ T1 o
) U: R2 ?+ a; ], B! x    图中没有红线的不用管,其他都必须有,还有一些头文件没在上面,记得在设置——>C/C++里面引用一下,这些文件基本上在官网例程里都能下到。
% {' B1 f8 w# F" Z( s6 B0 L6 h  P7 k* S" p- n) W  g
    同时要在C/C++一栏里加这么一行字:USE_STDPERIPH_DRIVER,STM32F0XX_MD
% X" w7 N( i3 V( W3 e# B! K3 b4 j9 c; s6 V5 X5 Z0 e
20180725134837925.png

% i3 {2 P# I' G8 x& ~( J; x' F7 g6 Y
- a. {& q. @2 q    然后再把你自己的程序贴上去,一编译,肯定不会通过的拉,哈哈哈,但是会把你程序中F1用到的库函数和F0库中相冲突的地方显示出来,这时候你就只需要一个个改就成了。
2 d3 e, @0 g; x: U$ H% x& z' d, O4 w/ ~% {" v
    1.GPIO.c方面8 c% x) d' {/ l4 |+ H
    gpio这方面比较简单,错误大部分都是引脚时钟设置、引脚的模式设置方面会出错误。
- X4 }) d4 X. F  D
( |7 O8 c% ]7 ^" @1 R8 @' E    1.时钟的话由于F0库中没有使用PCLK作为GPIO时钟源的命令,所以一般都使用HCLK来作为GPIO的时钟源;
0 n/ H6 v* x  X) G! S/ ?' Q+ A# V2 F! P$ M+ `% [  U
    2.引脚的模式设置方面你可以右键“GPIO_InitTypeDef”——>go to Definition看一下这个结构体里面的定义,比较一下F1和F0的设置的不同。
+ v8 Z! w! r3 O9 y/ {4 {$ Z! ^. `6 h- h/ _. ^: A: R
    这里放两种图,一张是F1的,一张是F0的GPIO设置,大家可以对比一下3 n  q% J- G# o9 Y
20180725135841124.png
% c6 @8 `. W! L0 ]" H, k

! f7 S' o5 K4 U6 J( O; H; l& Q. S$ y( F/ I1 [; J+ a' j
F1 GPIO设置F0 GPIO设置. ~- u' r/ ~8 S6 n

" e3 ^2 c% u4 h! z- E# s4 v( o
20180725140255219.png
2 i9 r6 X! L* ]

3 ]$ U  D! B3 F& W( g6 C8 O: @    另外,如果引脚模式为AF_PP,复用输出模式时需要用函数配置一下复用的用途:
& ]0 S6 j* m- J& X- L, K
% j9 f2 e9 }# E: Y    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);GPIO_AF_1对应一些外设,比如说我这里用到了USART1,故要用GPIO_AF_1,你可以右键Definition看一下各个模式的定义。
2 u6 f, J& b( |1 Z8 p2 I1 d- }+ x9 a# _6 ^8 ~+ m9 A
    是不是感觉F0的设置很啰嗦,呵呵。! T- u- W8 Q% r

+ }6 v: i- d. O" w6 r7 x% U  y5 A" b    2.MISC.c(NVIC,即中断)、EXTI.C(外部中断)( C) g4 h% i! q! B5 h0 H
    1.模式设置7 m: A( _9 }1 W9 C; k6 p" l
9 L  J8 l6 d5 \  g! X9 [3 O6 `
    与GPIO模式配置差不多,修改方式大同小异。右键Definition一下“NVIC_InitTypeDef”、“EXTI_InitTypeDef”查看异同,相同不用改,不同就改,多删少补。
7 |) L& e/ ^- z0 l4 E
2 X" t  v% T% U: X9 u    还有在配置外部中断源时注意F1和F0是不同的,F1配得外部中断源在哪个通道范围,F0也得相应换:$ B* O" r; u7 c( h/ C7 ~% ~3 W

2 N2 P- f4 M% s( O+ b* ]) u  V" h0 R+ S    F1的中断源有:EXTI15_10_IRQn(10-15)、EXTI9_5_IRQn(5-9)、EXTI1_IRQn、EXTI2_IRQn……(1、2、3、4、5)% w5 U* U8 p% H! i& d5 E8 H
0 ?, ~) C. k! y! \% C* y) z
    F0的中断源有:EXTI0_1_IRQn(0-1)、EXTI2_3_IRQn(2-3)、EXTI4_15_IRQn(4-15)4 h- Y2 Q  N* }/ d& h
! ~8 ^2 b! X8 _2 W
    F1的中断源比如说是EXTI15_10_IRQn,那在F0中就得配EXTI4_15_IRQn,如果不在范围中,就得看你外部中断的引脚了,中断源和你引脚号相同
5 S$ w8 T8 x1 A$ U" o5 |2 ?9 j: {3 B4 N4 r
    3.定时器方面) H( `( w7 O6 ]
    这部分由于项目中没有用到,我这里也不敢乱贴以致误导。相信小伙伴们上面的会改了,这个也不是难事,大部分都是修改模式配置的问题。
+ f8 W- c7 ~0 j! V: E
; X3 |5 G% R2 h& O  R    4.USART.c方面  n7 k1 g: v8 K! f
    串口配置首先是GPIO的配置和中断方面的配置,上面已经有方法了。这里的模式配置MS是不需要改的:# F$ Z* H& M/ G8 W

  f" e) H# O' c' h9 F5 H# k    F0:
0 m$ G( O' s; c5 i
: c2 i( K/ M' ~& g
  1. /* USART1 mode config */
    5 U5 ~. N  t. B5 {3 J+ \. E
  2.     USART_InitStructure.USART_BaudRate = bps;
    8 U& s2 ~4 Y' J3 C. m0 j* i
  3.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;# [  k5 ?( N3 x  u; \6 L
  4.     USART_InitStructure.USART_StopBits = USART_StopBits_1;( `( {4 O) c1 [! z! L* Y
  5.     USART_InitStructure.USART_Parity = USART_Parity_No ;6 H1 w/ i; k* C9 D: @; N  U" I1 J
  6.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    0 d. i1 L6 j, E7 x+ u6 ?
  7.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    7 |1 ?- e* u1 E& k: A3 I/ H, z* I8 `8 F
  8.     USART_Init(RS485_UART, &USART_InitStructure);
    8 E  ^. ~# y8 v! g
  9.     USART_ITConfig(RS485_UART, USART_IT_RXNE, ENABLE);
    % [" W% R- c& @
  10. 8 r+ {3 \& t) w1 m
  11.     USART_Cmd(RS485_UART, ENABLE);
复制代码
8 E9 B7 y. Y# x
    F1:/ I$ O, C6 P/ k7 T! b6 w' c& A
" Q' S" D, w$ c8 |
  1. /* USART1 mode config */& i3 T" I, B3 Z
  2.     USART_InitStructure.USART_BaudRate = bps;! @7 [% ~4 [- [6 W% ?0 A
  3.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;5 a: ]9 A7 o4 O, S
  4.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
    ) I! T% K3 E  Q4 Q/ G8 Z# B
  5.     USART_InitStructure.USART_Parity = USART_Parity_No ;1 j: o* m- B- B  ^
  6.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;* b$ P# S0 s7 f6 q5 a. J
  7.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;: I; ^0 J+ ^# q% u, r' F/ Z
  8.     USART_Init(RS485_UART, &USART_InitStructure);* ^5 }7 l4 {" g$ U; _4 s# g
  9.     USART_ITConfig(RS485_UART, USART_IT_RXNE, ENABLE);
    5 q, g+ Y/ A- s: Y5 |; }& _4 P
  10. * e, i% h/ |  H, F% X- J
  11.     USART_Cmd(RS485_UART, ENABLE);
复制代码
   嗯....一样一样的。注意这里有个寄存器是不一样的:& J! c+ z: \  l; P9 X9 e
; E5 Y: A+ q/ W" M" w$ C
就是在接收中断中,有些项目可能需要将这个寄存器重置一下:6 G) R, ?7 I' T' S7 R+ g% x

9 }, }( o5 A* [+ m- nF1中为“RS485_UART->SR=0x00;”,SR寄存器,只有16位0 q9 m4 n: p4 b: z4 g' |

, E) s7 g5 r; T$ A而F0中则为“RS485_UART->ISR=0x00C0; ”,ISR寄存器,有32位
1 o( w2 U' X0 H# B, C- [0 @- \
# f  R$ T$ E+ t0 x) }. y这些好像不是必要的,具体的功能可以看一下数据手册里怎么介绍的...似乎是中断接收标志位?0 q: O! `9 |4 _5 f% s
  x0 }8 ^( P. h- p+ i- [
    5.中断向量表的重映射
+ t' O7 ]3 f- S9 ^- j8 n    如果你的项目用到了软件bootloader,中断向量表就得重映射,而F1中有函数可以直接用,然后你会发现F0中没有
* x' L; @6 R/ K* `4 ~, _8 P( B5 y# W8 m! X: L
    F1中的函数:* k0 I( o" |( @. R* a" x: h

$ h8 I$ p* `/ y& S    NVIC_SetVectorTable(NVIC_VectTab_FLASH, BSP_ADDR_Boot);
5 G% g, w; u3 Z* e# h( @0 T2 j4 C* R' m7 z4 [9 ~( S8 P

# f4 Z+ h9 t3 ^3 f    通过查资料得知我们可以用memcpy,将中断向量表拷贝到ram下(F0的中断向量表可以放在RAM中),然后保证存储中断向量表的这部分不会被修改就行了,方法在上面这个网址中。# N" ^' I) T9 s
  i  i  K; O: C4 R; k
    F0中的函数:
5 ?# V* j; ?. y; I4 K
; _. |& z+ x9 t4 l  E    memcpy((void*)0x20000000, (void*)0x08000000, VECTOR_SIZE);/ O& Y# I# ], v9 ~9 _( X* M) t
    SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);" Z4 c. h; v! [- j# T" s

* x  H9 Y: y) |/ L    至于JTAG口的复用问题,STM32F0并不存在,可以将相应的函数删掉即可。
% f  t$ Y8 p7 a4 n* @: N  W' ?! c* o  P$ P# N2 h5 A
0 w7 W$ ?+ q3 e/ H8 |7 Q

! g* {, D. Z1 N; L: y
- c  p0 h6 ^5 |2 V' b/ p
* G; V, Z) C  [7 L
赞 收藏 评论0 发布时间:2021-11-20 22:00

举报

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