请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
STMCU小助手 发布时间:2021-11-20 22:00
这段时间在公司里做了一个移植的项目,是stm32f103c8t6——>stm32f070cbt6,管脚基本上一样,移植一下库就行了,大概是为了节省成本吧。一开始是懵逼的,以前从来没有移植过stm32,都是想用哪个功能,发现一个是F1一个是F4,就耍小聪明,把其中没有用到库函数的部分复制到另一个上,然后开始编啊编啊……现在遇到项目要做了没办法,网上也找不到资料(我是小白),只能自己硬着头皮改啦!
% {/ {6 T, P9 _$ p6 B1 q3 I! F( M# w$ S3 u; ]# A$ _7 P) |; c  \% p6 Y
    想想想,想到后来就是先创建一个工程再说吧!2 i! K2 u( v0 l) U4 s( J

9 u0 x* l: A' \  ^5 j    于是乎,第一步来了:创建一个STM32F0的工程。
& ]8 Z. F8 o3 B9 k% o" }% H( h0 l3 c& w* X3 ]9 x6 z( t
    如果你在选择芯片的时候没有你想要的F0芯片,说明你没有那个pack,得下载一个,具体步骤不详细说了。
3 c2 D( q! Y9 i5 s% h$ J9 M: c) w& g  L2 Z  y6 }5 p) _4 ]
    你需要用到的文件有:F0的库、F0的启动文件、F0的各种头文件、CORTEX-M0、系统文件……详细的不说了,对照图中的文件放就行了# Y3 z# N6 t6 t! f7 a% q+ b

% D& r9 |6 G% Z2 b& o9 u$ b2 @) }' b. v
20180725134343215.png

) G% f+ k4 _" {1 d# q9 Z; c3 p9 Y
' @3 ~" l9 b  ]5 b* M    图中没有红线的不用管,其他都必须有,还有一些头文件没在上面,记得在设置——>C/C++里面引用一下,这些文件基本上在官网例程里都能下到。5 {9 ^$ D: Z' X4 M9 |" ^1 t" U/ I
1 q5 [; g6 A  Y+ X2 c8 Y# K( i
    同时要在C/C++一栏里加这么一行字:USE_STDPERIPH_DRIVER,STM32F0XX_MD* O5 s; M2 L1 H. K$ |
! K3 r6 P! J$ {
20180725134837925.png
( L4 z% O/ v/ u! r' E

5 o' D( i2 u2 [1 q% e" m    然后再把你自己的程序贴上去,一编译,肯定不会通过的拉,哈哈哈,但是会把你程序中F1用到的库函数和F0库中相冲突的地方显示出来,这时候你就只需要一个个改就成了。
! a0 ^1 ~0 l" g  [( t2 w; n6 [& P. O
. F7 b9 o- P: C* V2 ], E: U, M( }    1.GPIO.c方面
  k7 Z7 i! d9 n/ t* x7 [8 y    gpio这方面比较简单,错误大部分都是引脚时钟设置、引脚的模式设置方面会出错误。& x* s7 w3 }3 D9 n+ ^. v
  n8 V3 Y% q" }; u( M8 J
    1.时钟的话由于F0库中没有使用PCLK作为GPIO时钟源的命令,所以一般都使用HCLK来作为GPIO的时钟源;  g. c+ Q" T; ]7 I% A) o/ h+ K: d
  a$ ~, j' |; v9 t* \
    2.引脚的模式设置方面你可以右键“GPIO_InitTypeDef”——>go to Definition看一下这个结构体里面的定义,比较一下F1和F0的设置的不同。3 u+ y2 _6 ^, d! V6 u
' K$ N. a+ B* I
    这里放两种图,一张是F1的,一张是F0的GPIO设置,大家可以对比一下( N5 c0 _* K5 l! t+ `4 k( b$ }
20180725135841124.png
9 `0 g1 A. P6 F. C0 ?

9 n6 B7 [$ u9 p* f
7 t  \% n' R. fF1 GPIO设置F0 GPIO设置
1 v' j  i' O2 w# g) |" A- U
, @: x) u$ s9 |  C5 V- _
20180725140255219.png
" ]# s8 v4 \# u6 p

; L: k0 ]. ]4 o0 G" A( X    另外,如果引脚模式为AF_PP,复用输出模式时需要用函数配置一下复用的用途:$ y+ J  v- s' W$ w( }6 r" U
) J' }3 L4 |2 W
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);GPIO_AF_1对应一些外设,比如说我这里用到了USART1,故要用GPIO_AF_1,你可以右键Definition看一下各个模式的定义。2 Q% v3 l# T0 Y0 R& K
  r0 r7 d3 G1 P/ y
    是不是感觉F0的设置很啰嗦,呵呵。9 M* |( i) h6 q8 u

3 T: M2 |* F, S" Y% L    2.MISC.c(NVIC,即中断)、EXTI.C(外部中断)/ k% V/ |% A( |7 }2 e0 G
    1.模式设置* U4 Z2 J2 L% y  X* W/ L& T. q" ]
% T) Y; Z6 p* W, q  E, L+ W
    与GPIO模式配置差不多,修改方式大同小异。右键Definition一下“NVIC_InitTypeDef”、“EXTI_InitTypeDef”查看异同,相同不用改,不同就改,多删少补。
5 B  P( ?" g; F! \+ N
, |& x5 x. E% \& y+ X- Q    还有在配置外部中断源时注意F1和F0是不同的,F1配得外部中断源在哪个通道范围,F0也得相应换:
. Y' W: f% i" h* b0 v7 n
. [& e5 r: N9 R' ^2 Y- I    F1的中断源有:EXTI15_10_IRQn(10-15)、EXTI9_5_IRQn(5-9)、EXTI1_IRQn、EXTI2_IRQn……(1、2、3、4、5)
* P$ U' m9 c8 C( N. O
) J& t, ~3 x( c  g. G7 F" S4 m    F0的中断源有:EXTI0_1_IRQn(0-1)、EXTI2_3_IRQn(2-3)、EXTI4_15_IRQn(4-15)
8 W; D5 x8 K1 B! x5 b/ u# l; u/ |! ?0 t( G# r/ [. T
    F1的中断源比如说是EXTI15_10_IRQn,那在F0中就得配EXTI4_15_IRQn,如果不在范围中,就得看你外部中断的引脚了,中断源和你引脚号相同
, }, d+ ^" i. G* o
8 b/ w5 O4 }% h8 ?7 `: X: O    3.定时器方面- \9 r( p6 D0 Z4 o+ a3 {6 V5 F
    这部分由于项目中没有用到,我这里也不敢乱贴以致误导。相信小伙伴们上面的会改了,这个也不是难事,大部分都是修改模式配置的问题。- I5 I' f2 w5 S* h

. f% ?1 {. K& R5 C3 Y0 E0 B    4.USART.c方面  H( `- ~0 s! M, K: e2 s) O
    串口配置首先是GPIO的配置和中断方面的配置,上面已经有方法了。这里的模式配置MS是不需要改的:
. N& `( @+ Q7 r
$ i* b/ K3 a( a3 a) r    F0:0 f) B) x  m& [

2 E1 g* v6 v0 u, I
  1. /* USART1 mode config */
    $ b* t8 p* I, ~  k
  2.     USART_InitStructure.USART_BaudRate = bps;9 g$ e+ H$ X) T0 m# q0 ]
  3.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    - [/ l- ^. K5 J
  4.     USART_InitStructure.USART_StopBits = USART_StopBits_1;) u1 g0 S. {+ `% D3 l- K
  5.     USART_InitStructure.USART_Parity = USART_Parity_No ;
    $ B/ F, X6 p3 y" ~
  6.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;' G9 G. d8 ^2 a! q1 ~: _% i2 l: `
  7.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    ; A2 p. ?! F+ i9 l5 E
  8.     USART_Init(RS485_UART, &USART_InitStructure);0 s8 K/ c. K" y- E$ o# e, U* N. A
  9.     USART_ITConfig(RS485_UART, USART_IT_RXNE, ENABLE);
    # Z" s6 l  \. f! l( w8 ?. C2 }

  10. 9 Y: P: w+ r, ?8 _5 X6 Y5 D/ d
  11.     USART_Cmd(RS485_UART, ENABLE);
复制代码

# E7 G0 f: j4 P1 [    F1:
; \4 G1 s/ r. Q& [" i* z, \( q- Q, _$ u- ^. W
  1. /* USART1 mode config */
    $ A1 U0 r  Z1 t9 g/ G
  2.     USART_InitStructure.USART_BaudRate = bps;
    3 h3 Q" P% d# S' ^4 J
  3.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;9 Z7 \4 b- k. D4 x6 h  P
  4.     USART_InitStructure.USART_StopBits = USART_StopBits_1;  j) g' ^9 {9 {5 _3 Q: s% E. W: E/ n
  5.     USART_InitStructure.USART_Parity = USART_Parity_No ;
    ' t1 @/ x( Y0 v2 K& X
  6.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    5 ]$ y: ]$ N4 B  S' t
  7.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    4 x$ O& g) ~" B( |: ]1 ], H7 ]
  8.     USART_Init(RS485_UART, &USART_InitStructure);
    # n8 [  i# @) b8 w( n7 e4 p
  9.     USART_ITConfig(RS485_UART, USART_IT_RXNE, ENABLE);" b/ R5 `# j, m5 T1 J( T' ^* a
  10. + z7 r( x6 j8 @
  11.     USART_Cmd(RS485_UART, ENABLE);
复制代码
   嗯....一样一样的。注意这里有个寄存器是不一样的:
. @. I, W4 @, U/ F3 `- W( ]" l7 e% V& T# y# l" t4 t# x  Q. y8 _
就是在接收中断中,有些项目可能需要将这个寄存器重置一下:" k% g& G# F6 m! D; I& m2 I$ W
1 t1 S& G7 w4 v* z0 a2 ~  G
F1中为“RS485_UART->SR=0x00;”,SR寄存器,只有16位
6 G1 x! @; s, r+ I% {0 L' @- r
9 R! I9 `, x( n9 G3 A而F0中则为“RS485_UART->ISR=0x00C0; ”,ISR寄存器,有32位9 v+ V" M" e) s$ Y+ t

2 X$ T+ e& }7 H9 J) X' e! T( v这些好像不是必要的,具体的功能可以看一下数据手册里怎么介绍的...似乎是中断接收标志位?9 w' W( a. d! \3 ]+ ?

; s4 F$ F: c) c" E' V. F" t    5.中断向量表的重映射
1 v  j2 N. Q1 ?# Y# A    如果你的项目用到了软件bootloader,中断向量表就得重映射,而F1中有函数可以直接用,然后你会发现F0中没有
: z* p) s( Z" S9 g/ m  h6 F" g6 V  T1 i- D, D! ?- ~9 t
    F1中的函数:4 m1 }, p& v" I

1 N9 u, I% [) ^& Y- Y8 d; [    NVIC_SetVectorTable(NVIC_VectTab_FLASH, BSP_ADDR_Boot);
" k# Y1 {  y1 i9 J
8 o7 f* T" m  G+ h  C' {+ P. U' B4 {4 a7 r* T0 ]1 Y
    通过查资料得知我们可以用memcpy,将中断向量表拷贝到ram下(F0的中断向量表可以放在RAM中),然后保证存储中断向量表的这部分不会被修改就行了,方法在上面这个网址中。' b' v/ ?' `& g. @6 ~( p
* C8 \/ E' S* h0 F* }' `/ N
    F0中的函数:
# `) Q  [) q4 w) m3 x3 ]" p2 `" @( C) T6 h( ]. F% f$ ]
    memcpy((void*)0x20000000, (void*)0x08000000, VECTOR_SIZE);
. h: V6 t  d9 |    SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);
( U( T, V2 [) S, B8 ~6 @
" [7 W! C( m  \7 [5 C2 p    至于JTAG口的复用问题,STM32F0并不存在,可以将相应的函数删掉即可。
6 n7 W% Y% H- D; Z
( K% p1 ^% j) [! V# e8 P3 J& ]9 M
/ P/ s; Y, \8 D$ F* x/ O
/ ], ~0 \5 h) N; Q1 I( m3 K

3 c0 f2 P, J! p: P' |5 Y
收藏 评论0 发布时间:2021-11-20 22:00

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版