
这段时间在公司里做了一个移植的项目,是stm32f103c8t6——>stm32f070cbt6,管脚基本上一样,移植一下库就行了,大概是为了节省成本吧。一开始是懵逼的,以前从来没有移植过stm32,都是想用哪个功能,发现一个是F1一个是F4,就耍小聪明,把其中没有用到库函数的部分复制到另一个上,然后开始编啊编啊……现在遇到项目要做了没办法,网上也找不到资料(我是小白),只能自己硬着头皮改啦! 想想想,想到后来就是先创建一个工程再说吧!2 J8 C% ]4 |2 c- n3 Z9 k7 [ . n" ?+ ?. n4 }7 X( V. b# p 于是乎,第一步来了:创建一个STM32F0的工程。 - 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、系统文件……详细的不说了,对照图中的文件放就行了 ![]() 图中没有红线的不用管,其他都必须有,还有一些头文件没在上面,记得在设置——>C/C++里面引用一下,这些文件基本上在官网例程里都能下到。6 }0 b2 K2 N- Y6 L h% i 同时要在C/C++一栏里加这么一行字:USE_STDPERIPH_DRIVER,STM32F0XX_MD) R1 _. U+ G. Q+ P! @0 f! ` ![]() ; v9 O# m8 {% h& x; R1 } 然后再把你自己的程序贴上去,一编译,肯定不会通过的拉,哈哈哈,但是会把你程序中F1用到的库函数和F0库中相冲突的地方显示出来,这时候你就只需要一个个改就成了。1 Z9 K( R8 W6 F* W _- N 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的时钟源; 2 l% X( T! S8 \" P6 @ 2.引脚的模式设置方面你可以右键“GPIO_InitTypeDef”——>go to Definition看一下这个结构体里面的定义,比较一下F1和F0的设置的不同。% X3 Z9 F) m9 Y& T2 t 这里放两种图,一张是F1的,一张是F0的GPIO设置,大家可以对比一下- v3 E9 j, `2 o: ^+ c% }, h ![]() & 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 ![]() % w; q) Z% ]. K5 n; [ 另外,如果引脚模式为AF_PP,复用输出模式时需要用函数配置一下复用的用途: 6 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 是不是感觉F0的设置很啰嗦,呵呵。 2.MISC.c(NVIC,即中断)、EXTI.C(外部中断) 1.模式设置( p! r6 z0 h8 @0 @) G 与GPIO模式配置差不多,修改方式大同小异。右键Definition一下“NVIC_InitTypeDef”、“EXTI_InitTypeDef”查看异同,相同不用改,不同就改,多删少补。 还有在配置外部中断源时注意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) * K @$ p. W8 R1 d F0的中断源有:EXTI0_1_IRQn(0-1)、EXTI2_3_IRQn(2-3)、EXTI4_15_IRQn(4-15) 8 Q! W. r: B' R) C# P4 L: {% n7 s F1的中断源比如说是EXTI15_10_IRQn,那在F0中就得配EXTI4_15_IRQn,如果不在范围中,就得看你外部中断的引脚了,中断源和你引脚号相同 ; L0 \5 i" v5 O+ k 3.定时器方面 这部分由于项目中没有用到,我这里也不敢乱贴以致误导。相信小伙伴们上面的会改了,这个也不是难事,大部分都是修改模式配置的问题。 7 K, O: `( q8 [. v6 a8 K 4.USART.c方面- L+ L n5 {5 W2 [2 F 串口配置首先是GPIO的配置和中断方面的配置,上面已经有方法了。这里的模式配置MS是不需要改的:) t/ F4 N4 F( Y F0:7 g6 Z7 a9 l, ]% k 3 O4 w1 x& {) I( p. T* ^* @/ E
F1:
就是在接收中断中,有些项目可能需要将这个寄存器重置一下:, [: a+ w g( K' v7 n" G F1中为“RS485_UART->SR=0x00;”,SR寄存器,只有16位$ V2 W% p4 _: u* a0 \- [ C 而F0中则为“RS485_UART->ISR=0x00C0; ”,ISR寄存器,有32位 这些好像不是必要的,具体的功能可以看一下数据手册里怎么介绍的...似乎是中断接收标志位? 5 l$ K- }# ^( k+ F- v9 D 5.中断向量表的重映射. ^2 p* U5 _# |; V/ m 如果你的项目用到了软件bootloader,中断向量表就得重映射,而F1中有函数可以直接用,然后你会发现F0中没有* ^4 [$ D9 N7 n) T F1中的函数: 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 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 至于JTAG口的复用问题,STM32F0并不存在,可以将相应的函数删掉即可。1 @1 U* z. x* s+ q' O! Z , x3 @2 S8 X( Z" ] ! }2 r" I' Z' Q7 r 7 W& r2 J9 u f" c6 J, | |