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

查看: 4111|回复: 14

STM32F072-Nucleo板开发笔记之F103系列移植到F0系列

[复制链接]

1

主题

66

回帖

0

蝴蝶豆

金牌会员

最后登录
2018-7-11
发表于 2015-1-30 14:50:20 | 显示全部楼层 |阅读模式
本帖最后由 yu_studio 于 2015-1-30 15:44 编辑

一直以来都在使用STM32F103系列的单片机,有好几年了,也开发设计了不少基于该系列单片机的程序。这次拿到了 STM32F072-Nucleo开发板,打算把部分项目的程序移植到 STM32F072上。以后的产品对于速度性能要求不高的可以用STM32F0系列来开发,也能够降低成本。
首先把一个之前做的串口通信,上位机读取单片机数据的程序移植过来。这里介绍一下移植过程:

1、首先把原F103系列的库文件和启动文件换成了F0系列的。
2、再把各个c文件中#include的头件改成F0的头文件"stm32f0xx.h"。
3、修改GPIO配置,下面代码是F103C8单片机的几个输入口配置定义

//定义IO数据端口****************************************************************
#define  RCC_APB2Periph_GPIO_IN    RCC_APB2Periph_GPIOC
#define  GPIO_IN_PORT    GPIOC         //定义IO数据端口
#define  GPIO_PIN_IN0    GPIO_Pin_0    /*input*/
#define  GPIO_PIN_IN1    GPIO_Pin_1    /*input*/
#define  GPIO_PIN_IN2    GPIO_Pin_2    /*input*/
#define  GPIO_PIN_IN3    GPIO_Pin_3    /*input*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_IN, ENABLE); //开启端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_IN0 |
                              GPIO_PIN_IN1 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIO_IN_PORT, &GPIO_InitStructure); //端口初始化

F103系列需要配置的GPIO寄存器项目有:GPIO_Pin、 GPIO_Mode、 GPIO_Speed 这三项

移植到F0系列中需作如下修改:
#define  RCC_AHBPeriph_IN   RCC_AHBPeriph_GPIOA //定义IN时钟
#define  GPIO_IN_PORT    GPIOA          //定义IN数据端口
#define  GPIO_PIN_IN0    GPIO_Pin_0     /*IN*/
#define  GPIO_PIN_IN1    GPIO_Pin_1     /*IN*/
//端口初始化
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_IN, ENABLE); //开启端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_IN0 |
GPIO_PIN_IN1 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
GPIO_Init(GPIO_IN_PORT, &GPIO_InitStructure); //端口初始化

F103和F0系列的GPIO时钟函数不同,由 RCC_APB2PeriphClockCmd() 改成了 RCC_AHBPeriphClockCmd()
F0需要配置的GPIO寄存器项目有
GPIO_Pin 、GPIO_Mode 、GPIO_OType 、GPIO_PuPd 、GPIO_Speed 这几项
GPIO_Pin 这项与F103是相同的。
GPIO_Speed 的配置变成
GPIO_Speed_Level_1  = 0x00  /*!< I/O output speed: Low 2 MHz */
GPIO_Speed_Level_2  = 0x01  /*!< I/O output speed: Medium 10 MHz */
GPIO_Speed_Level_3  = 0x03  /*!< I/O output speed: High 50 MHz */
其实,ST的设计人员考虑到和F103相兼容,作了如下定义
#define  GPIO_Speed_2MHz    GPIO_Speed_Level_1   /*!< I/O output speed: Low 2 MHz  */
#define  GPIO_Speed_10MHz   GPIO_Speed_Level_2   /*!< I/O output speed: Medium 10 MHz */
#define  GPIO_Speed_50MHz   GPIO_Speed_Level_3   /*!< I/O output speed: High 50 MHz */
也就是说,在以前的设计中使用的
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
仍然可以继续使用。

GPIO_Mode 这项在F0系列中分解成三项 GPIO_Mode  、 GPIO_OType  、GPIO_PuPd
GPIO_Mode只设置
  GPIO_Mode_IN
  GPIO_Mode_OUT
  GPIO_Mode_AF
  GPIO_Mode_AN
包括端口输入输出、复用和模拟输入四项,输出类型和上拉下拉电阻独立放在GPIO_OType  、GPIO_PuPd里来设置了。
修改完这几项之后,GPIO部分的配置就算完成了。
接下来就是复用部分的配置了。
下面是F103的USART的端口配置
/* Configure USART Tx as alternate function push-pull */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_USART1_TX;
GPIO_Init(GPIO_USART1, &GPIO_InitStructure); //发送端口初始化

在这里GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;这条就可以配置端口复用了。
在F0中需要这样:
GPIO_InitStructure.GPIO_Pin = GPIO_USART1_TX |
GPIO_USART1_RX ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
GPIO_Init(GPIO_USART1, &GPIO_InitStructure); //端口初始化
除了需要在GPIO_Mode 中配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
另外还需再加一条:
GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_1); //GPIO复用模式
F0中用一个专门寄存器来配置端口复用,使之一个端口可以配置为不同的复用模式,避免了复用冲突。这点需要注意,少了这个,可就没法工作了。
配置完端口复用,USART的端口部分配置也完成了。
再就是配置USART寄存器,
     //USART1参数设置
     USART_InitStructure.USART_BaudRate = 9600;
     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(USART1, &USART_InitStructure);          //USART1配置参数
     
     /* Enable USART Receive and Transmit interrupts */
     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);     //接收不为空中断
     USART_ITConfig(USART1, USART_IT_TC, DISABLE);      //发送完成中断
     USART_ITConfig(USART1, USART_IT_TXE, DISABLE);     //发送空中断
     
     /* Enable USART */
     USART_Cmd(USART1, ENABLE);
这些和F103是一样的,不再多述。
配置完这些,IO口和串口通信基本功能就能够使用了。
本贴主要讲述从f103移植到f0系列中GPIO和端口复用方面需要需改的部分,F0和F103还有很多不同之处,本贴就不再讲述,以后再发贴补充
<
回复

使用道具 举报

11

主题

661

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-6-8
发表于 2015-1-30 14:58:08 | 显示全部楼层
学习了,支持楼主继续。。。。
回复 支持 反对

使用道具 举报

307

主题

3125

回帖

0

蝴蝶豆

论坛元老

最后登录
2020-7-17
发表于 2015-1-30 17:13:18 | 显示全部楼层
谢谢
回复 支持 反对

使用道具 举报

22

主题

946

回帖

3

蝴蝶豆

论坛元老

最后登录
2020-5-26
发表于 2015-1-30 23:49:53 | 显示全部楼层
留下脚印~~~~~~~~~~
回复 支持 反对

使用道具 举报

93

主题

2449

回帖

4

蝴蝶豆

论坛元老

最后登录
2020-6-28
发表于 2015-1-31 10:47:16 | 显示全部楼层
APB外设时钟也不一样
回复 支持 反对

使用道具 举报

11

主题

258

回帖

0

蝴蝶豆

金牌会员

最后登录
2019-9-15
发表于 2015-1-31 10:58:12 | 显示全部楼层
学习一下。。。
回复 支持 反对

使用道具 举报

2

主题

245

回帖

0

蝴蝶豆

高级会员

最后登录
2016-12-26
发表于 2015-5-3 11:02:18 | 显示全部楼层
学习一下
回复 支持 反对

使用道具 举报

100

主题

3617

回帖

1

蝴蝶豆

论坛元老

最后登录
2020-12-8
发表于 2015-5-6 11:21:02 | 显示全部楼层
用官方的代码很容易移植
回复 支持 反对

使用道具 举报

52

主题

3313

回帖

61

蝴蝶豆

论坛元老

最后登录
2020-12-9
发表于 2015-5-6 20:07:48 | 显示全部楼层
学习学习
回复 支持 反对

使用道具 举报

52

主题

3313

回帖

61

蝴蝶豆

论坛元老

最后登录
2020-12-9
发表于 2015-5-6 20:08:59 | 显示全部楼层
现在写程序习惯查库帮助手册了,使用起来很方便
回复 支持 反对

使用道具 举报

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