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

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

[复制链接]
STMCU小助手 发布时间:2021-11-20 22:00
这段时间在公司里做了一个移植的项目,是stm32f103c8t6——>stm32f070cbt6,管脚基本上一样,移植一下库就行了,大概是为了节省成本吧。一开始是懵逼的,以前从来没有移植过stm32,都是想用哪个功能,发现一个是F1一个是F4,就耍小聪明,把其中没有用到库函数的部分复制到另一个上,然后开始编啊编啊……现在遇到项目要做了没办法,网上也找不到资料(我是小白),只能自己硬着头皮改啦!
% Q1 w; V* s+ j( M
( u) f/ B+ ^$ z; m( w3 R    想想想,想到后来就是先创建一个工程再说吧!
! e3 k8 @- L: ^7 N5 s
: R% N. p5 G3 [6 N4 ~    于是乎,第一步来了:创建一个STM32F0的工程。0 a: m+ `! f& t% {  U2 X

# G5 v& B9 Z2 i% z    如果你在选择芯片的时候没有你想要的F0芯片,说明你没有那个pack,得下载一个,具体步骤不详细说了。
/ s4 M0 x* I& O9 h, N4 R1 d) ~+ V1 F* d) Q, W
    你需要用到的文件有:F0的库、F0的启动文件、F0的各种头文件、CORTEX-M0、系统文件……详细的不说了,对照图中的文件放就行了3 W" J. ~4 i4 }# r. ~

1 X- w4 A; R; M. `8 L7 J
20180725134343215.png
6 @3 Z0 C9 A+ T' h9 a3 N; O1 m- Z
3 B& b6 ~" ]' s5 H
    图中没有红线的不用管,其他都必须有,还有一些头文件没在上面,记得在设置——>C/C++里面引用一下,这些文件基本上在官网例程里都能下到。
  x5 |; a2 L# j5 }; f
& z) m' O- p9 e  M* K, n, t# @) Y% I    同时要在C/C++一栏里加这么一行字:USE_STDPERIPH_DRIVER,STM32F0XX_MD/ Z  Z- Y& w0 y) S4 Z* N5 O

7 f% e, E* v5 V) F+ [4 H, |
20180725134837925.png
/ G6 @4 i$ [' V9 F
3 y. U6 \" h  z$ c$ C0 x, y" m
    然后再把你自己的程序贴上去,一编译,肯定不会通过的拉,哈哈哈,但是会把你程序中F1用到的库函数和F0库中相冲突的地方显示出来,这时候你就只需要一个个改就成了。% k/ G8 u6 J, p4 T, j* d
+ M4 S% K3 {/ P2 Y9 N4 g
    1.GPIO.c方面
8 G# X& h. E3 V    gpio这方面比较简单,错误大部分都是引脚时钟设置、引脚的模式设置方面会出错误。
* r* D1 W4 p. O+ n7 g( ]
' V7 b3 a7 P# l# j    1.时钟的话由于F0库中没有使用PCLK作为GPIO时钟源的命令,所以一般都使用HCLK来作为GPIO的时钟源;* F: S6 h3 `* i* o- v& T% d/ T
  G7 P% O/ b) t+ t% c. Z
    2.引脚的模式设置方面你可以右键“GPIO_InitTypeDef”——>go to Definition看一下这个结构体里面的定义,比较一下F1和F0的设置的不同。
8 x5 t1 H. i$ F1 \( L5 c2 I
1 z  d; T" ?1 n; x) s" k0 B    这里放两种图,一张是F1的,一张是F0的GPIO设置,大家可以对比一下
; x; x9 x: i3 p" e/ c& u' }: ~
20180725135841124.png
; ]; M, [- r& _, u8 \4 G! N0 j

8 }  a' n$ m  D1 O; S$ C0 Q+ ~
4 _1 n9 ?  Q1 w1 j0 J- pF1 GPIO设置F0 GPIO设置
  @  L5 b6 {1 X- h# t2 k, k* ?& y; V6 Z, X  v
20180725140255219.png

. J, U' |* _2 }$ ~$ I9 h! y
' ]" n9 B! d  H3 S! x' |" j8 l    另外,如果引脚模式为AF_PP,复用输出模式时需要用函数配置一下复用的用途:7 L8 p0 A0 C* L
( O. A3 ]0 J# g* Z/ j+ u
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);GPIO_AF_1对应一些外设,比如说我这里用到了USART1,故要用GPIO_AF_1,你可以右键Definition看一下各个模式的定义。
8 z4 h! h# t+ a4 h( i; V8 A
: H& _7 }' ]: A) b; u: W    是不是感觉F0的设置很啰嗦,呵呵。
$ u8 J4 G  H8 p: h' k. d9 ]  s; h, Z0 C4 Y) m5 J
    2.MISC.c(NVIC,即中断)、EXTI.C(外部中断)" s. }/ x4 |& F
    1.模式设置
  f7 l3 k6 z: e# F$ ?9 G. w& o6 H: P7 p# j; W
    与GPIO模式配置差不多,修改方式大同小异。右键Definition一下“NVIC_InitTypeDef”、“EXTI_InitTypeDef”查看异同,相同不用改,不同就改,多删少补。
7 c9 ~3 V  a/ l
0 O( d3 V+ j! Y8 h4 C    还有在配置外部中断源时注意F1和F0是不同的,F1配得外部中断源在哪个通道范围,F0也得相应换:
6 d: d5 U' r1 Y0 F; U2 I7 w6 O1 r8 b. f2 [3 l& |! ^4 ?
    F1的中断源有:EXTI15_10_IRQn(10-15)、EXTI9_5_IRQn(5-9)、EXTI1_IRQn、EXTI2_IRQn……(1、2、3、4、5)3 A- {0 C  f; Y2 D4 S( e

+ t% @% ^+ y, d9 q2 q5 |; A$ W0 K    F0的中断源有:EXTI0_1_IRQn(0-1)、EXTI2_3_IRQn(2-3)、EXTI4_15_IRQn(4-15)- I/ n! T( q0 E' O# r

* }! K* b/ }  [+ A. j' N8 G' Q    F1的中断源比如说是EXTI15_10_IRQn,那在F0中就得配EXTI4_15_IRQn,如果不在范围中,就得看你外部中断的引脚了,中断源和你引脚号相同
7 s7 {, L4 m0 [& E* n1 N% p  o5 D# Q7 H; {" d  W' }
    3.定时器方面
8 ~5 J( L( j& T  k, |2 r    这部分由于项目中没有用到,我这里也不敢乱贴以致误导。相信小伙伴们上面的会改了,这个也不是难事,大部分都是修改模式配置的问题。- E! l% n- C! S% Z  \/ p5 \/ i' W4 C

1 p5 h/ j- e; Y7 m    4.USART.c方面
: r  c# k. T, R( }3 _    串口配置首先是GPIO的配置和中断方面的配置,上面已经有方法了。这里的模式配置MS是不需要改的:
$ P5 X4 j! |6 m3 H- ?* `  o  H5 q4 b$ R5 k! V9 t
    F0:
' i1 f/ m, u: q0 _) i  z5 H: I
- J& D; H; y4 ?- `; ~% F2 ^* f( ?
  1. /* USART1 mode config */4 Q, k$ Y. h' o5 D( S; J$ i5 U9 h
  2.     USART_InitStructure.USART_BaudRate = bps;
    ! N& d) n) W- Z, b8 D6 }
  3.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    ( l0 a/ q" [, Z! `4 H: A/ d
  4.     USART_InitStructure.USART_StopBits = USART_StopBits_1;2 F3 T- t2 y* a0 s3 N
  5.     USART_InitStructure.USART_Parity = USART_Parity_No ;
    2 ?) k# V5 A: }" `% S% W! k) h
  6.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    6 C2 d0 {1 y) Q: g
  7.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;8 i( \+ O: u" ^3 G: @
  8.     USART_Init(RS485_UART, &USART_InitStructure);
    / E) W' B3 M# n2 }5 `* i( A0 x# p
  9.     USART_ITConfig(RS485_UART, USART_IT_RXNE, ENABLE);
    , r2 C; m) G( x$ r7 E

  10. , c4 a% ]6 c* c1 j* D) a
  11.     USART_Cmd(RS485_UART, ENABLE);
复制代码

5 n5 S6 y6 T% m/ k6 E9 r2 n) o* `    F1:
  @& s6 R  m/ R( N8 Y) ?( _9 b, A% v, `( m8 ]- U6 X3 U# c$ P
  1. /* USART1 mode config */5 e  \5 k% Z5 g& @9 ]# L
  2.     USART_InitStructure.USART_BaudRate = bps;0 F8 ~+ q- p" Y3 ?! x
  3.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;$ P& ~0 `! |: y/ U, c6 I3 N
  4.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
    & T6 b2 C8 v: {- d9 e& h
  5.     USART_InitStructure.USART_Parity = USART_Parity_No ;% Y. z( }7 V" O0 R, B
  6.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    2 w4 }% l. K4 o" m& k' c) u
  7.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    ( `  C4 X5 O$ W  M6 }$ Z
  8.     USART_Init(RS485_UART, &USART_InitStructure);0 A, d. o# _) E& q' y9 P' D9 x* E$ H
  9.     USART_ITConfig(RS485_UART, USART_IT_RXNE, ENABLE);8 O( r9 v5 W1 B; b: }2 H6 X4 k
  10. - g$ N  b& O& @- A
  11.     USART_Cmd(RS485_UART, ENABLE);
复制代码
   嗯....一样一样的。注意这里有个寄存器是不一样的:( l7 V& z; d' I0 i" t& o! [
0 L) ]$ p) Z5 _; r
就是在接收中断中,有些项目可能需要将这个寄存器重置一下:
+ F6 z/ t+ Y8 p, W- _
+ q+ ~0 K! J6 k" K/ v) GF1中为“RS485_UART->SR=0x00;”,SR寄存器,只有16位
% E: z: B: `% `" P2 T& f! G. J1 Q, a! u$ O  E; r
而F0中则为“RS485_UART->ISR=0x00C0; ”,ISR寄存器,有32位
9 n. H& H' l* z7 ~3 N, v" N- p; v* m& w: v/ P) m
这些好像不是必要的,具体的功能可以看一下数据手册里怎么介绍的...似乎是中断接收标志位?! O$ n& D! {4 }$ `9 W
* o+ n6 q" k+ H' Z
    5.中断向量表的重映射- e5 g8 A3 _/ _
    如果你的项目用到了软件bootloader,中断向量表就得重映射,而F1中有函数可以直接用,然后你会发现F0中没有
' C  [) `# J' q/ j; ~( d" H# ]0 S3 a
9 H" b0 x( i  P9 f1 G9 l2 F    F1中的函数:
' u" z: \# y% o' b$ J$ s& T, p- Z  |1 T) o6 X/ e/ J
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, BSP_ADDR_Boot);4 V1 j# B' z7 J# z7 y0 B

1 m7 r- i. c; E" r1 I$ o0 [  V7 O! P6 I7 j5 R
    通过查资料得知我们可以用memcpy,将中断向量表拷贝到ram下(F0的中断向量表可以放在RAM中),然后保证存储中断向量表的这部分不会被修改就行了,方法在上面这个网址中。
8 J$ w1 S7 w0 k% S- \* r
! A- w) R3 i  M2 @9 l    F0中的函数:2 f$ X0 \( Q. i9 H9 C

6 H: m4 [9 H6 w- j& E3 b    memcpy((void*)0x20000000, (void*)0x08000000, VECTOR_SIZE);0 y0 a- i) S' T$ v. H- f" d7 J) _
    SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);
2 g  P) ]2 X2 g/ f; I; j1 U6 k5 u$ \% l- a; g2 v
    至于JTAG口的复用问题,STM32F0并不存在,可以将相应的函数删掉即可。
  @6 l7 @& M# p# k, z* ^/ h+ ?4 Z$ a  Z  |) p" h5 J

& M& v4 k; q0 C$ r4 ]+ ~1 M$ t
" a# c, z/ ]+ n1 o( Y' X& U9 _; g' ~. Q' b4 Z
5 r4 L" E4 S6 ?4 Q! r1 b
赞 收藏 评论0 发布时间:2021-11-20 22:00

举报

0个回答

所属标签

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