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

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

[复制链接]
STMCU小助手 发布时间:2021-11-20 22:00
这段时间在公司里做了一个移植的项目,是stm32f103c8t6——>stm32f070cbt6,管脚基本上一样,移植一下库就行了,大概是为了节省成本吧。一开始是懵逼的,以前从来没有移植过stm32,都是想用哪个功能,发现一个是F1一个是F4,就耍小聪明,把其中没有用到库函数的部分复制到另一个上,然后开始编啊编啊……现在遇到项目要做了没办法,网上也找不到资料(我是小白),只能自己硬着头皮改啦!
! q% X7 f" H6 F! I2 i& o8 L! B
2 U. e" A$ e# O$ I) p; y    想想想,想到后来就是先创建一个工程再说吧!2 J8 C% ]4 |2 c- n3 Z9 k7 [
. n" ?+ ?. n4 }7 X( V. b# p
    于是乎,第一步来了:创建一个STM32F0的工程。
( {* G9 z- d" M; Y6 Z- Z- U, I3 d0 n" m
    如果你在选择芯片的时候没有你想要的F0芯片,说明你没有那个pack,得下载一个,具体步骤不详细说了。, ~; [' S1 G( [. a  E
* o( B4 k; {4 B2 B) s" C, A
    你需要用到的文件有:F0的库、F0的启动文件、F0的各种头文件、CORTEX-M0、系统文件……详细的不说了,对照图中的文件放就行了
) l4 F, V' J9 s8 T5 r
9 n; K) x& B0 b+ z1 F
20180725134343215.png
# W; f  g$ G+ x

( `9 f% P% b6 W- g  K! V    图中没有红线的不用管,其他都必须有,还有一些头文件没在上面,记得在设置——>C/C++里面引用一下,这些文件基本上在官网例程里都能下到。6 }0 b2 K2 N- Y6 L  h% i

/ b" J& g9 w5 P9 z+ n% Z& e* l+ u' K    同时要在C/C++一栏里加这么一行字:USE_STDPERIPH_DRIVER,STM32F0XX_MD) R1 _. U+ G. Q+ P! @0 f! `

) H  I3 D+ L4 l9 `0 X0 [
20180725134837925.png
8 ?  @/ h  p, b- N0 \9 F
; v9 O# m8 {% h& x; R1 }
    然后再把你自己的程序贴上去,一编译,肯定不会通过的拉,哈哈哈,但是会把你程序中F1用到的库函数和F0库中相冲突的地方显示出来,这时候你就只需要一个个改就成了。1 Z9 K( R8 W6 F* W  _- N

+ x3 W9 I. l4 ]  C' a+ Z; i    1.GPIO.c方面" W% N( j( H  P7 g& R
    gpio这方面比较简单,错误大部分都是引脚时钟设置、引脚的模式设置方面会出错误。& _6 |+ k' S; c' O! I  ]' N+ \
6 @, e' s2 H# }, h& u2 @
    1.时钟的话由于F0库中没有使用PCLK作为GPIO时钟源的命令,所以一般都使用HCLK来作为GPIO的时钟源;
( C0 \( \# j/ \5 A  F' v( M, Y2 l% X( T! S8 \" P6 @
    2.引脚的模式设置方面你可以右键“GPIO_InitTypeDef”——>go to Definition看一下这个结构体里面的定义,比较一下F1和F0的设置的不同。% X3 Z9 F) m9 Y& T2 t

$ V# S6 k4 {1 j& c* E    这里放两种图,一张是F1的,一张是F0的GPIO设置,大家可以对比一下- v3 E9 j, `2 o: ^+ c% }, h
20180725135841124.png
( v- M4 y! q3 D8 J1 a2 z' r! X  Y
& B6 P9 k4 r! c2 w6 f; U9 _- I
+ s: y9 x: W, L) f# O, ^
F1 GPIO设置F0 GPIO设置+ j8 x* Q# ^3 n* G$ w
3 w( Y; B! s8 S# A/ a, C
20180725140255219.png
6 I: g4 y( l3 K. l
% w; q) Z% ]. K5 n; [
    另外,如果引脚模式为AF_PP,复用输出模式时需要用函数配置一下复用的用途:
+ \# c& b% K4 a$ G$ l4 b' y6 C( ]+ H9 x$ v6 G  C% [" _! @
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);GPIO_AF_1对应一些外设,比如说我这里用到了USART1,故要用GPIO_AF_1,你可以右键Definition看一下各个模式的定义。+ k$ I5 F- |; e+ m+ A. q$ R

: l! a! G3 p/ I9 Y. H* F    是不是感觉F0的设置很啰嗦,呵呵。
: `+ V/ o1 v) |1 _7 q- D( j
" ]8 u0 v1 V; D3 O* T    2.MISC.c(NVIC,即中断)、EXTI.C(外部中断)
; z; i6 Y( N$ t4 H- K9 |" t& n- b    1.模式设置( p! r6 z0 h8 @0 @) G

- [  d4 E. H. R2 r( _$ z6 j2 n8 ]    与GPIO模式配置差不多,修改方式大同小异。右键Definition一下“NVIC_InitTypeDef”、“EXTI_InitTypeDef”查看异同,相同不用改,不同就改,多删少补。
: _* z* W, W! s* m% w0 q. f
5 y' i( V. R) c2 e    还有在配置外部中断源时注意F1和F0是不同的,F1配得外部中断源在哪个通道范围,F0也得相应换:7 v9 Q6 J: u$ l% i* @
9 u3 y( x1 t# [2 f
    F1的中断源有:EXTI15_10_IRQn(10-15)、EXTI9_5_IRQn(5-9)、EXTI1_IRQn、EXTI2_IRQn……(1、2、3、4、5)
7 ]3 _" o# T7 e# n- ~. ?' ^7 A& ?* K  @$ p. W8 R1 d
    F0的中断源有:EXTI0_1_IRQn(0-1)、EXTI2_3_IRQn(2-3)、EXTI4_15_IRQn(4-15)
! m1 x* [% X4 y/ c" p4 x& e; E8 Q! W. r: B' R) C# P4 L: {% n7 s
    F1的中断源比如说是EXTI15_10_IRQn,那在F0中就得配EXTI4_15_IRQn,如果不在范围中,就得看你外部中断的引脚了,中断源和你引脚号相同
9 f+ F* {. j2 _3 T5 v6 I+ B; L0 \5 i" v5 O+ k
    3.定时器方面
& Z+ _1 X: k$ b: C$ w    这部分由于项目中没有用到,我这里也不敢乱贴以致误导。相信小伙伴们上面的会改了,这个也不是难事,大部分都是修改模式配置的问题。
0 [) w& t$ r4 K: x  S1 a4 u5 K7 K, O: `( q8 [. v6 a8 K
    4.USART.c方面- L+ L  n5 {5 W2 [2 F
    串口配置首先是GPIO的配置和中断方面的配置,上面已经有方法了。这里的模式配置MS是不需要改的:) t/ F4 N4 F( Y

2 d" ?$ C/ z) K* r    F0:7 g6 Z7 a9 l, ]% k
3 O4 w1 x& {) I( p. T* ^* @/ E
  1. /* USART1 mode config */
    5 P/ H5 a! S* G0 i
  2.     USART_InitStructure.USART_BaudRate = bps;
    0 Y. E) }5 Y, X. M3 E$ l4 ~1 V
  3.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    ( c+ a( x2 A) `
  4.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
    , J) G7 e. L7 g- T0 \
  5.     USART_InitStructure.USART_Parity = USART_Parity_No ;6 i9 w+ F7 M( x" U+ I
  6.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;0 [3 N: Q- \5 V) _' z3 K6 `9 c
  7.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;6 p: q( b% @! j% y4 M/ _+ A
  8.     USART_Init(RS485_UART, &USART_InitStructure);/ |- x+ }' i5 v8 W% n; B% k
  9.     USART_ITConfig(RS485_UART, USART_IT_RXNE, ENABLE);7 {0 u- G1 t) A' s- ~2 y# p
  10.   B) l$ r, j8 |- {# c
  11.     USART_Cmd(RS485_UART, ENABLE);
复制代码
7 W6 ~3 @9 I' W/ U1 P9 M
    F1:
- E- J+ y- w; X( j# {( @& H1 P
" W* ^! I* S8 A, g% `5 T! [2 n
  1. /* USART1 mode config */
    * C/ ~+ G* i8 @! {) z, o
  2.     USART_InitStructure.USART_BaudRate = bps;! ^  b3 y' o, @
  3.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;; U. c% A/ ]! J
  4.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
    . ]1 J/ t% A2 F% d
  5.     USART_InitStructure.USART_Parity = USART_Parity_No ;
    ( H4 Y6 \6 ^7 q0 T
  6.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;5 V' d2 z1 B7 o3 v- B9 v, u9 b" a
  7.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    4 D9 F' y+ N) q: z# z, N
  8.     USART_Init(RS485_UART, &USART_InitStructure);. x: [, ?/ R. \# g3 g8 o" x( T
  9.     USART_ITConfig(RS485_UART, USART_IT_RXNE, ENABLE);
    + {; N) t$ @# _/ h7 F

  10. 6 ?1 p) l; G+ p* S$ Q
  11.     USART_Cmd(RS485_UART, ENABLE);
复制代码
   嗯....一样一样的。注意这里有个寄存器是不一样的:
& F/ m# Q; Q. N2 S
" {0 @0 D0 o5 e2 u; t就是在接收中断中,有些项目可能需要将这个寄存器重置一下:, [: a+ w  g( K' v7 n" G

5 N7 U' q1 P" zF1中为“RS485_UART->SR=0x00;”,SR寄存器,只有16位$ V2 W% p4 _: u* a0 \- [  C

- e" S- m" H: J而F0中则为“RS485_UART->ISR=0x00C0; ”,ISR寄存器,有32位
. r% q0 g! R1 W
5 M! V- _' q: c! {( v" R这些好像不是必要的,具体的功能可以看一下数据手册里怎么介绍的...似乎是中断接收标志位?
  C# A' L2 p( o5 l$ K- }# ^( k+ F- v9 D
    5.中断向量表的重映射. ^2 p* U5 _# |; V/ m
    如果你的项目用到了软件bootloader,中断向量表就得重映射,而F1中有函数可以直接用,然后你会发现F0中没有* ^4 [$ D9 N7 n) T

3 l1 }$ N7 T' Z( R5 d8 n0 B- \* u    F1中的函数:
# z9 [3 R& G  ?9 C
( E5 g. }0 T! s    NVIC_SetVectorTable(NVIC_VectTab_FLASH, BSP_ADDR_Boot);- R! F2 o$ @7 p1 _. E3 i
% k$ [. b8 K7 f  ~% U8 {/ |/ b
' l1 U) B( q: N6 ^% m+ G9 ?, i
    通过查资料得知我们可以用memcpy,将中断向量表拷贝到ram下(F0的中断向量表可以放在RAM中),然后保证存储中断向量表的这部分不会被修改就行了,方法在上面这个网址中。! b6 y6 M# P1 A2 e/ s* B; z
$ W! R* D9 w" H6 d
    F0中的函数:; |2 m6 P$ t/ q- B* W* \  v

0 U' [8 X: w2 G8 S" S    memcpy((void*)0x20000000, (void*)0x08000000, VECTOR_SIZE);4 b7 E% r1 W8 |' W, ^7 Y1 v
    SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);5 \8 z6 b" ~/ z9 e7 e

' l. E7 Y" ]% e4 ^0 X    至于JTAG口的复用问题,STM32F0并不存在,可以将相应的函数删掉即可。1 @1 U* z. x* s+ q' O! Z
, x3 @2 S8 X( Z" ]
! }2 r" I' Z' Q7 r

* i1 w6 U/ h/ {+ W  W
$ E; w9 T5 {# o% u! Z) n7 W& r2 J9 u  f" c6 J, |
收藏 评论0 发布时间:2021-11-20 22:00

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版