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

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

[复制链接]
STMCU小助手 发布时间:2021-11-20 22:00
这段时间在公司里做了一个移植的项目,是stm32f103c8t6——>stm32f070cbt6,管脚基本上一样,移植一下库就行了,大概是为了节省成本吧。一开始是懵逼的,以前从来没有移植过stm32,都是想用哪个功能,发现一个是F1一个是F4,就耍小聪明,把其中没有用到库函数的部分复制到另一个上,然后开始编啊编啊……现在遇到项目要做了没办法,网上也找不到资料(我是小白),只能自己硬着头皮改啦!
! T3 f" y3 J: x1 `) R
' t' A6 c0 i( B$ Z" |  v; U$ P7 k    想想想,想到后来就是先创建一个工程再说吧!
* E' g& u( X1 |1 X0 t* M
6 M5 `7 `! B6 S" H+ U# Q    于是乎,第一步来了:创建一个STM32F0的工程。
! [' ]  C+ L4 `5 e" Y* r
9 ~. u, ~  v- S3 M# j9 k    如果你在选择芯片的时候没有你想要的F0芯片,说明你没有那个pack,得下载一个,具体步骤不详细说了。) g6 S& ?' q) h. g0 y& t- I
- }1 J. [' ?6 S& c% X3 m$ [
    你需要用到的文件有:F0的库、F0的启动文件、F0的各种头文件、CORTEX-M0、系统文件……详细的不说了,对照图中的文件放就行了
/ o$ y' O! s" a! `6 e; u5 a; A2 p
. K2 E+ r* p$ n
20180725134343215.png
" E& |: T' d3 q9 ~  |! e" r0 W

- C5 k% w3 @5 u  M  f* `% j    图中没有红线的不用管,其他都必须有,还有一些头文件没在上面,记得在设置——>C/C++里面引用一下,这些文件基本上在官网例程里都能下到。* i* R( U* p0 K4 w. o* A

  e- U/ \* z) Q% H. V% g. N* W    同时要在C/C++一栏里加这么一行字:USE_STDPERIPH_DRIVER,STM32F0XX_MD3 p  C. D4 H0 d) _

# J6 d! h2 `# l: ]: D6 K1 F, Z5 p
20180725134837925.png
$ z1 e5 k* t* d

5 q, O- r: I( k3 H1 ]    然后再把你自己的程序贴上去,一编译,肯定不会通过的拉,哈哈哈,但是会把你程序中F1用到的库函数和F0库中相冲突的地方显示出来,这时候你就只需要一个个改就成了。: g% ?9 m  ]4 h2 }$ e. L
: }+ j! E% L. M  J
    1.GPIO.c方面
+ V) j( `7 t2 l. o& l; h    gpio这方面比较简单,错误大部分都是引脚时钟设置、引脚的模式设置方面会出错误。. F' t' I! e6 E
0 Q3 j6 B, X: A/ W) |+ i
    1.时钟的话由于F0库中没有使用PCLK作为GPIO时钟源的命令,所以一般都使用HCLK来作为GPIO的时钟源;4 V: u& E) @& y, j( i+ r6 N7 a  k

+ E5 x' V% z1 F/ L    2.引脚的模式设置方面你可以右键“GPIO_InitTypeDef”——>go to Definition看一下这个结构体里面的定义,比较一下F1和F0的设置的不同。
7 J, |. Q. g; ~  U& j5 W" E5 Q& Y5 F+ y6 G( l) _* J1 J& c
    这里放两种图,一张是F1的,一张是F0的GPIO设置,大家可以对比一下1 o4 s0 N2 K7 g! t8 T7 w4 q
20180725135841124.png
: t+ M. `( U& Q3 |
# Z, z/ J$ D! ^" h% q# X
5 k: }* R: I3 `
F1 GPIO设置F0 GPIO设置& E% l" @# {8 I4 ?
3 c' |* `4 m6 J2 I* f
20180725140255219.png
0 m4 E* l. Y% L. v; b1 A
4 p& D- @, V8 n5 a7 a
    另外,如果引脚模式为AF_PP,复用输出模式时需要用函数配置一下复用的用途:6 F& _: [1 O$ y$ W
& C( i- a8 l% ~
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);GPIO_AF_1对应一些外设,比如说我这里用到了USART1,故要用GPIO_AF_1,你可以右键Definition看一下各个模式的定义。
* p3 L9 P: P7 n* m
( D5 l7 s  E" }2 O! D1 x    是不是感觉F0的设置很啰嗦,呵呵。( Y: V6 q: R# K8 Z0 A& B
- Q" q* J; k+ i3 h
    2.MISC.c(NVIC,即中断)、EXTI.C(外部中断)& P1 [. }0 B8 G/ @, T7 T
    1.模式设置
  J* L; k" [3 j/ S/ M: T# N- F! B# k& f
7 E9 k& r+ R7 F; [3 X% C/ L. `    与GPIO模式配置差不多,修改方式大同小异。右键Definition一下“NVIC_InitTypeDef”、“EXTI_InitTypeDef”查看异同,相同不用改,不同就改,多删少补。1 ~4 p  ^( j" E3 ^* F

/ m! |7 K* d2 }/ h; K    还有在配置外部中断源时注意F1和F0是不同的,F1配得外部中断源在哪个通道范围,F0也得相应换:
- }; B" r1 p  M  v9 ~' l& U; n5 }
/ `# y# y* M$ f7 D! u& Y8 [% f    F1的中断源有:EXTI15_10_IRQn(10-15)、EXTI9_5_IRQn(5-9)、EXTI1_IRQn、EXTI2_IRQn……(1、2、3、4、5)) l8 N1 d  ^9 B9 c8 S6 w
8 v1 U6 b8 b* Z" }
    F0的中断源有:EXTI0_1_IRQn(0-1)、EXTI2_3_IRQn(2-3)、EXTI4_15_IRQn(4-15)
( W* ]2 h9 |9 i) R3 e) f9 C0 c) A" N6 C
    F1的中断源比如说是EXTI15_10_IRQn,那在F0中就得配EXTI4_15_IRQn,如果不在范围中,就得看你外部中断的引脚了,中断源和你引脚号相同
* X; Q" E& M- i. D3 B
" y% S! N2 P/ }) J) S# p- Q. ^    3.定时器方面
4 h8 v9 E* T8 B& O2 `    这部分由于项目中没有用到,我这里也不敢乱贴以致误导。相信小伙伴们上面的会改了,这个也不是难事,大部分都是修改模式配置的问题。/ T' G1 A/ V' V6 S3 ~) o

0 w; ?( S. T  o: p/ y    4.USART.c方面$ N& h9 l5 |( {+ k
    串口配置首先是GPIO的配置和中断方面的配置,上面已经有方法了。这里的模式配置MS是不需要改的:( z: s6 W+ J/ t- {5 F, G- I5 E7 w

/ Q0 J' B: A. S% ?) p5 t    F0:
; S$ A% Y8 m1 ]/ x- {8 j& y0 i/ w! H/ p) a: F
  1. /* USART1 mode config */
    6 C, `+ C* k/ O( O8 \; _9 u
  2.     USART_InitStructure.USART_BaudRate = bps;
    ! k. G. m! k! u/ S; T( g
  3.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;9 K- t/ o3 j' }$ n% X/ R
  4.     USART_InitStructure.USART_StopBits = USART_StopBits_1;5 T# B# q( H1 ]5 X
  5.     USART_InitStructure.USART_Parity = USART_Parity_No ;
    3 W0 }' p2 m) M
  6.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;+ Q. ?3 G: v6 a, @; M: A% X9 a
  7.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    , L* ~% r$ x+ \6 w+ b7 {  T; T$ C0 ]
  8.     USART_Init(RS485_UART, &USART_InitStructure);
    4 V3 p. K4 `- G
  9.     USART_ITConfig(RS485_UART, USART_IT_RXNE, ENABLE);
    % x' a6 O9 R& v) f2 h& t7 l

  10. + n( X  b) I. }9 P9 ~8 B# E
  11.     USART_Cmd(RS485_UART, ENABLE);
复制代码

, X- |* s: @" {/ w    F1:
, j* Z6 J  {% {" _, {( C' S: n- C
  1. /* USART1 mode config */1 f7 G0 t& p: }* S9 r. d) `, Q
  2.     USART_InitStructure.USART_BaudRate = bps;! V' x" ~$ o7 R1 s7 Q* U% \; R
  3.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;* [0 \, Q4 [7 E0 e3 `; ]- X7 f
  4.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
    4 h" G2 \; N5 |9 w9 B. W" C: g
  5.     USART_InitStructure.USART_Parity = USART_Parity_No ;& d+ _! ]* @3 _& Q  t; n; {
  6.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;' s. _* Y' F) B+ p% v8 }
  7.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    6 |3 ?6 ~$ g; L6 H# X, Z
  8.     USART_Init(RS485_UART, &USART_InitStructure);3 [3 o( W5 g; F  I7 V7 M
  9.     USART_ITConfig(RS485_UART, USART_IT_RXNE, ENABLE);$ o) b* y# C: |9 \- D8 ~8 [, O

  10. ; u+ [+ F5 F" y. F! Y- e/ J
  11.     USART_Cmd(RS485_UART, ENABLE);
复制代码
   嗯....一样一样的。注意这里有个寄存器是不一样的:
6 T3 V" h* v& Y7 C/ Q; R% N4 k3 @3 c, ]4 z3 C5 t
就是在接收中断中,有些项目可能需要将这个寄存器重置一下:
% N/ Z) h- k6 N  Q: i
: \6 z9 j! w& S9 E! y- f0 |$ TF1中为“RS485_UART->SR=0x00;”,SR寄存器,只有16位: r( M0 [2 E* J6 `2 V4 [
! u& ?/ c$ l$ l
而F0中则为“RS485_UART->ISR=0x00C0; ”,ISR寄存器,有32位9 u; A$ X8 N6 j7 K4 \

+ B6 L3 f* n2 J! \5 e/ V$ ^( @这些好像不是必要的,具体的功能可以看一下数据手册里怎么介绍的...似乎是中断接收标志位?+ I3 V# ^: s; K. Y. @5 U6 Y5 h
" o  q) z# J; y4 f! `
    5.中断向量表的重映射& g6 r" d3 t! u- L$ Q
    如果你的项目用到了软件bootloader,中断向量表就得重映射,而F1中有函数可以直接用,然后你会发现F0中没有/ ]: R1 I0 P# y9 V: Z4 {
" [! ~( V. j+ ]' |
    F1中的函数:
  d- R$ V6 n2 U' H' e8 u( g! P9 p# }8 u# s6 a, Z) g8 K
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, BSP_ADDR_Boot);$ {& ?9 H. F! \* q2 D0 T
4 N: ]) u( X9 [4 U: }

8 P- M( R+ }4 g  v    通过查资料得知我们可以用memcpy,将中断向量表拷贝到ram下(F0的中断向量表可以放在RAM中),然后保证存储中断向量表的这部分不会被修改就行了,方法在上面这个网址中。
# r5 n6 E& {6 s) k9 ^: t% y
' q! K1 x& N0 {    F0中的函数:
& C7 D: ]6 H9 H. s1 Y% Z1 T" a5 G  z/ Z
    memcpy((void*)0x20000000, (void*)0x08000000, VECTOR_SIZE);/ _! l) L& n) l( q" ~) S4 r
    SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);4 Z$ |% s1 `) p6 m  T& b& f) Q
, x4 w0 z/ c1 T. {
    至于JTAG口的复用问题,STM32F0并不存在,可以将相应的函数删掉即可。, I* H- M" w# r: _$ k

; x& S( r9 G  w) @
/ j) u$ q$ v( c5 j6 ^/ _0 F" G
' M( f& P* c/ f

. [# k# ?7 F1 d. X$ Q
收藏 评论0 发布时间:2021-11-20 22:00

举报

0个回答

所属标签

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