TM4C123G入门(二)

  在TivaWareTM for C系列软件驱动程序库中,提供了两种编程模型来支持用户的程序开发:直接寄存器访问(DRA)模型和软件驱动程序(SD)模型。根据用户对其应用程序的需求或开发人员所需的编程环境,可以独立使用或组合使用每个模型

  使用DRA模型的优点是可以在较小的规模下开发目标程序,效率较高。但是开发人员需要非常详细地了解处理器和外围硬件体系结构、接口配置以及详细的接口参数。通过使用SD模型,用户无需过多了解外围硬件体系结构和接口配置,可以通过驱动程序库轻松构建接口功能,实现对外围设备的控制和接口,从而获得所需达到的目标

  在SD模型中,外围驱动程序库提供了一个相关的应用程序接口(API),该API允许用户通过该API中涉及的一组接口函数访问和控制外围设备。由于这些驱动程序在正常操作模式下提供了对外围设备的完全控制,因此可以在不直接访问硬件的情况下编写整个应用程序。这种方法提供了应用程序的快速开发,而不需要详细的知识

  接下来,我们将使用组合模型来构建和开发我们的应用程序项目。换句话说,我们将结合DRA模型和SD模型来构建我们的应用程序。在我们的程序中,我们可以使用DRA模型直接访问硬件,包括与mcu相关的寄存器、内存和外围设备。在其他一些部分,我们可以调用驱动程序库提供的API函数来间接地访问和控制硬件和外围设备来实现我们的目标。

  首先,让我们通过一个示例项目来研究直接寄存器访问(DRA)模型。

  在直接寄存器访问(DRA)模型中,用户可以通过直接将值写入外设寄存器来访问和控制外设。用户需要使用外围驱动程序库提供的一组寄存器宏或寄存器符号定义来简化编码过程。这些寄存器符号定义存储在inc目录中包含的特定于mcusific头文件中。头文件的名称与MCU号匹配。例如,TM4C123GH6PM MCU的头文件位于D:\ti\TivaWare_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盘下创建一个名为\ARMClassProjects\Chapter4/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         

DRAModel.h

  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
        {
        }
    }
}

DRAModel.c

  4. 系统头文件和其他头文件包含到项目通过将它们添加到项目或使用包括路径函数ARM-MDKμVersion5。

    执行以下操作来添加系统头文件<stdint。h>导入项目:
    1. 这个头文件是一个Keil ARM-MDK C/ c++编译器系统头文件,用于定义C/ c++文件中使用的所有整数数据类型。此文件位于MDK μVersion5安装所在的文件夹中(例如C:\Keil_v5\ARM\ARMCC\include )。

    2. 在“Project”窗格中,展开目标文件夹,右键单击“Source Group 1 ”文件夹,并选择“Add Existing Files to Group ‘Source Group 1’ ”。在打开的向导中,浏览到这个文件的位置,(C:\Keil_v5\ARM\ARMCC\include)然后单击这个头文件来选择它。然后单击Add按钮将其添加到我们的项目中。

  5. 通过将外部函数、变量和其他C源文件放在当前项目文件夹下,将它们包含到项目中。

    因为在这个示例项目中我们没有使用任何其他C源文件和外部函数,所以在这一步中我们不需要做任何事情。然而,在其他一些复杂的项目中,必须执行此步骤,否则项目将无法正常工作。

  6. 链接项目库(静态库或动态库)

    在这个示例项目中,我们没有使用任何静态或动态链接库,因为我们使用了直接寄存器访问模型。因此,我们不需要对这一步做任何事情。然而,在其他一些项目中,要么是静态链接库,要么是动态链接库,比如使用TivaWareTM外围设备驱动程序库时,必须执行此步骤。否则,您根本无法运行项目。

  去Project | Build Target 菜单项,以编译此示例项目并将其与系统文件链接,以生成项目映像或可执行文件。如果这个示例项目没有问题,则应该在底部的Build Output窗口中显示0 Error(s) with 0 Warning(s) 的输出。

  通过使用Flash|Download 菜单项,可以将项目图像文件下载到闪存中。现在,您可以通过进入Debug| run菜单项来运行这个程序。当程序运行时,你会发现绿色的LED会一直闪烁。确保您使用的调试器是Stellaris ICDI,可以从项目菜单下的“目标1”项选项中的Debug选项卡中选中它。

原文地址:https://www.cnblogs.com/tianxxl/p/11067271.html

时间: 2024-11-15 06:35:03

TM4C123G入门(二)的相关文章

[WebGL入门]二十,绘制立体模型(圆环体)

注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中如果有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,如果翻译有误,欢迎大家指正. 本次的demo的运行结果 立体的模型 这次稍微喘口气,开始绘制立体模型.这里说的[喘口气]是指本次的文章中没有出现任何新的技术知识点.只是利用到现在为止所介绍过的内容,来绘制一个立体的圆环体.到现在为止,只绘制了三角形和四边形,当然,在三维空间中绘制简单的多边形也没什么不对,但是缺点儿说服力.

kafka入门二:Kafka的设计思想、理念

本节主要从整体角度介绍Kafka的设计思想,其中的每个理念都可以深入研究,以后我可能会发专题文章做深入介绍,在这里只做较概括的描述以便大家更好的理解Kafka的独特之处.本节主要涉及到如下主要内容: Kafka设计基本思想 Kafka中的数据压缩 Kafka消息转运过程中的可靠性 Kafka集群镜像复制 Kafka 备份机制 一.kafka由来 由于对JMS日常管理的过度开支和传统JMS可扩展性方面的局限,LinkedIn(www.linkedin.com)开发了Kafka以满足他们对实时数据流

Netty入门二:开发第一个Netty应用程序

    既然是入门,那我们就在这里写一个简单的Demo,客户端发送一个字符串到服务器端,服务器端接收字符串后再发送回客户端. 2.1.配置开发环境 1.安装JDK 2.去官网下载jar包 (或者通过pom构建) 2.2.认识下Netty的Client和Server 一个Netty应用模型,如下图所示,但需要明白一点的是,我们写的Server会自动处理多客户端请求,理论上讲,处理并发的能力决定于我们的系统配置及JDK的极限. Client连接到Server端 建立链接发送/接收数据 Server端

Thinkphp入门 二 —空操作、空模块、模块分组、前置操作、后置操作、跨模块调用(46)

原文:Thinkphp入门 二 -空操作.空模块.模块分组.前置操作.后置操作.跨模块调用(46) [空操作处理] 看下列图: 实际情况:我们的User控制器没有hello()这个方法 一个对象去访问这个类不存在的方法,那么它会去访问”魔术方法__call()” 用户访问一个不存在的操作—>解决:给每个控制器都定义个_empty()方法来处理 第二个解决方法:定义一个空操作 [空模块处理] 我们使用一个类,但是现在这个类还没有被include进来. 我们可以通过自动加载机制处理__autoloa

转 Python爬虫入门二之爬虫基础了解

静觅 » Python爬虫入门二之爬虫基础了解 2.浏览网页的过程 在用户浏览网页的过程中,我们可能会看到许多好看的图片,比如 http://image.baidu.com/ ,我们会看到几张的图片以及百度搜索框,这个过程其实就是用户输入网址之后,经过DNS服务器,找到服务器主机,向服务器发出一个请求,服务器经过解析之后,发送给用户的浏览器 HTML.JS.CSS 等文件,浏览器解析出来,用户便可以看到形形色色的图片了. 因此,用户看到的网页实质是由 HTML 代码构成的,爬虫爬来的便是这些内容

Redbean:入门(二) - Find

<?php require_once 'rb.php'; $tableName = 'link'; //连接数据库 R::setup('mysql:host=localhost;dbname=hwibs_model','root',''); //链接表 R::dispense($tableName); //1.获取对象记录句柄,如果不存在id的情况下就无法使用load,那么可以使用find方法进行查找 $result = R::find($tableName,'id > 4');//普通使用

DevExpress XtraReports 入门二 创建 data-aware(数据感知) 报表

原文:DevExpress XtraReports 入门二 创建 data-aware(数据感知) 报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用的,为了帮助更多的人不会像我这样浪费时间才写的这篇文章,高手不想的看请路过 本文内容来DevExpress XtraReports帮助文档,如看过类似的请略过. 废话少说 开始正事 一.创建应用程序并添加报表 启动 MS Visual Studio (2005.2008.或 2010). 在 Visua

MongooooooooooooooooooooDB入门二:基本概念介绍

前言 工欲善其事必先利其器.在学习MongoDB之前,需要对MongoDB的一些基本概念有系统的了解. 所以,本篇文章主要介绍MongoDB的一些基本概念,这些概念的定义均来自<MongoDB权威指南>,关于此书想要了解更多,请点击此处. 我尽量使用最简洁的语言来尽可能完整地描述这些基本概念,如有遗漏或不妥之处欢迎指正. 文档 文档是MongoDB的核心概念之一.多个键值对有序地放在一起便是文档.例如: {"name":"Jerry","sco

Flex入门(二)——Flex+BlazeDs+J2ee小实例

首先来简单介绍一下BlazeDS. BlaseDS的核心功能包括RPC Services(远程过程调用服务) 和Messaging Service(消息服务).BlazeDS是一个基于服务器的Java远程调用(remoting)和web消息传递(messaging)技术,使得后台的Java应用程序可以和运行在浏览器上的Flex应用程序能够互相通信.简单来说一个BlazeDS应用包括客户端(Flex或AIR应用程序)和一个服务端(J2EE程序).BlazeDS在期间起着承上启下的作用,Flex和B