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

发布者:冰雪勇士最新更新时间:2019-07-26 来源: eefocus关键字:移植  STM32F1 手机看文章 扫描二维码
随时随地手机看文章

    这段时间在公司里做了一个移植的项目,是stm32f103c8t6——>stm32f070cbt6,管脚基本上一样,移植一下库就行了,大概是为了节省成本吧。一开始是懵逼的,以前从来没有移植过stm32,都是想用哪个功能,发现一个是F1一个是F4,就耍小聪明,把其中没有用到库函数的部分复制到另一个上,然后开始编啊编啊……现在遇到项目要做了没办法,网上也找不到资料(我是小白),只能自己硬着头皮改啦!


    想想想,想到后来就是先创建一个工程再说吧!


    于是乎,第一步来了:创建一个STM32F0的工程。


    如果你在选择芯片的时候没有你想要的F0芯片,说明你没有那个pack,得下载一个,具体步骤不详细说了。


    你需要用到的文件有:F0的库、F0的启动文件、F0的各种头文件、CORTEX-M0、系统文件……详细的不说了,对照图中的文件放就行了


    图中没有红线的不用管,其他都必须有,还有一些头文件没在上面,记得在设置——>C/C++里面引用一下,这些文件基本上在官网例程里都能下到。


    同时要在C/C++一栏里加这么一行字:USE_STDPERIPH_DRIVER,STM32F0XX_MD


    


    然后再把你自己的程序贴上去,一编译,肯定不会通过的拉,哈哈哈,但是会把你程序中F1用到的库函数和F0库中相冲突的地方显示出来,这时候你就只需要一个个改就成了。


    1.GPIO.c方面

    gpio这方面比较简单,错误大部分都是引脚时钟设置、引脚的模式设置方面会出错误。


    1.时钟的话由于F0库中没有使用PCLK作为GPIO时钟源的命令,所以一般都使用HCLK来作为GPIO的时钟源;


    2.引脚的模式设置方面你可以右键“GPIO_InitTypeDef”——>go to Definition看一下这个结构体里面的定义,比较一下F1和F0的设置的不同。


    这里放两种图,一张是F1的,一张是F0的GPIO设置,大家可以对比一下

F1 GPIO设置

F0 GPIO设置


    另外,如果引脚模式为AF_PP,复用输出模式时需要用函数配置一下复用的用途:


    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);GPIO_AF_1对应一些外设,比如说我这里用到了USART1,故要用GPIO_AF_1,你可以右键Definition看一下各个模式的定义。


    是不是感觉F0的设置很啰嗦,呵呵。


    2.MISC.c(NVIC,即中断)、EXTI.C(外部中断)

    1.模式设置


    与GPIO模式配置差不多,修改方式大同小异。右键Definition一下“NVIC_InitTypeDef”、“EXTI_InitTypeDef”查看异同,相同不用改,不同就改,多删少补。


    还有在配置外部中断源时注意F1和F0是不同的,F1配得外部中断源在哪个通道范围,F0也得相应换:


    F1的中断源有:EXTI15_10_IRQn(10-15)、EXTI9_5_IRQn(5-9)、EXTI1_IRQn、EXTI2_IRQn……(1、2、3、4、5)


    F0的中断源有:EXTI0_1_IRQn(0-1)、EXTI2_3_IRQn(2-3)、EXTI4_15_IRQn(4-15)


    F1的中断源比如说是EXTI15_10_IRQn,那在F0中就得配EXTI4_15_IRQn,如果不在范围中,就得看你外部中断的引脚了,中断源和你引脚号相同


    3.定时器方面

    这部分由于项目中没有用到,我这里也不敢乱贴以致误导。相信小伙伴们上面的会改了,这个也不是难事,大部分都是修改模式配置的问题。


    4.USART.c方面

    串口配置首先是GPIO的配置和中断方面的配置,上面已经有方法了。这里的模式配置MS是不需要改的:


    F0:


/* USART1 mode config */

    USART_InitStructure.USART_BaudRate = bps;

    USART_InitStructure.USART_WordLength = USART_WordLength_8b;

    USART_InitStructure.USART_StopBits = USART_StopBits_1;

    USART_InitStructure.USART_Parity = USART_Parity_No ;

    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    USART_Init(RS485_UART, &USART_InitStructure);

    USART_ITConfig(RS485_UART, USART_IT_RXNE, ENABLE);


    USART_Cmd(RS485_UART, ENABLE);


 


    F1:


/* USART1 mode config */

    USART_InitStructure.USART_BaudRate = bps;

    USART_InitStructure.USART_WordLength = USART_WordLength_8b;

    USART_InitStructure.USART_StopBits = USART_StopBits_1;

    USART_InitStructure.USART_Parity = USART_Parity_No ;

    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    USART_Init(RS485_UART, &USART_InitStructure);

    USART_ITConfig(RS485_UART, USART_IT_RXNE, ENABLE);


    USART_Cmd(RS485_UART, ENABLE);


    嗯....一样一样的。注意这里有个寄存器是不一样的:


就是在接收中断中,有些项目可能需要将这个寄存器重置一下:


F1中为“RS485_UART->SR=0x00;”,SR寄存器,只有16位


而F0中则为“RS485_UART->ISR=0x00C0; ”,ISR寄存器,有32位


这些好像不是必要的,具体的功能可以看一下数据手册里怎么介绍的...似乎是中断接收标志位?


    5.中断向量表的重映射

    如果你的项目用到了软件bootloader,中断向量表就得重映射,而F1中有函数可以直接用,然后你会发现F0中没有


    F1中的函数:


    NVIC_SetVectorTable(NVIC_VectTab_FLASH, BSP_ADDR_Boot);


    这时候你会在网上找一些解决方案,这里推荐一个:https://www.cnblogs.com/outs/p/4948134.html


    通过查资料得知我们可以用memcpy,将中断向量表拷贝到ram下(F0的中断向量表可以放在RAM中),然后保证存储中断向量表的这部分不会被修改就行了,方法在上面这个网址中。


    F0中的函数:


    memcpy((void*)0x20000000, (void*)0x08000000, VECTOR_SIZE);

    SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);


 


    至于JTAG口的复用问题,STM32F0并不存在,可以将相应的函数删掉即可。



关键字:移植  STM32F1 引用地址:【移植】STM32F1移植到F0的各种经验总结

上一篇:STM32+freeRTOS学习笔记-1.使用cube MX创建一个freeRTOS的keil工程
下一篇:Keil5配置GCC编译器编译STM32工程

推荐阅读最新更新时间:2024-11-06 10:40

UCOS2_STM32移植详细过程 (一)
Ⅰ、概述 该文写针对初学µC/OS的朋友,基于以下平台来一步一步移植µC/OS嵌入式操作系统。UCOS移植相关平台: 系统平台:µC/OS-II(最新V2.92版) 硬件平台:STM32F1(适合F1所以系列) 开发平台:Keil(MDK-ARM) V5 1.为什么是µC/OS-II? 原因在于µC/OS-II是一个比较成熟、稳定的系统,与µC/OS-III比较有些机制相对简单很多。当你掌握了µC/OS-II,µC/OS-III很容易就理解了。 2.为什么是STM32F1? 硬件平台是在移植的过程中比较重要的一点,也就是说,不同的硬件平台,移植过程中的端口(uCOS-IIPorts下源文件)存在一定的差异性。 但是同一内核
[单片机]
UCOS2_STM32<font color='red'>移植</font>详细过程 (一)
u-boot-2012.04移植
开发平台:x86 redhat5.5 目标平台:SMDK6410 注意: 该文档是移植完成之后的总结,所以并非按照真正的移植步骤所写, 只做参考 修改完成后运行make进行编译,把编译生成的u-boot-nand.bin烧写到nand的0-0x40000后即可切换为nand启动方式来运行 在uboot启动后手动添加环境变量 # set ipaddr 192.168.1.20 # set serverip 192.168.1.254 # set ethaddr 11:22:33:44:55:66 这些变量也可在smdk6400.h中以宏的方式定义 经测试,nand、tftp等命令都好用,如有问题请
[单片机]
U-Boot移植(4)增加对S3C2440的支持 (修改编译错误)
9、第一次make all,出现如下错误。 从上面错误可以看出明显是结构体中没有定义CAMDIVN,于是要找到定义这个时钟变量的地方,增加它。进入include/s3c24x0.h,找到下面的typedef struct处: typedef struct 的最后一行为新增的。 修改完后保存,再次回到顶层中,先make distclean。 10、再一次make all,又出现了如下错误: 上面到底是什么错误呢?一时是想不通,吃个饭再说吧! 吃完饭来到实验室之后,上网查了些资料,终于明白。 要么U-Boot源码问题,要么是编译器的问题。源码是从官方下的,一般是不会有问题的,那么就是编译器问题,那编译器
[单片机]
U-Boot<font color='red'>移植</font>(4)增加对S3C2440的支持 (修改编译错误)
Linux-2.6.32.2内核在mini2440上的移植(十四)---移植看门狗驱动
移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-linux-gnueabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 6,linux 版本:linux-2.6.32.2 7,参考文章: 嵌入式linux应用开发完全手册,韦东山,编著。 Mini2440 之Linux 移植开发实战指南 Linux-2.6.32.2 内核具有完善的S3C2440 的看梦狗驱动,我们只需配
[单片机]
Linux 蓝牙系列 -- ARM-Linux蓝牙工具的移植
一 内核修改 ------------------------------------------------------------ 将内核的蓝牙做成模块形式。 并配置如下, Bluetooth subsystem support --- L2CAP protocol support SCO links support RFCOMM protocol support RFCOMM TTY support BNEP protocol support HIDP protocol support (NEW) Bluetooth d
[单片机]
ARM移植之BootLoader(4)
4. BootLoader第二阶段   vivi Bootloader的第二阶段又分成了八个小阶段,在main函数中分别调用这几个小阶段的相关函数: int main(int argc, char *argv ) { int ret; /* * Step 1: */ putstr( \r\n ); putstr(vivi_banner); reset_handler(); /* * Step 2: */ ret = board_init(); if (ret) { putstr( Failed a board_init() procedure\r\n ); error();
[单片机]
cortex-a8 uboot系列:第十六章 uboot移植-从三星官方移植
一、移植前的准备工作 三星移植过的uboot源代码准备 Ubuntu14.04重启网卡命令, ifdown eth0, ifup eth0 安装openssh,通过ssh远程登录linux 二、移植初体验 复制三星官方的uboot代码到linux下。 检查makefile中的交叉编译工具链是否正确 配置时使用: make smdkv210_single_config 然后直接make, 得到u-boot.bin。 使用sd_fusing目录下的sd_fusing.sh脚本,将u-boot.bin烧录到SD中。因为sd_fusing目录下有两个文件是三星在64位系统上编译的,在32位机上是不能工作的。因此需要重新make
[单片机]
cortex-a8 uboot系列:第十六章 uboot<font color='red'>移植</font>-从三星官方<font color='red'>移植</font>
ARM+llinux系统移植3G拨号上网收发短信(二)
一、发送text格式的短信 给联通发text格式的短信: ~ : microcom -s 115200 /dev/ttyUSB1 at OK 设置短信格式为Text模式: at+cmgf=1 OK at+cmgs= +861300711**** 输入发送的内容: hello (内容写完后按一下ctrl + z发送) +CMGS: 48 OK 给电信发text格式的短信: ~ : microcom -s 115200 /dev/ttyUSB1 at OK 设置短信格式为Text模式: at+cmgf=1 OK at+cmgs= +861532736**** 设
[单片机]
ARM+llinux系统<font color='red'>移植</font>3G拨号上网收发短信(二)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved