使用RTE_Driver做驱动

RTE(run-time environment)driver:运行时环境驱动。

(图1)

MDK5.0开始,keil中出现了:在线安装和升级软件包(图1第三个按钮)、为目标选择软件包(图1第二个按钮)_、管理运行时环境(图1第三个按钮)三个按钮。使得keil更好用了,很多芯片开发包都可以在线下载升级,而不用再到官网下载开发包,当然还有挺多不可以在线升级下载的。最近在弄stm32f103rct6芯片,就是通过在线下载获得的开发包。点第三个按钮时出现如图2所示的窗口:

使用RTE_Driver做驱动_第1张图片

(图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所示:

使用RTE_Driver做驱动_第2张图片(图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),该窗口用于选择要添加到工程中的组件:

使用RTE_Driver做驱动_第3张图片

(图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;ifor(j=0;j<1000;j++);
}

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
typedef enum {
  GPIO_MODE_INPUT     = 0x00,              /// GPIO is input
  GPIO_MODE_OUT10MHZ  = 0x01,              /// Max output Speed 10MHz
  GPIO_MODE_OUT2MHZ   = 0x02,              /// Max output Speed  2MHz
  GPIO_MODE_OUT50MHZ  = 0x03               /// Max output Speed 50MHz
} GPIO_MODE;

/// Port Conf
typedef enum {
  GPIO_OUT_PUSH_PULL  = 0x00,               /// general purpose output push-pull
  GPIO_OUT_OPENDRAIN  = 0x01,               /// general purpose output open-drain
  GPIO_AF_PUSHPULL    = 0x02,               /// alternate function push-pull
  GPIO_AF_OPENDRAIN   = 0x03,               /// alternate function open-drain
  GPIO_IN_ANALOG      = 0x00,               /// input analog
  GPIO_IN_FLOATING    = 0x01,               /// input floating
  GPIO_IN_PULL_DOWN   = 0x02,               /// alternate function push-pull
  GPIO_IN_PULL_UP     = 0x03                /// alternate function pull up
} GPIO_CONF;


所以先用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做驱动_第4张图片


本文主要是探索RTE_Driver的使用。与Standard peripheral Driver的GPIO比,RTE_Driver操作更简单,更接近单片机裸机开发。而standard peripheral Driver功能更多,更接近于app开发,封装性更强。同时RTE_Driver主要是提供外设接口驱动作用的,还有standard外设驱动没有的USB驱动。

你可能感兴趣的:(嵌入式,单片机)