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

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

[复制链接]
STMCU小助手 发布时间:2021-11-20 22:00
这段时间在公司里做了一个移植的项目,是stm32f103c8t6——>stm32f070cbt6,管脚基本上一样,移植一下库就行了,大概是为了节省成本吧。一开始是懵逼的,以前从来没有移植过stm32,都是想用哪个功能,发现一个是F1一个是F4,就耍小聪明,把其中没有用到库函数的部分复制到另一个上,然后开始编啊编啊……现在遇到项目要做了没办法,网上也找不到资料(我是小白),只能自己硬着头皮改啦!
6 W) Y9 A7 s; y- p# a1 i- R
, e# o. G) C/ r2 i$ q  j    想想想,想到后来就是先创建一个工程再说吧!5 G' `% }+ u3 g$ @
6 [+ Q, z/ V8 E( C- ]: ]! q
    于是乎,第一步来了:创建一个STM32F0的工程。
3 {4 @! {7 t. V) j! z
. W7 l* s0 m0 T2 R. P    如果你在选择芯片的时候没有你想要的F0芯片,说明你没有那个pack,得下载一个,具体步骤不详细说了。% f; {; ]; H0 V2 q
9 \- w+ b* K& q) m: F
    你需要用到的文件有:F0的库、F0的启动文件、F0的各种头文件、CORTEX-M0、系统文件……详细的不说了,对照图中的文件放就行了
( {9 D" z  |- N# a% w9 ?- {3 {- r/ M8 a0 H
20180725134343215.png
" T- b5 E9 U/ P7 B! A- T7 _3 J
" F. N+ A: B: Y2 q( W$ u
    图中没有红线的不用管,其他都必须有,还有一些头文件没在上面,记得在设置——>C/C++里面引用一下,这些文件基本上在官网例程里都能下到。
9 l% H7 z  |: X- R! F! }* ?3 h2 [2 s/ Q
    同时要在C/C++一栏里加这么一行字:USE_STDPERIPH_DRIVER,STM32F0XX_MD
! d2 w6 ~: W' j0 Y( ~( S+ z, c, |6 J5 ^
20180725134837925.png

) @& E# W( t0 F0 K  y+ E" T  D  \' k2 X2 |* G6 W9 q
    然后再把你自己的程序贴上去,一编译,肯定不会通过的拉,哈哈哈,但是会把你程序中F1用到的库函数和F0库中相冲突的地方显示出来,这时候你就只需要一个个改就成了。+ i) G& {$ K! K% f, Q9 s

6 |% u$ |* m) r5 [1 H    1.GPIO.c方面
( k  `6 k' h- \9 o3 `    gpio这方面比较简单,错误大部分都是引脚时钟设置、引脚的模式设置方面会出错误。
- P- A1 q+ O* a) `& L: m' |+ c! F) K
    1.时钟的话由于F0库中没有使用PCLK作为GPIO时钟源的命令,所以一般都使用HCLK来作为GPIO的时钟源;
$ s7 Z5 a5 b8 `9 S, v% y# N  I8 f; Y
    2.引脚的模式设置方面你可以右键“GPIO_InitTypeDef”——>go to Definition看一下这个结构体里面的定义,比较一下F1和F0的设置的不同。9 _  |1 B) M# d0 L  \! t

! {1 V# a( Z5 C3 ]1 z( {    这里放两种图,一张是F1的,一张是F0的GPIO设置,大家可以对比一下- I4 C% e3 ^5 m" D$ y2 v, I
20180725135841124.png
; d7 u* v2 D+ r# w
( A, e9 j5 y4 O$ \

. C" f6 X. Q% U' B5 D9 C6 w* x0 wF1 GPIO设置F0 GPIO设置: n6 Z( O( d& |. c0 H5 q+ _/ G+ K
1 q: ^# z' S# ?# S# @% T& w
20180725140255219.png

8 N1 k, o+ O% q1 P
/ s, _& P5 d5 G    另外,如果引脚模式为AF_PP,复用输出模式时需要用函数配置一下复用的用途:9 d# j6 J! _6 |; t- R

6 h; u. \3 K2 f" ?7 e    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);GPIO_AF_1对应一些外设,比如说我这里用到了USART1,故要用GPIO_AF_1,你可以右键Definition看一下各个模式的定义。' X4 C5 E; ^! r3 i

) |8 n$ l# U/ o. a    是不是感觉F0的设置很啰嗦,呵呵。
( }3 _* q; O) f
0 a% R0 ^- R7 }    2.MISC.c(NVIC,即中断)、EXTI.C(外部中断)
9 U: g9 [3 w5 l) U1 N9 s9 C. B    1.模式设置& P4 x. \! D7 U$ ^- X% Y4 ]

! H+ D; e( s1 @/ v$ L' @    与GPIO模式配置差不多,修改方式大同小异。右键Definition一下“NVIC_InitTypeDef”、“EXTI_InitTypeDef”查看异同,相同不用改,不同就改,多删少补。
% q6 O& J$ S* w" c: \( w' p
6 q8 x+ K% ?2 J* i6 [# L" \, y    还有在配置外部中断源时注意F1和F0是不同的,F1配得外部中断源在哪个通道范围,F0也得相应换:
1 C1 F+ w: w5 ~- P/ y! x# I( p0 O- v- T2 [0 D& e5 E3 i/ M2 I9 Y
    F1的中断源有:EXTI15_10_IRQn(10-15)、EXTI9_5_IRQn(5-9)、EXTI1_IRQn、EXTI2_IRQn……(1、2、3、4、5)$ [7 W: r% \+ n* b  Q: a! _$ ~

4 U% u0 J& s- ^9 `    F0的中断源有:EXTI0_1_IRQn(0-1)、EXTI2_3_IRQn(2-3)、EXTI4_15_IRQn(4-15)& a+ l9 Z6 Z5 \1 G5 X

- d/ Z( L" i8 i1 ^- F    F1的中断源比如说是EXTI15_10_IRQn,那在F0中就得配EXTI4_15_IRQn,如果不在范围中,就得看你外部中断的引脚了,中断源和你引脚号相同4 ~$ t; ^- P9 Z& O0 n* S& \! b' c- H
) a5 D0 }% P& @+ x
    3.定时器方面
0 W( w% Q0 x- M/ y0 \  P6 b7 w" Z    这部分由于项目中没有用到,我这里也不敢乱贴以致误导。相信小伙伴们上面的会改了,这个也不是难事,大部分都是修改模式配置的问题。4 J) q0 ]. C) C8 ?3 J" s, c" Q* D
: L+ B5 s: o0 ~9 T9 R/ E
    4.USART.c方面
& Y9 M7 z+ b2 P5 @7 B    串口配置首先是GPIO的配置和中断方面的配置,上面已经有方法了。这里的模式配置MS是不需要改的:
. q1 {2 m( S% f$ o" t4 q% L' C
/ l* P/ E! Y% m  b% T8 ?1 S# X. p    F0:* z/ P7 V3 A5 X8 s

; F5 E+ w: t% J
  1. /* USART1 mode config */- ?/ x5 M* ^$ {5 h  S+ }
  2.     USART_InitStructure.USART_BaudRate = bps;" J5 n- y% f+ r7 F
  3.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;' P  Q9 r: t0 \+ v0 u( x3 y
  4.     USART_InitStructure.USART_StopBits = USART_StopBits_1;! y, B% r) E* p
  5.     USART_InitStructure.USART_Parity = USART_Parity_No ;
    4 c0 B- J9 H) E, d1 m
  6.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;! y* ?1 `4 ^- w9 C
  7.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    * N$ d5 l5 F, c  n
  8.     USART_Init(RS485_UART, &USART_InitStructure);
    4 S4 ]" g1 R+ i$ V
  9.     USART_ITConfig(RS485_UART, USART_IT_RXNE, ENABLE);
    0 F7 Z7 t0 L) D3 T* c. x9 s: E2 n

  10. " `, `! l  o$ K& v5 l$ r0 |; M( r
  11.     USART_Cmd(RS485_UART, ENABLE);
复制代码
/ U2 W8 w& s2 s4 `/ L) d
    F1:
$ q( u5 m) O# Q. Z( _4 [  Z( W, \- `3 W8 b4 d& C" x" l" X
  1. /* USART1 mode config */
    7 ]$ P% B: F0 k3 s
  2.     USART_InitStructure.USART_BaudRate = bps;
    ; p& N) a; u, ]  P
  3.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    / p. `- @; h0 x4 u& B+ @
  4.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
    - U0 j2 @* A; X! h" A% b
  5.     USART_InitStructure.USART_Parity = USART_Parity_No ;
    1 s) x8 W/ O& l% H% i) X
  6.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    9 q8 u. j# y+ {, I! D$ o6 A2 m
  7.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    # [0 ^1 i/ d9 t0 `: j
  8.     USART_Init(RS485_UART, &USART_InitStructure);3 v; j0 s; X$ x8 M4 \
  9.     USART_ITConfig(RS485_UART, USART_IT_RXNE, ENABLE);9 v7 \5 y4 f9 N8 j

  10. " L+ I8 d1 k! M6 a
  11.     USART_Cmd(RS485_UART, ENABLE);
复制代码
   嗯....一样一样的。注意这里有个寄存器是不一样的:0 a- Y% c7 w* s0 d
3 S$ a' W8 i( P5 ?$ N- E3 P
就是在接收中断中,有些项目可能需要将这个寄存器重置一下:; _0 R/ E" ^% I( z4 r6 _

4 w% q6 u# x1 nF1中为“RS485_UART->SR=0x00;”,SR寄存器,只有16位
. b* @* S; L5 u5 ?6 z
. F9 c( ^9 o8 o. v而F0中则为“RS485_UART->ISR=0x00C0; ”,ISR寄存器,有32位+ i0 s; X! S7 m, G
* R$ ~  z0 W( l
这些好像不是必要的,具体的功能可以看一下数据手册里怎么介绍的...似乎是中断接收标志位?
4 |. ?2 X3 i; e2 y6 P. {! B( p3 Z% @& \- f. D  O, n- O
    5.中断向量表的重映射: o* v) X: e, J0 f8 P
    如果你的项目用到了软件bootloader,中断向量表就得重映射,而F1中有函数可以直接用,然后你会发现F0中没有
# B0 r* {6 d/ K2 j1 N: b% W- o6 M- Q4 L+ Y) z4 U( x+ E
    F1中的函数:
5 \/ ]0 S& L3 w& M8 M
; _+ O: R% w, {0 M    NVIC_SetVectorTable(NVIC_VectTab_FLASH, BSP_ADDR_Boot);
/ X) ^' |$ }7 T/ c* K3 B( F; C* C+ r* }% p4 ]
4 I- g3 l# x  |$ v; n6 n
    通过查资料得知我们可以用memcpy,将中断向量表拷贝到ram下(F0的中断向量表可以放在RAM中),然后保证存储中断向量表的这部分不会被修改就行了,方法在上面这个网址中。
* L# D+ T3 @7 l) ~, A9 F( X! u6 V: g: i' h0 B6 i
    F0中的函数:' I0 j" t3 i2 Y& t

9 M/ B- j5 _: Y2 L+ a1 A  J    memcpy((void*)0x20000000, (void*)0x08000000, VECTOR_SIZE);4 f0 L% m) ]- H6 s) s* L' t% a) U, C
    SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);; Z; w9 q* E& V8 d8 f9 Y, |* W

( s+ @: t+ W: d0 X, T9 y/ ^    至于JTAG口的复用问题,STM32F0并不存在,可以将相应的函数删掉即可。
: T% e6 e! l, j5 q& L% q) z6 Q3 g6 i

* ~! z) T" o& }% A" l% ?0 I! j+ y) i' g. Y' M. k) M9 z3 \
$ ^, e' D& l: b" q0 W$ c
8 i9 E) _6 W, N) Q
收藏 评论0 发布时间:2021-11-20 22:00

举报

0个回答

所属标签

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