RTE(run-time environment)driver:运行时环境驱动。
(图1)
MDK5.0开始,keil中出现了:在线安装和升级软件包(图1第三个按钮)、为目标选择软件包(图1第二个按钮)_、管理运行时环境(图1第三个按钮)三个按钮。使得keil更好用了,很多芯片开发包都可以在线下载升级,而不用再到官网下载开发包,当然还有挺多不可以在线升级下载的。最近在弄stm32f103rct6芯片,就是通过在线下载获得的开发包。点第三个按钮时出现如图2所示的窗口:
(图2)
在右边Devices选择STM32F103RC,左边会出现要安装的开发包:Keil::STM32F1xx_DFP(即STM32F1xx Development Family Pack)。选项右边是Up to Date,因为已经安装过了,如果没有安装过,显示的是Install,点安装就会下载安装该包了。
安装好后,在keil安装目录中可以找到安装好的包内容。如我的路径:D:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\
进入目录后可以看到一个1.1.0的文件夹,为该包目前的版本,以后跟新就不一样了。进入改目录后可以看到其中的内容如图3所示:
Boards:为官方开发板文件夹,包含一些与开发板对应的程序例子和驱动代码。
Device:为stm3210x标准外设驱动库(V3.5)和arm内核、stm32相关头文件启动文件等。
Documents:为开发板和不同系列芯片说明文档,使用文档。
Flash:不清楚具体做什么的。
Images:是开发板图片。
RTE_Driver:是运行时环境的驱动库,包括GPIO、SPI、UART、I2C、DMA、USB等外设驱动。本文将使用里面的GPIO驱动库来做简单的闪光灯处理。
SVD和最后的Keil.STM32F1xx_DFP.pdsc应该是下载时的一些信息,在编程中没有作用,不做解释。
新建一个新工程,选择自己要的元件(我使用的是STM32F103RCT6,选择STM32F103RC)。
接着会出现Manage Run-Time Environment窗口(如图4),该窗口用于选择要添加到工程中的组件:
(图4)
本文中使用的是RTE_Driver的GPIO驱动,先选择Device中的Startup和GPIO,下面有提醒缺少CMSIS:CORE部件,可以电机下面的提醒,会自动跳到CMSIS:CORE,点击勾起来。当然要驱动GPIO等也可以使用Device中的StdPeriph Drivers(标准外设驱动,也就是V3.5版本的标准外设外设驱动,在MDK5.0之前,还需要下载该库,并且手动添加lib驱动文件,现在则都在该窗口中选择好,就好自动添加到project中)。选择好添加的部件后,点击OK键,部件就自动加载到project中去了,很方便,keil5.0真的是进步很大啊。
接着还要在option for target添加 图2 中下载的包中要使用的驱动的相关头文件路径,不做详细介绍了。
建立源文件main.c.
#include "stm32f10x.h"
#include "GPIO_STM32F10x.h"//RTE Driver GPIO头文件
#define u32 unsigned int
static void delay(u32 n)
{
u32 i,j;
for(i=0;i
}
int main()
{
GPIO_PortClock(GPIOA,ENABLE);
if(GPIO_PinConfigure(GPIOA, 1,GPIO_OUT_PUSH_PULL,GPIO_MODE_OUT10MHZ)
&&
GPIO_PinConfigure(GPIOA, 2, GPIO_OUT_PUSH_PULL,GPIO_MODE_OUT10MHZ))
{
}
else
{
return -1;
}
for(;;)
{
GPIO_PINWRITE(GPIOA,1,1);
GPIO_PinWrite(GPIOA,2,1);
//GPIO_PortWrite(GPIOA,GPIO_Pin_2|GPIO_Pin_1,(uint16_t)0x06);
delay(1000);
GPIO_PinWrite(GPIOA,2,0) ;
GPIO_PinWrite(GPIOA,1,0);
//GPIO_PortWrite(GPIOA,GPIO_Pin_2|GPIO_Pin_1,(uint16_t)~0x06);
delay(1000);
}
}
本例子使用GPIOA的pin1和pin2。
GPIO_PortClock原型:void GPIO_PortClock (GPIO_TypeDef *GPIOx, bool enable)
GPIO_PinConfigure原型:
bool GPIO_PinConfigure(GPIO_TypeDef *GPIOx,uint32_t num,GPIO_CONF conf, GPIO_MODE mode);
num为GPIOx的pin number,conf为设置输出方式,mode为输出模式,本例设置为最大输出速度10MHZ。其中:
/// Port Mode所以先用GPIO_PortClock(GPIOA,ENABLE);使能GPIOA的时钟,再用GPIO_PinConfigure(GPIOA,1,GPIO_OUT_PUSH_PULL,GPIO_MODE_OUT10MHZ)、
GPIO_PinConfigure(GPIOA,2,GPIO_OUT_PUSH_PULL,GPIO_MODE_OUT10MHZ)
设置GPIOA的pin1和pin2为最高速度为10MHZ的推挽输出。
接着在主循环中给GPIOA的pin1和pin2写数据,并延时产生闪光灯的效果。
写数据可以用:
void GPIO_PinWrite (GPIO_TypeDef *GPIOx, uint32_t num, uint32_t val);//num为 pin号数,如1表示1脚,2表示2脚。val为pin脚位的值,所以只有1或0两个值。
void GPIO_PortWrite (GPIO_TypeDef *GPIOx, uint16_t mask, uint16_t val)。//mask为pin在寄存器中对应的位位置,可以用GPIO_Pin_num宏来设置。val为16位的Port x 对应的输出数据寄存器值。
效果图:板子是自己画的,只有一个led用来做测试用的,所以GPIOA的pin1和pin2只有一个能控制灯,静态图也不能看出闪的效果 -.- 。
本文主要是探索RTE_Driver的使用。与Standard peripheral Driver的GPIO比,RTE_Driver操作更简单,更接近单片机裸机开发。而standard peripheral Driver功能更多,更接近于app开发,封装性更强。同时RTE_Driver主要是提供外设接口驱动作用的,还有standard外设驱动没有的USB驱动。