yu_studio 发表于 2015-1-30 14:50:20

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

本帖最后由 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数据端口****************************************************************
#defineRCC_APB2Periph_GPIO_IN    RCC_APB2Periph_GPIOC
#defineGPIO_IN_PORT    GPIOC         //定义IO数据端口
#defineGPIO_PIN_IN0    GPIO_Pin_0    /*input*/
#defineGPIO_PIN_IN1    GPIO_Pin_1    /*input*/
#defineGPIO_PIN_IN2    GPIO_Pin_2    /*input*/
#defineGPIO_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系列中需作如下修改:#defineRCC_AHBPeriph_IN   RCC_AHBPeriph_GPIOA //定义IN时钟#defineGPIO_IN_PORT    GPIOA          //定义IN数据端口#defineGPIO_PIN_IN0    GPIO_Pin_0   /*IN*/#defineGPIO_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相兼容,作了如下定义#defineGPIO_Speed_2MHz    GPIO_Speed_Level_1   /*!< I/O output speed: Low 2 MHz*/#defineGPIO_Speed_10MHz   GPIO_Speed_Level_2   /*!< I/O output speed: Medium 10 MHz */#defineGPIO_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_INGPIO_Mode_OUTGPIO_Mode_AFGPIO_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还有很多不同之处,本贴就不再讲述,以后再发贴补充

黑溱郎 发表于 2015-1-30 14:58:08

学习了,支持楼主继续。。。。

沐紫 发表于 2015-1-30 17:13:18

谢谢

xnmc2013 发表于 2015-1-30 23:49:53

留下脚印~~~~~~~~~~

wambob 发表于 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

用官方的代码很容易移植

数码小叶 发表于 2015-5-6 20:07:48

学习学习

数码小叶 发表于 2015-5-6 20:08:59

现在写程序习惯查库帮助手册了,使用起来很方便
页: [1] 2
查看完整版本: STM32F072-Nucleo板开发笔记之F103系列移植到F0系列