本帖最后由 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还有很多不同之处,本贴就不再讲述,以后再发贴补充 |