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还有很多不同之处,本贴就不再讲述,以后再发贴补充 学习了,支持楼主继续。。。。 谢谢 留下脚印~~~~~~~~~~ APB外设时钟也不一样 学习一下。。。 学习一下 用官方的代码很容易移植 学习学习 现在写程序习惯查库帮助手册了,使用起来很方便
页:
[1]
2