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

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

[复制链接]
STMCU小助手 发布时间:2021-11-20 22:00
这段时间在公司里做了一个移植的项目,是stm32f103c8t6——>stm32f070cbt6,管脚基本上一样,移植一下库就行了,大概是为了节省成本吧。一开始是懵逼的,以前从来没有移植过stm32,都是想用哪个功能,发现一个是F1一个是F4,就耍小聪明,把其中没有用到库函数的部分复制到另一个上,然后开始编啊编啊……现在遇到项目要做了没办法,网上也找不到资料(我是小白),只能自己硬着头皮改啦!
3 o; B0 ^% ?# I2 k7 X8 X* h9 m8 B5 a% `2 P1 |2 B7 M+ n
    想想想,想到后来就是先创建一个工程再说吧!1 s8 B3 D- a/ z- F, l* K

( O! `, Y' t6 {' s. P' A& u& f    于是乎,第一步来了:创建一个STM32F0的工程。
" M  g) v& \5 \2 X# r  ?  m6 @7 X: N( U  m( b5 t  z8 |8 N
    如果你在选择芯片的时候没有你想要的F0芯片,说明你没有那个pack,得下载一个,具体步骤不详细说了。
+ Z6 j9 ]) t; a- L  @  f/ F- k& N$ N* y2 g( Z
    你需要用到的文件有:F0的库、F0的启动文件、F0的各种头文件、CORTEX-M0、系统文件……详细的不说了,对照图中的文件放就行了
* P8 Y: H/ r0 f+ _+ U7 ^" t2 I
9 W, w& @+ d3 m9 u
20180725134343215.png

3 S; B5 d* ^' N" S2 }
( c6 Z: p! V% I' M$ s) Y# L    图中没有红线的不用管,其他都必须有,还有一些头文件没在上面,记得在设置——>C/C++里面引用一下,这些文件基本上在官网例程里都能下到。3 q3 o! y3 V* m# ]9 \- v0 y+ a

% F* m. v) [6 _0 w# B    同时要在C/C++一栏里加这么一行字:USE_STDPERIPH_DRIVER,STM32F0XX_MD
9 v) o7 I% N' s8 f# C
/ I) ?9 L& `+ ?+ i+ L
20180725134837925.png

  W: n& M  `: p
7 G: O. M0 k; V    然后再把你自己的程序贴上去,一编译,肯定不会通过的拉,哈哈哈,但是会把你程序中F1用到的库函数和F0库中相冲突的地方显示出来,这时候你就只需要一个个改就成了。2 u- p  ?0 v9 {/ M" A0 Q
. Y+ v9 d5 t5 Z) T
    1.GPIO.c方面
0 N$ K/ T  k. q    gpio这方面比较简单,错误大部分都是引脚时钟设置、引脚的模式设置方面会出错误。
4 c9 Y7 |: J2 l* c2 s. Y1 Z6 k+ t& o
    1.时钟的话由于F0库中没有使用PCLK作为GPIO时钟源的命令,所以一般都使用HCLK来作为GPIO的时钟源;8 p6 Z, J. l" g# I* F, v
* x# v+ V6 d. V; {) o+ Z
    2.引脚的模式设置方面你可以右键“GPIO_InitTypeDef”——>go to Definition看一下这个结构体里面的定义,比较一下F1和F0的设置的不同。9 C$ F$ r* S5 B$ n) m

# g  c9 |. Q( c& h    这里放两种图,一张是F1的,一张是F0的GPIO设置,大家可以对比一下
* @5 ?- ?8 H( T2 m! |& u
20180725135841124.png

2 d9 y) A9 A2 N# L/ S5 Y6 j: u6 h" g6 u1 r$ W* B2 |7 d
. g. B3 k% e6 m( a! z
F1 GPIO设置F0 GPIO设置
5 K5 Y! d, c: e7 O1 C) O- t. q& o& ^( D; Y/ R6 q  _+ o$ {8 i
20180725140255219.png

# ]/ t7 _* g9 E* ^, C4 E2 ~
# y) g9 r1 i0 c& S% ^    另外,如果引脚模式为AF_PP,复用输出模式时需要用函数配置一下复用的用途:
$ ]. a+ B# N/ Y/ y! D: O9 a# L
3 K8 S) u0 B; N/ N+ U+ A+ k7 P" D    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);GPIO_AF_1对应一些外设,比如说我这里用到了USART1,故要用GPIO_AF_1,你可以右键Definition看一下各个模式的定义。2 X- ?7 g! g8 A4 n

* B" }* h9 {3 n, A' S    是不是感觉F0的设置很啰嗦,呵呵。/ K$ b/ ]4 r! c

8 M1 ?5 v1 U* @) N8 Q" ], j    2.MISC.c(NVIC,即中断)、EXTI.C(外部中断)
1 Z9 ?2 V' `8 H1 `3 R/ Q    1.模式设置! Y, K! l# h, x9 o4 y7 @
" e: B! S) a, q3 Y- i* a
    与GPIO模式配置差不多,修改方式大同小异。右键Definition一下“NVIC_InitTypeDef”、“EXTI_InitTypeDef”查看异同,相同不用改,不同就改,多删少补。
% n3 W1 A3 X% U0 Z  I0 [3 I+ I2 j7 x; N( k& o8 U  F. U) \
    还有在配置外部中断源时注意F1和F0是不同的,F1配得外部中断源在哪个通道范围,F0也得相应换:
7 W6 Q* S" n, i) v/ J0 O: N% e  ~" e6 \+ n5 r; Q
    F1的中断源有:EXTI15_10_IRQn(10-15)、EXTI9_5_IRQn(5-9)、EXTI1_IRQn、EXTI2_IRQn……(1、2、3、4、5)
$ Y+ E6 q1 y5 L/ K2 \& {, X$ [, T8 g7 ^+ I. J& |, I$ R
    F0的中断源有:EXTI0_1_IRQn(0-1)、EXTI2_3_IRQn(2-3)、EXTI4_15_IRQn(4-15)
, D4 J) o/ H- K/ P! q; n# `9 C3 a' y- t
& |5 b' G7 I' |- {/ Q+ i/ S    F1的中断源比如说是EXTI15_10_IRQn,那在F0中就得配EXTI4_15_IRQn,如果不在范围中,就得看你外部中断的引脚了,中断源和你引脚号相同
. `! ^, A% ~/ {, X" z3 g: o8 S6 G  n# b8 H+ x
    3.定时器方面+ S3 U5 e& J: h% L
    这部分由于项目中没有用到,我这里也不敢乱贴以致误导。相信小伙伴们上面的会改了,这个也不是难事,大部分都是修改模式配置的问题。0 b' {& }, f6 l( f$ X
0 R$ b$ L( x2 W9 U9 ^) |
    4.USART.c方面+ Y- O% ?4 R& V
    串口配置首先是GPIO的配置和中断方面的配置,上面已经有方法了。这里的模式配置MS是不需要改的:5 ]) {/ ?4 h  Y- A) s* [- c

0 W; V9 C4 U7 |7 s! Y    F0:
# n6 S% M9 `# B" {/ B2 @' Y
2 w$ O. f2 g7 W# k: S% X/ R0 G) P
  1. /* USART1 mode config */
    * ^8 \  n4 b( U
  2.     USART_InitStructure.USART_BaudRate = bps;
    % [% ?' o# [6 [3 O( p: T
  3.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    6 M$ ~  i! X9 O& _$ l3 l1 m, Z( d
  4.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
    $ `) O0 o8 c, Z% U: }8 _' H
  5.     USART_InitStructure.USART_Parity = USART_Parity_No ;# V+ Q/ r% i2 X( l4 u! k( a& f) K
  6.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;' k( P# t" k  p4 n' W
  7.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    . t- P1 b2 d( m9 j) P
  8.     USART_Init(RS485_UART, &USART_InitStructure);
    - A: @  W7 N( N' T$ a/ `
  9.     USART_ITConfig(RS485_UART, USART_IT_RXNE, ENABLE);, j. I, T, u7 p! X4 i& m) R

  10. 6 B& C& M2 {6 F4 M5 w+ k
  11.     USART_Cmd(RS485_UART, ENABLE);
复制代码
9 g/ [, a% F& @
    F1:
8 B. \  u! O! F; ~2 g- D' t( A% j' o7 {. Y4 m
  1. /* USART1 mode config */& ^# T4 W2 p; M& r% F3 Q, A, ?
  2.     USART_InitStructure.USART_BaudRate = bps;
    " ^/ j2 p+ i% z, o% Y- x* b. q4 i7 R
  3.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;3 R' ?7 H" L% U( l5 ^" O1 z
  4.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
    ; S% m6 u+ C+ b) j
  5.     USART_InitStructure.USART_Parity = USART_Parity_No ;
    . M4 l  f1 Z7 |) I0 [
  6.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    * j2 k9 ^. Y1 O
  7.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    2 K+ Y' ?# R- U5 U+ Y0 T
  8.     USART_Init(RS485_UART, &USART_InitStructure);. G& }8 M6 u  w6 N& u- [
  9.     USART_ITConfig(RS485_UART, USART_IT_RXNE, ENABLE);% r. R, `. d& U

  10. 0 O/ P! l( z3 i4 m7 r
  11.     USART_Cmd(RS485_UART, ENABLE);
复制代码
   嗯....一样一样的。注意这里有个寄存器是不一样的:% H2 \  g+ P- @& ^% @4 Y$ N
- S7 v2 ^6 Y" l6 c5 N7 M$ x
就是在接收中断中,有些项目可能需要将这个寄存器重置一下:7 y( h; v2 g+ \9 A) A1 n% x
8 S! t4 n5 ^) E3 y* Z! Z
F1中为“RS485_UART->SR=0x00;”,SR寄存器,只有16位
5 x8 C) a( E. |! b. S: l- f/ f) h8 H3 ^+ ~
而F0中则为“RS485_UART->ISR=0x00C0; ”,ISR寄存器,有32位
+ W/ l5 ^% J0 V: I" V  B0 o9 D1 s1 f& P4 a% z# n2 A: Q
这些好像不是必要的,具体的功能可以看一下数据手册里怎么介绍的...似乎是中断接收标志位?, ~, r. F+ q% B/ x
) q; a5 D' q! R  ^/ g9 i5 D- @1 h
    5.中断向量表的重映射% X) V- ^; {# P" f$ @1 E" n4 ]$ I7 j
    如果你的项目用到了软件bootloader,中断向量表就得重映射,而F1中有函数可以直接用,然后你会发现F0中没有
- E3 n# l, ]1 y% o
4 x2 h5 o* [/ M$ r9 O- ~    F1中的函数:6 G! ?4 C) D# T2 Y/ x  k  `
; }& T- x! k9 s) A
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, BSP_ADDR_Boot);' C* [  D( u9 @) X6 l

) t9 e) t, S/ S+ @# W6 a/ J
; `* C4 L3 K4 A: H    通过查资料得知我们可以用memcpy,将中断向量表拷贝到ram下(F0的中断向量表可以放在RAM中),然后保证存储中断向量表的这部分不会被修改就行了,方法在上面这个网址中。/ ^1 G% u7 n4 \% x6 X
+ T, V1 A$ W- X; {/ `- c1 c
    F0中的函数:
4 u) F/ o4 S5 d: ?) B, }
; ~- C& l# B3 I, ]6 Y; F0 E    memcpy((void*)0x20000000, (void*)0x08000000, VECTOR_SIZE);
$ Q$ l$ ~; |/ E1 ], i# _1 u6 h    SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);
, a" w) O3 y7 e9 Q% h: i+ B0 Y8 t: D% ^9 n! u
    至于JTAG口的复用问题,STM32F0并不存在,可以将相应的函数删掉即可。' c. I5 H2 G* v0 [, y
& e( m6 B" g1 |. o8 ~. Y  Q
: u( c  Z. A$ U* w  W3 i8 j

' S7 s  d) x2 l) U% X- p& c" z* Z: T2 g, m
. V) H5 X* O4 N$ a
赞 收藏 评论0 发布时间:2021-11-20 22:00

举报

0个回答

所属标签

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