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

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

[复制链接]
yu_studio 提问时间:2015-1-30 14:50 /
本帖最后由 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还有很多不同之处,本贴就不再讲述,以后再发贴补充
收藏 评论14 发布时间:2015-1-30 14:50

举报

14个回答
黑溱郎 回答时间:2015-1-30 14:58:08
学习了,支持楼主继续。。。。
沐紫 回答时间:2015-1-30 17:13:18
谢谢
回答时间:2015-1-30 23:49:53
留下脚印~~~~~~~~~~
wamcncn 回答时间:2015-1-31 10:47:16
APB外设时钟也不一样
wwwhlw 回答时间:2015-1-31 10:58:12
学习一下。。。
tg1991 回答时间:2015-5-3 11:02:18
学习一下
stary666 回答时间:2015-5-6 11:21:02
用官方的代码很容易移植
wyxy163@126.com 回答时间:2015-5-6 20:07:48
提示: 作者被禁止或删除 内容自动屏蔽
wyxy163@126.com 回答时间:2015-5-6 20:08:59
提示: 作者被禁止或删除 内容自动屏蔽
laotui 回答时间:2015-5-6 20:57:30
103的IO还是挺复杂的,当初学的时候看了好久才明白。
biubiubiu579 回答时间:2015-5-27 23:55:20
好样的啊
搬砖工 回答时间:2018-3-14 15:12:15
借鉴了
chi1997 回答时间:2018-3-18 20:27:20
学习了,多谢楼主
damiaa 回答时间:2018-3-19 15:55:22
楼主辛苦了。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版