在TivaWareTM for C系列软件驱动程序库中,提供了两种编程模型来支持用户的程序开发:直接寄存器访问(DRA)模型和软件驱动程序(SD)模型。根据用户对其应用程序的需求或开发人员所需的编程环境,可以独立使用或组合使用每个模型
使用DRA模型的优点是可以在较小的规模下开发目标程序,效率较高。但是开发人员需要非常详细地了解处理器和外围硬件体系结构、接口配置以及详细的接口参数。通过使用SD模型,用户无需过多了解外围硬件体系结构和接口配置,可以通过驱动程序库轻松构建接口功能,实现对外围设备的控制和接口,从而获得所需达到的目标
在SD模型中,外围驱动程序库提供了一个相关的应用程序接口(API),该API允许用户通过该API中涉及的一组接口函数访问和控制外围设备。由于这些驱动程序在正常操作模式下提供了对外围设备的完全控制,因此可以在不直接访问硬件的情况下编写整个应用程序。这种方法提供了应用程序的快速开发,而不需要详细的知识
接下来,我们将使用组合模型来构建和开发我们的应用程序项目。换句话说,我们将结合DRA模型和SD模型来构建我们的应用程序。在我们的程序中,我们可以使用DRA模型直接访问硬件,包括与mcu相关的寄存器、内存和外围设备。在其他一些部分,我们可以调用驱动程序库提供的API函数来间接地访问和控制硬件和外围设备来实现我们的目标。
首先,让我们通过一个示例项目来研究直接寄存器访问(DRA)模型。
在直接寄存器访问(DRA)模型中,用户可以通过直接将值写入外设寄存器来访问和控制外设。用户需要使用外围驱动程序库提供的一组寄存器宏或寄存器符号定义来简化编码过程。这些寄存器符号定义存储在inc目录中包含的特定于mcusific头文件中。头文件的名称与MCU号匹配。例如,TM4C123GH6PM MCU的头文件位于D: iTivaWare_C_Series-2.1.4.178(此目录为上一节的安装目录)下的inc/ TM4C123GH6PM .h目录中
在我们继续讨论如何使用DRA模型来构建我们的示例项目之前,首先让我们仔细看看本例中使用的硬件体系结构。
端口上的PF4和PF0引脚分别连接到两个板载按钮,即SW1和SW2。其余三个引脚PF1、PF2和PF3连接到三个不同颜色的led上。事实上,在我的这套开发板中,这三个LED集成到一个三色LED中,可以由F端口的三个引脚驱动。
在本例中,我们使用连接到绿色LED的PF3作为输出引脚来驱动LED开关,进行闪烁操作。
要使GPIO端口正常工作,首先需要按照以下顺序初始化和配置GPIO端口:
1. 通过在GPIO运行中设置适当的位,使系统时钟能够驱动GPIO Run Mode Clock Gating Control (RCGCGPIO) 寄存器。
2. 通过编程GPIODIR寄存器,为GPIO端口上的每个引脚设置方向。
3.通过在GPIODEN寄存器中设置适当的DEN位,使GPIO引脚成为数字I/O引脚。
4. 还可以选择配置GPIOAFSEL寄存器,将每个位作为GPIO模式或备用模式进行编程。这个步骤是可选的,因为大多数端口在系统重置后以GPIO模式工作。
为了有效地使用符号定义来定义和使用这些寄存器来成功地初始化和控制GPIO PORTF,我们需要仔细研究一下端口F使用的这些寄存器的结构和位函数。
•通用运行模式时钟门控寄存器(RCGCGPIO)
•GPIOPORTF方向寄存器(GPIOPORTFDIR)
•GPIOPORTF数字启用寄存器(GPIOPORTFDEN)
•GPIOPORTF数据寄存器(GPIOPORTFDATA)
由于GPIO备用模式选择寄存器(GPIOAFSEL)将在系统复位后设置为在GPIO模式下工作,并且GPIO高性能总线控制寄存器被设置为在系统重置后使用高级外围总线(APB),因此我们可以暂时跳过本例中设置的这两个寄存器。
为了初始化GPIO端口并提供一个系统时钟端口,应该使用GPIO运行模式时钟门控(RCGCGPIO)寄存器 。该寄存器为软件提供了在运行模式下启用和禁用GPIO模块的功能。当启用时,将为端口提供时钟,并允许访问端口寄存器。当被禁用时,时钟将被禁用以节省电能,对端口寄存器的访问将生成总线故障。
由于RCGCGPIO寄存器和RCGC2寄存器具有类似的功能,我们在本例中使用后者初始化GPIO端口f。这个寄存器在片上内存映射中的内存映射地址是0x400FE108。
在这个示例项目中,我们只需要使用三个与GPIO PORTF相关的寄存器:
1. PORTF数据寄存器(GPIO_PORTF_DATA_R)。
2. PORTF方向寄存器(GPIO_PORTF_DIR_R)。
3.PORTF数字使能寄存器(GPIO_PORTF_DEN_R)。
虽然每个GPIO端口使用的寄存器都是32位的,但是只使用了最低的8位,其中每个位对应于每个pin。
当在高级外围总线(APB)光圈中工作时,这些寄存器的内存映射地址为
•PORTF数据寄存器(GPIO_PORTF_DATA_R): 0x400253FC
• PORTF方向寄存器(GPIO_PORTF_DIR_R): 0x40025400
•PORTF数字使能寄存器(GPIO_PORTF_DEN_R) : 0x4002551C
由于这个项目非常简单,我们只使用一个头文件“DRAModel.h”和一个名“DRAModel.c”的应用程序文件。
使用Keil ARM-MDK开发微控制器应用程序的一般步骤包括:
1. 创建一个新的μVersion5项目与单片机的选择和MDK core/ CMSIS core。
执行以下操作来创建这个新的项目DRAModel:
1. 打开我的电脑,在D盘下创建一个名为ARMClassProjectsChapter4/DRAModel的新文件夹:
2. 打开Keil μVersion5去Project|new μVersionproject 菜单项创建一个新的μVersion项目。在打开的向导中,浏览到我们的新文件夹(在上面的步骤1中创建的DRAModel)。在“文件名”框中输入DRAModel,然后单击“保存”按钮创建该项目。
3.在下一个向导中,您需要为这个项目选择设备(MCU)。展开:Texas Instruments、Tiva C Series和TM4C123x Series,并选择TM4C123GH6PM ,单击OK关闭此向导。
4. 接下来会打开软件组件向导,您需要使用该向导为您的项目设置软件开发环境。展开两个图标,CMSIS和Startup ,并选中Sel中的CORE和Startup复选框。,然后单击OK按钮,因为我们需要这两个组件来构建项目。
2. 创建用户的头文件并将它们添加到项目中。
执行以下操作来创建这个新的头文件DRAModel.h:
1. 在“Project”窗格中,展开目标文件夹,右键单击“Source Group 1 ”文件夹,并选择“Add New Item to Group ‘Source Group 1’ ”添加新项。
2. 选择Header File (.h)并在Name:框中输入DRAModel,然后单击Add按钮将此文件添加到项目中。
3.将下面的代码输入到这个头文件中,然后单击file |Save菜单项来保存这个文件(或者Ctrl+s)。
1 /**************************************************** 2 ****DRAModel.h-Header file for the sample prcject DRAModel.c ****************************************************/ 3 //System Control registers (SYSCTL) 4 #define SYSCTL_RCGC2_R (*((volatile uint32_t")0x400FE108)) 5 #define SYSCTL RCGC2 GPIOF 0x00000020 // Port F Clock Gating Control 6 //GPIO registers (PORTF) 7 #define GPIO PORTF DIR_R (*((volatlle ulnt32_t*)0x40025400)) 8 #define GPIO_PORTF_DEN_R (*((volatile uint32t ")0x4002551C)) 9 #define GPIO PORTF DATA_R (*((volatile uint32t)0x400253FC)) 10 11
3.创建用户的C源文件并将它们添加到项目中。
执行以下操作来创建这个新的源文件DRAModel.c:
1. 在“Project”窗格中,展开目标文件夹,右键单击“Source Group 1 ”文件夹,并选择“Add New Item to Group ‘Source Group 1’ ”添加新项。
2. 选择C File (.c)并在Name:框中输入DRAModel,然后单击Add按钮将此源文件添加到项目中。
3.将下面的代码输入到这个源文件中,然后单击file |Save菜单项来保存这个文件,(或者Ctrl+s)。
//********************************************* // DRAModel.c -Main Application File for the Sample Project //********************************************* #include <stdint.h> #include "DRAModel.h" int main(void) { volatile uint32 t ui32Loop; SYSCTL_RCGC2_R= SYSCTL RCGC2_GPIOF; // Enable PORTF in RCGC2 //Do a dummy read to insert a few cycles after enabling the peripheral. ui32Loop =SYSCTL RCGC2 R; GPIO PORTF_DIR_R= 0x08;// Set PF3 pin as output pin GPIO PORTF DEN_R= 0x08;// Enable PF3 pin for digital function while(1)//Loop forever. { GPIO PORTF DATA R = 0x08;// Set PF3 pin to turn on LED. for(ui32Loop = 0; ui32Loop < 200000; ui32Loop++)// Delay for a bit { } GPIO_PORTF DATA_R &=~(0x08); // Reset PF3 pin to tum off LED. for(ui32Loop = 0; ui32Loop < 200000; ui32Loop++)// Delay for a bit { } } }
4. 系统头文件和其他头文件包含到项目通过将它们添加到项目或使用包括路径函数ARM-MDKμVersion5。
1. 这个头文件是一个Keil ARM-MDK C/ c++编译器系统头文件,用于定义C/ c++文件中使用的所有整数数据类型。此文件位于MDK μVersion5安装所在的文件夹中(例如C:Keil_v5ARMARMCCinclude )。
5. 通过将外部函数、变量和其他C源文件放在当前项目文件夹下,将它们包含到项目中。
6. 链接项目库(静态库或动态库)
在这个示例项目中,我们没有使用任何静态或动态链接库,因为我们使用了直接寄存器访问模型。因此,我们不需要对这一步做任何事情。然而,在其他一些项目中,要么是静态链接库,要么是动态链接库,比如使用TivaWareTM外围设备驱动程序库时,必须执行此步骤。否则,您根本无法运行项目。
去Project | Build Target 菜单项,以编译此示例项目并将其与系统文件链接,以生成项目映像或可执行文件。如果这个示例项目没有问题,则应该在底部的Build Output窗口中显示0 Error(s) with 0 Warning(s) 的输出。
通过使用Flash|Download 菜单项,可以将项目图像文件下载到闪存中。现在,您可以通过进入Debug| run菜单项来运行这个程序。当程序运行时,你会发现绿色的LED会一直闪烁。确保您使用的调试器是Stellaris ICDI,可以从项目菜单下的“目标1”项选项中的Debug选项卡中选中它。