ARMCortexM4嵌入式系统开发实践3

上传人:痛*** 文档编号:98253085 上传时间:2022-05-29 格式:DOC 页数:54 大小:1.89MB
收藏 版权申诉 举报 下载
ARMCortexM4嵌入式系统开发实践3_第1页
第1页 / 共54页
ARMCortexM4嵌入式系统开发实践3_第2页
第2页 / 共54页
ARMCortexM4嵌入式系统开发实践3_第3页
第3页 / 共54页
资源描述:

《ARMCortexM4嵌入式系统开发实践3》由会员分享,可在线阅读,更多相关《ARMCortexM4嵌入式系统开发实践3(54页珍藏版)》请在装配图网上搜索。

1、第3章第一个样例程序及工程组织本章阐述入门”过程的(5) ( 8 )步,通过这个过程,完成第一个CodeWarrior工程、AR工程的入门。利用GPIO模块编程控制发光二极管作为入门例子,给出CodeWarrior、IAR工程组织、框架,阐述各个文件的功能,主要目的是使读者理解程序框架和工作过程。 重点是透彻理解第一工程的执行过程。3.1通用I/O接口基本概念及连接方法1 . I/O接口的概念I/O接口,即输入输出接口,是微控制器同外界进行交互的重要通道。这里的接口英文 是port,也可以翻译为端口” ,另一个英文单词是in terface,也翻译为接口。从中文字面看,接口与端口似乎有点区别,

2、但在嵌入式系统中它们的含义是相同的。有时I/O引脚称为接口( in terface),而把用于对I/O引脚进行编程的寄存器称为端口( port),实际上它们是紧 密相连的。因此,不必深究它们之间的区别。有些书中甚至直接称I/O接口(端口)为I/O口。在嵌入式系统中,接口千变万化,种类繁多,有显而易见的人机交互接口,如操纵杆、 键盘、显示器;也有无人介入的接口,如网络接口、机器设备接口。2 .通用I/O所谓通用I/O,也记为GPIO (Ge neral Purpose I/O ),即基本的输入/输出,有时也称并 行I/O ,或普通I/O ,它是I/O的最基本形式。本书中使用正逻辑, 电源(Vcc

3、)代表高电平, 对应数字信号“ 1”;地(GND)代表低电平,对应数字信号“ 0”。作为通用输入引脚,MCU 内部程序可以通过端口寄存器读取该引脚,知道该引脚是“1”(高电平)或“0”(低电平),即开关量输入。作为通用输出引脚,MCU内部程序通过端口寄存器向该引脚输出“1 ” (高电平)或“ 0”(低电平),即开关量输出。大多数通用I/O引脚可以通过编程来设定工作方式为输入或输出,称之为双向通用I/O。3 .上拉下拉电阻与输入引脚的基本接法芯片输入引脚的外部有三种不同的连接方式:带上拉电阻的连接、带下拉电阻的连接和“悬空”连接。通俗地说,若MCU的某个引脚通过一个电阻接到电源(Vcc)上,这个

4、电阻被称为“上拉电阻”。与之相对应,若MCU的某个引脚通过一个电阻接到地(GND ) 上,则相应的电阻被称为“下拉电阻”。这种做法使得,悬空的芯片引脚被上拉电阻或下拉电阻 初始化为高电平或低电平。根据实际情况,上拉电阻与下拉电阻可以取值在1K Q10K Q之间,其阻值大小与静态电流及系统功耗相关。图3-1给出了一个MCU的输入引脚的三种外部连接方式,假设MCU内部没有上拉或下拉电阻,图中的引脚I3上的开关K3采用悬空方式连接就不合适,因为 K3断开时,引脚 I3的电平不确定。在图3-1中,R1R2 , R3;H&3E-JLJtfTHfid._FUXF-直一 IiKliiha卜 L hfamir

5、 U UrcKr_Fht SHJbbiriLiiM-iarii-fcrikcu- f C4oh | tfi-l-tirl-Q.CfrSt4 宙 crW. 1上Striwcla孚止呂片肝开中肝 r . aifs.: lighCiiiit “ isililZlunZpi3i .LlahCHunZA iuhtZHi|i;盅t詐増聆更廉主苗萍 wliGll|:1)小主情环计敦到一宦的嵐隹不打的亮r聒戌态+J1複 Fjntznuat:+; f -S-A64DHHXW1I Milll 1卫 禍国电IiflSlEi运打 怜“世片叭+饰& hF-4ri aant:阳肾iqp昌* L # u-i * E * i

6、i* fe* U * O fl* P|ii 申 费 “ : * 即 &住=0 Ale匾刁而-4h ll.rr:hNgpi| L 叮Ru曲二PDRT S ghir 二*ruCDunt!;S&WTK.:WtTO1 : 1.4tws 1图3-4 CW10.1环境运行界面需要说明的是,丿安装完毕以后要上网注册以申请使用许可(license key)。无论是下载的软件还是申请到的免费光盘,安装后都要通过因特网注册,以申请使用许可(lice nseKey )。这里可通过登录其网站,单击“Request a Key”实现。由于这一注册过程是在网上自动实现的,故只要网络通畅,这个往返过程在数分种之内即可过完成

7、。申请后会通过E-MAIL得到一个License.dat文件。将该文件复制到相应目录下即可,例如:“C:Program FilesFreescaleCW MCU”。对于免费的特别版本,安装好后用License.dat覆盖安装目录下的License.dat。CW环境的运行界面如图 3-4所示。3.3.3 JTAG写入器开发人员可以通过 JTAG写入器对目标板中的 Flash进行擦除、写入等操作。将机器码 下载到Flash后,可以进行程序的运行、调试。图 3-5给出了写入器的实物图。使用该写入 器时,一端连接 PC的USB 口,一端连接目标板的 BDM 口。详细的使用说明请见光盘。3.3.4 MK

8、60N512VMD100 硬件核心板MK60N512VMD100 硬件核心板如图 3-6所示,该硬件核心板使用 144引脚的MAPBGAAb吨!1”iii 胡,y I- _rOf UT CU Ctai c 丽Ifjl圖闊间同_ _ _tEiTiu; MdsHUM Krsaaam门m F 简囱冋瞌盾1 ff f L-lLrJLJtJM *_* 1* *QOO封装,为4层电路板。通过扩展板为其供电,扩展板上实现了K系列芯片的大部分模块,其中包括LED,CAN,UART,SD卡,USB OTG,以太网和 LCD等模块。扩展板使用两 层电路板,提供12V电源输入插头,板上使用 LM2576芯片将12V

9、电压转换至3.3V电压。LM2576产生的3.3V电源提供 MK60N512VMD100 核心板和扩展板上的所有元件,LM2576可以提供3A的输出电流,足够核心板和外设使用。扩展板实物图见图3-7所示。图3-5写入器的实物图图3-6 MK60N512VMD100 硬件核心板!:-雨J :話胪L-l ftW-图3-7 K系列扩展板3.4 IAR工程文件组织嵌入式系统工程往往包含很多文件,如:程序文件、头文件、与编译调试相关的信息文件、工程说明文件以及工程目标代码文件等。工程文件的合理组织对一个嵌入式系统工程犹为重要,它不但会提高项目的开发效率,同时也降低项目的维护难度。嵌入式系统工程的文件组织

10、方法以硬件对象为核心来展开,系统中每个对象应包含相关的头文件、程序文件及说明文件等。以硬件对象的方式来组织文件,会使得工程结构清晰, 调试定位方便,后期维护容易,这也是嵌入式系统软件工程的基本思想。3.4.1工程文件的组织图3-8给出了用I/O 口控制小灯闪烁工程的树形结构模板,该模板是苏州大学飞思卡尔 嵌入式系统实验室专门为MK60N512VMD100开发板设计的工程模板。读者在新建工程时可以选择该模板。该模板方便易懂,与IAR提供的DEMO的工程模板相比文件少,去掉了一些初学者不易理解且不是必须的文件,同时应用底层软件构件的概念改进了程序结构,目的是一开始就引导读者进行规范的文件组织与编程

11、。新建工程有两种方法,一种是使用工程模板,另一种是使用已存在的工程来建立另外一 个工程。第一种方法的操作步骤如下:选择 file-WorkSpace,建立工作区,然后选择Project-Create New Project,弹出 CreateNew Project对话框,选择ARM ”,选择编程语言,选中main,然后点确定,输入文件名, 点保存,这样就创建了一个工程。创建工程后需要按照具体的要求来进行配置,这点详见“创建新工程的步骤.docx”。第二种方法是使用已存的工程来建立另一个工程。当在已有工程的基础上,做另一个项目时,比如在light工程的基础上编写 LCD程序,需要进行如下设置:(

12、1) 更改工程文件夹名为LCD(2)更改 light.dep 为 LCD. dep(3)更改 light.ewd 为 LCD. ewd(4)更改 light.ewp 为 LCD. Ewp(5)更改 light.eww 为 LCD. eww(6) 用记事本方式打开LCD. Eww,代码如下$WS_DIR$ light.ewp将其中的light.ewp改为LCD.ewp(7) 打开该工程,你会看到机器码文件还是light.map与light.out,这时进行编译,编译结束后,你会看到light.map与light.out变为LCD.map与LCD.out。新建工程时,我们建议采用第二种方式,这种方

13、式比较简单,无需配置,不容易出错。下面以控制小灯闪烁工程为例, 介绍基于IAR环境的嵌入式工程文件组织方法。图3-7给出了该工程相关源文件的树型结构,可分为“工程配置文件”、“源程序文件”、“机器码文件”三个部分。 QI light-FLASH1 Qi Proiect_Settings.il 口 link| I Pflssh.icf-1 E Ram.icf 一 口 Startup_CodeE SSicrtO.s小灯工程工程配置文件夹链接文件文件夹FLASH链接文件RAM链接文件启动代码文件夹 芯片启动汇编文件 芯片启动C语言文件SourcesTl 口 Component_C源程序文件夹C语言程

14、序构件C文件夹町 gpio cH1 0 light.c _ 0 0 uart.c _ *(1 0 wdog cGPIO构件源文件GPIO构件源文件Il LJ Frame_C 一T3 0 common 匚a 话 sysinit.cT3 町 vechoirs.CE B isr.c E |?) main.cT? 口 Component_H gpin h- B light.h- 0 uart h ItJ wdog h口 Frame_H0 common h0MK6ON5l2VMDlOO.h0 sysiriit.h3 ve ctors.hQ includes.h洱二 Outputtffi light,D

15、light.out看门狗构源头文件框架C文件夹 通用函数源文件 芯片初始化源文件 芯片初始化源文件 中断服务例程源文件 主程序源文件头文件文件夹构件头文件夹gpio构件头文件 小灯构件头文件 串口构件头文件 看门狗构件头文件框架头文件夹 通用函数头文件 存储器映像头文件 芯片初始化头文件 中断向量头文件 总头文件机器码文件夹机器码文件lE (?) start c图3-8工程相关源文件的树型结构“工程配置文件”中包含的文件与芯片及工程初始化相关,包括链接文件与启动代码文件。启动代码文件有“ crtO.s”与“ start.c”,而且前面都有一个43,展开后会看到好多文件, 这些都是与其相关联的文

16、件。“链接文件”定义了芯片存储器的分配和可执行代码地址空间的分配,包括 Pflash.icf与Ram.icf两个文件,通过修改它们可以将可执行代码链接到芯片 RAM中或Flash中。“源程序文件夹“包括C语言程序、头文件。其中C语言程序包括构件C文件夹”Component_C、框架C文件夹” Frame_C、中断服务例程源文件 isr与主程序源文件 main, 头文件包括构件头文件”Component_H “、框架头文件夹” Frame_H 与总头文件includes.h。系统启动并初始化后,程序根据main.c中定义的主循环顺序执行,当遇到中断请求时,转而执行isr.c中定义的相应中断处理程

17、序;中断处理结束,则返回中断处继续顺序执行。由 于main.c和isr.c文件反映了软件系统的整体执行流程,故而在工程文件组织时,将它与其 余C语言程序文件分开管理。” Component_C “与” Component_H “包含构件代码,每个构 件都对应一个.c文件与.h文件,例如 GPIO.c与GPIO.h文件。以后的章节还会出现“串行通信”、“键盘”、“LED ”、“液晶”等构件。与总体框架程序相关的头文件和源文件分别放在 了 Frame_H 和 Frame_C文件 夹中,以归类管理。Frame_H 里包含了 common .h、 MK60N512VMD100.h、sysinit.h

18、与 vectors.h 四个头文件。 MK60N512VMD100.h 是芯片寄存 器及相关位定义头文件,它被视为芯片的接口文件,没有这个文件,就不可能对该芯片进行任何操作。sysinit.h与Frame_C文件夹中的sysinit.c对应,它定义了系统初始化时的基本参 数,如系统时钟等,而sysinit.c文件则包含实际初始化代码。common.h与common.c对应,它提供常用且基本的软件功能性子函数。“机器码文件”包括.out文件与.map文件,写到Flash中的文件为.out文件,该文件在 IAR下打不开,不过我们可以打开.srec文件,它相当于 CodeWarrior下的.s19文

19、件。3.4.2初始化相关文件1. 启动文件crtO.s与start.c由于芯片启动代码直接面对内核和硬件控制器进行编程,一般都是用汇编语言实现。在芯片上电复位后,初始化CPU各寄存器,关闭中断等,需要用ARM的汇编语言编写启动代码(crtO.s文件),然后跳转到用户 C程序(start.c),在这里复制中断向量与代码到RAM中,初始化芯片时钟,打开中断,然后跳转到main函数继续执行。在 ARM设计开发中,启动代码的编写是一个极重要的过程。启动代码随具体的目标系统和开发系统有所区别, MK60N512VMD100 芯片的启动流程见图 3-9所示。1)芯片上电MK60N512VMD100 允许将

20、中断向量放置在Flash或者RAM中,但是上电时刻中断向量只能在地址 0x0000_0000处。上电后,K60首先从地址0x0000_0000处取栈地址,从地址 0x0000_0004处取复位向量地址,然后跳转至复位向量地址处执行,代码在vectors.h处,如下:#define VECTOR_000(pointer*)_BOOT_STACK_ADDRESS / 初始化 SP#define VECTOR_001_startup / 0x0000_0004 1 -初始化 PC2)crt0.s 文件芯片上电后,转至 crt0.s文件执行代码如下:_startupMOVr0,#0;初始化寄存器MOV

21、r1,#0MOV r2,#0MOVr10,#0MOVr11,#0MOVr12,#0CPSIE i;屏蔽中断import startBLstart;调用 start53复位向量中首先清零所有CPU通用寄存器,关闭总中断,然后调用start,依次关闭看门狗、复制中断向量表到RAM中、初始化芯片时钟、转到main函数继续执行。#图3-9 MK60N512VMD100 芯片启动流程3) start.c 文件该文件的部分代码如下void start(void)/关闭看门狗 wdog_disable();/复制中断向量表到 RAM中common_startup();系统设置sysinit();/进入主函数

22、 main();下面详细讲述下这部分代码。(1) 关闭看门狗看门狗在嵌入式设计中特别重要,它可以在芯片代码跑飞或死机的情况下复位芯片。嵌入式产品往往24小时全天候运行,为了保证程序一直运行正常必须在产品正式发布时使能 看门狗。而在程序调试阶段,为了保证程序执行流程,往往先关闭看门狗中断。 MK60N512VMD100的看门狗控制寄存器是只写一次寄存器,即上电后只能对其进行一次写入,如果想进行多次写入必须首先解锁看门狗。看门狗解锁是向看门狗的解锁寄存器连续写入0xC520和0xD928 ,两次写入不能超过 20个时钟周期,否则解锁失败并产生看门狗中断。 看门狗解锁后,通过配置看门狗控制寄存器的W

23、DOGEN位来关闭看门狗。如果程序在完成启动之后要使用看门狗,首先要解锁看门狗然后设置WDOGEN位来使能看门狗。看门狗使能以后,会在溢出时间超时后产生看门狗复位。程序中必须在溢出超时前“喂狗”。“喂狗”后看门狗模块重新计时,MK60N512VMD100 的“喂狗”是向看门狗刷新寄存器连续写入 0xB480和0xA602。两次写入间隔不能超过20个时钟周期。源代码请见样例程序中的 wdog.c文件。(2)复制中断向量表到 RAM中代码在RAM中执行的效率比在 Flash中执行高。通常 ARM芯片都会将中断向量表复 制到RAM中。未初始化的数据段(BSS)应该清零。其中涉及到几个Link文件中定

24、义的变量,包括:Flash中断向量表地址 VECTOR_ROM,RAM 中断向量表地址 VECTOR_RAM。 这些变量定义在 Link文件两个.icf中。源代码请见样例程序中的startup.c文件、Pflash.icf 文件与Ram.icf文件。(3)系统设置芯片主时钟是利用 MCG模块中的PLL模块,通过倍频板上50MHZ的有源晶振得到的。 在Kinetis芯片内部存在 3种不同时钟:内核时钟,总线时钟和Flash时钟。内核时钟是基本时钟,其他时钟均从内核时钟分频得到。Kinetis手册推荐了 3种时钟配置方式,分别将内核时钟配置为 50MHZ,96MHZ和100MHZ。源代码请见样例程

25、序中的sysinit.c文件。d)跳转至main函数执行上述三步执行结束后,芯片已经进入了正常运行状态,可以执行main函数中用户定义的代码了。代码中直接调用main函数即可。到此为止,芯片开始执行用户功能代码,芯片启动阶段结束。2. 芯片相关文件1) 映像寄存器定义文件MK60N512VMD100.hMK60N512VMD100.h中定义了编程时需要访问的外设寄存器,该文件不修改。2)系统初始化文件 sysinit.c与sysinit.h系统初始化操作是由 sysinit.c与sysinit.h来实现的,具体内容参见样例程序。3. 主程序、中断程序及其它文件1)总头文件includes.h与

26、主程序文件 main.cincludes.h文件包含主函数(main)文件用到的头文件、外部函数或变量引用、有关常 量和全局变量定义以及内部函数声明。而main.c文件是工程任务的核心文件,里面包含了一个主循环,对具体事务过程的操作几乎都是添加在该主循环中。2)中断文件isr.h与isr.cisr.h文件包含isr.c文件用到的头文件,外部函数以及内部函数声明等,isr.c文件执行具 体的操作,具体内容可参见带有中断的样例程序。4. 链接文件 Pflash.icf文件与 Ram.icf文件链接文件定义了芯片存储器的分配和可执行代码地址空间的分配。可以选择将可执行代码链接到芯片 RAM中或Fla

27、sh中。具体内容可参见样例程序。5. 机器码文件在编译链接过程中,IAR会产生机器码文件.out文件,这是写入到 Flash中的文件,在 IAR环境中打不开。如果在项目配置时选择在编译链接过程产生.srec文件,那么在控制小灯闪烁的工程中我们可以得到GPIO.srec文件,这个文件可以打开,内容以S记录格式表示。S记录格式是Freescale公司的十六进制目标代码文件,它将目标程序和数据以ASCII码格 式表示,可直接显示和打印。目标文件由若干行 S记录构成,每行S记录可以用CR/LF/NUL 结尾。一行S记录由下列五部分组成,分别说明如下。(1)类型表示S记录的类型。有 8种记录类型 SO、

28、S1、S2、S3、S5、S7、S8、S9。这是为了满 足不同的编码、解码及传送方式的需求,表3-1给出了 S记录的格式。表3-1 S记录格式类型r记录长度地址编码/数据校验和2字节2字节2、3或4字节0n字节1字节SO该记录包含 S19文件的文件名信息。S1 该记录包含代码/数据以及两个字节存储其代码/数据的存储器首地址。S2该记录包含要写到Flash的扩展地址处的代码/数据以及三个字节存储其代码/数据的存储器首地址。S3该记录包含要写到Flash的扩展地址处的代码/数据以及四个字节存储其代码 /数据的存储器首地址。57 S3记录的结束记录。58 S2记录的结束记录。59 S1记录的结束记录。

29、每个S记录块都使用唯一的终止记录。(2)记录长度表示该记录行中字符对的数目,不包括类型和记录长度。(3)地址它可以是2个字节、3个字节或4个字节,取决于记录类型。 S1记录、S9记录均是2 个字节,S2记录、S8记录是3个字节,S3记录、S7记录是4个字节。它表示其后的代码 / 数据部分将要装入的存储器起始地址。(4)代码/数据就是实际的目标代码或数据,这一部分将被下载到目标芯片的存储器并运行。其字节数是由“记录长度”域的实际数值减去地址长度和校验码长度的值而得到的。(5)校验和为1个字节,它是“记录长度”、“地址”、“代码/数据”三个部分所有字节之和的反码 的低8位,用于校验。下面是01_G

30、PIO工程中的GPIO.srec的部分内容。S00C00006770696F2E7372656369, S3151FFF0000F8FF00201104FF1FD127FF1FD127FF1F56S7051FFF291F94第一行为S0记录,表示文件名信息。S0之后的0C是十六进制数(十进制数 12),表示后面有12个字节的数据;随后的0000是2字节地址,0000表示本行信息不是程序/数 据,不需要装入存储空间;最后的69是本记录的校验和。其中 S3151FFF0000F8FF00201104FF1FD127FF1FD127FF1F56 的前两个符号 S3 表示这一行是 S3 记录,其后的“

31、15”是十六进制数(十进制数的21),表示在此行其后有 21个字节的数据, 包括4个字节的地址 仆FF0000、16个字节的代码/数据,最后字节 56为校验和。该行记录 所表示的实际代码/数据 F8FF00201104FF仆D127FF仆D127FF仆将被装入起始地址为1FFF0000的MCU存储器中。最后一行是 S7记录,S7之后的05是十六进制0x05,表示其后有5个字节的/数据。 仆FF29仆 为4个字节的地址,94是校验和。3.5 CW工程文件组织CW工程文件组织与IAR工程文件组织基本一样,但略有不同,下面简单阐述一下。3.5.1工程文件的组织图3-10给出了用I/O 口控制小灯闪烁

32、工程的树形结构模板,该模板是苏州大学飞思卡 尔嵌入式系统实验室专门为MK60N512VMD100 开发板设计的工程模板。读者在编程时可以选择该模板。该模板方便易懂,与CW提供的DEMO工程模板相比,去掉了一些初学者不易理解且不是必须的文件,同时应用底层软件构件的概念改进了程序结构,目的是一开始就引导读者进行规范的文件组织与编程。新建工程有两种方法,一种是使用工程模板,另一种是使用已存在的工程来建立另外一 个工程。第一种方法的操作步骤如下:选择 file-new-Bareboard Project,弹出 New Bareboard Project 对话框,然后根据芯片 型号来选择配置就创建了一个

33、工程,详见“创建新工程的步骤.docx ”。第二种方法是使用已存的工程来建立另一个工程。当在已有工程的基础上,做另一个项目时,只需更改工程名即可。新建工程时,我们建议采用第二种方式,这种方式比较简单,无需配置,不容易出错。下面以控制小灯闪烁工程为例,介绍基于CW环境的嵌入式工程文件组织方法。图3-9给出了该工程相关源文件的树型结构,可分为“头文件路径”、“工程配置文件”、“输出文件”、“应用程序文件”4大部分。“头文件路径”为工程配置后自动生成的文件,不用改动。“输出文件”,包含.afx和S19等格式的目标机器码。“工程配置文件”包含与调试相关的配置文件,链接文件,启动代码文件。“应用程序文件

34、”包含通用函数,构件文件,主程序文件,中断服务例程文件等。3.5.2初始化相关文件这部分与IAR环境基本一致,只是机器码文件稍有不同而已。在编译链接过程中,CW会产生机器码文件.afx文件,这是写入到 Flash中的文件,在 CW环境中打不开。如果在项 目配置时选择在编译链接过程产生.S19文件,那么在控制小灯闪烁的工程中我们可以得到Light.afx.S19文件,这个文件可以打开,内容以S记录格式表示。j light : MKBOB512V1!IDLDO_I町EBHAL_FLASH恰血I Includes P E HIKE0N512VMD1 OO_IHTEK1IAL_FLASH D NIKB

35、0H512YIHD100_IHTEIQIAL_RAN J Froj act_Settings 恰 D DetuggerJi r Linker_Files 匕 12eKB,rwi. lcf 512KB_flh.lcfSaAnalysi spoint sflan&ger. apconfiji Star tup jCode crtO. e : start, c J 匕严 Sources ” &C 4 巳 Component_C-B 窗 gpio, c t c light, c工程文件夹头文件路径文件夹VFLASH输出文件夹 VRAM输出文件夹工程配置文件夹调试相关文件夹 链接文件文件夹 RAM链接文

36、件FLASH链接文件启动代码文件夹 芯片启动汇编文件芯片启动源文件V源程序文件夹C文件文件夹V构件C文件夹 -一GPIO构件源文件 一小灯构件源文件 看门狗构件源头文件JCIjCjeommoBL. c,C|sysini t.x| vectors.KE 4;斤| gr0main, c框架C文件夹 通用函数源文件芯片初始化源文件 一中断向量源文件中断服务例程源文件 一主程序源文件D 卜h gpim h - b h li ght. h.h. wdcg. h v头文件文件夹v构件头文件夹 GPIO构件头文件 一小灯构件头文件 看门狗构件头文件j L 5- Frsui#_H框架头文件夹图3-10工程相关

37、源文件的树型结构,c wdo. c3.6第一个应用实例:控制小灯闪烁本书用MK60N512VMD100 控制发光二极管指示灯的例子开始我们的程序之旅,程序中使用了 GPIO构件来编写指示灯程序。指示灯是最简单不过的硬件对象了,当灯两端引脚上有足够高的正向压降时,它就会发光。在本书的工程实例中,灯的正端引脚接 MK60N512VMD100 的普通I/O 口,负端引脚过电阻接地。当在I/O引脚上输出高或低电平时,指示灯就会亮或暗。3.6.1 GPIO 构件GPIO引脚可以被定义成输入、输出两种情况。若是输入,程序需要获得引脚的状态 (逻辑1或0)。若是输出,程序可以设置引脚状态(逻辑 1或0)。M

38、CU的GPIO引脚分为许多 端口( Port),每个口有若干引脚。为了实现对所有GPIO引脚统一编程,设计了 GPIO构件(由GPIO.h、GPIO.c两个文件组成)。这样,要使用GPIO构件,只需要将这两个文件加入 到所建工程中,方便了对 GPIO的编程操作。实际上,若只是使用构件,只需看头文件中的 相关函数说明。1 . GPIO构件的头文件 gpio.h/-*/文件名:gpio.h*/说明:gpio驱动头文件*/-*#ifndef _GPIO_H_#define _GPIO_H_1头文件#include common.h2宏定义2.1端口宏定义#define PORTA PTA_BASE_

39、PTR#define PORTB PTB_BASE_PTR#define PORTC PTC_BASE_PTR#define PORTD PTD_BASE_PTR#define PORTE PTE_BASE_PTR3函数声明/函数名:gpio_init*/功能:初始化gpio*/参数:port: 端口名*/index:指定端口引脚/dir:引脚方向,0=输入,1 =输出/data:初始状态,0=低电平,1=高电平/返回:无*/说明:无*/-*void gpio_init (GPIO_MemMapPtr port, int index, int dir,int data);/-*/函数名:gpi

40、o_ctrl*/功能:设置引脚状态*/参数:port: 端口名*/index:指定端口引脚/data:状态,0=低电平,1 =高电平/返回:无*/说明:无*/-*void gpio_ctrl (GPIO_MemMapPtr port, int index, int data);/函数名:gpio_reverse/功能:改变引脚状态/参数:port:端口名;/index:指定端口引脚/返回:无/说明:无/-void gpio._reverse (GPIO_MemMapPtr port, int index);#endif2 . GPIO构件的程序文件gpio.c/ 文件名:gpio.c*/说明:

41、gpio驱动程序文件/#include gpio.h /包含 gpio 头文件/ 函数名:gpio_init/功能:初始化gpio/参数:port: 端口名/index:指定端口引脚/dir:引脚方向,0=输入,1 =输出/data:初始状态,0=低电平,1 =高电平/返回:无/说明:无/void gpio_init (GPIO_MemMapPtr port, int index, int dir,int data) PORT_MemMapPtr p;switch(uint32)port)case 0x400FF000u:p = PORTA_BASE_PTR;break;case 0x400F

42、F040u:p = PORTB_BASE_PTR;break;case 0x400FF080u:p = PORTC_BASE_PTR;break;case 0x400FF0C0u:p = PORTD_BASE_PTR;break;case 0x400FF100u:p = PORTE_BASE_PTR;break;default:break;PORT_PCR_REG(p,index)=(0|PORT_PCR_MUX(1);if(dir = 1)/outputGPIO_PDDR_REG(port) |= (1index); if(data = 1)/outputGPIO_PDOR_REG(port

43、) |= (1index);elseGPIO_PDOR_REG(port) &= (1index);elseGPIO_PDDR_REG(port) &=(1index); / 函数名:gpio_ctrl*/功能:设置引脚状态*/参数:port:端口名*/index:指定端口引脚/data:状态,0=低电平,1 =高电平/返回:无*/说明:无*/-*void gpio_ctrl (GPIO_MemMapPtr port, int index, int data)if(data = 1)/outputGPIO_PDOR_REG(port) |= (1index);else GPIO_PDOR_RE

44、G(port) &=(1index); | 二 二/*/ 函数名:gpio_reverse*/功能:改变引脚状态*/参数:port: 端口名;*/ index:指定端口引脚*/返回:无*/说明:无*/*void gpio_reverse (GPIO_MemMapPtr port, int index)GPIO_PDOR_REG(port) A= (1index); 3.6.2 Light 构件控制指示灯的亮或暗,通过调用GPIO构件完成。设有两盏灯,分别为运行指示灯1、运行指示灯2,分别叫做Light_Run1、Light_Run2。它们所接在的 MCU的GPIO 口的名字 叫做Light_R

45、un_PORT。它们具体接在 MCU的哪个端口,哪个引脚,只要在 light.h中给出 具体宏定义就可以了。I.Light构件的头文件light.h/ 文件名:light.h*/说明:指示灯驱动程序头文件/#ifndef LIGHT_H_ #define LIGHT_H11l 头文件#include common.h#include gpio.h/2 宏定义/2.1灯控制引脚定义#define Light_Run_PORT PORTC /运行指示灯使用的端口#define Light_Run1 13 /运行指示灯使用的引脚#define Light_Run2 14 /运行指示灯使用的引脚112

46、.2灯状态宏定义#define Light_ON0/灯亮(对应低电平)#define Light_OFF1/灯暗(对应高电平)嗝/3数声明/*/ 函数名:light_init*/功能:初始化指示灯状态/参数:port: 端口名/ name:指定端口引脚号/ state:初始状态,1 =高电平,0=低电平/返回:无*/说 明:调用GPIOnit函数/void light_init(GPIO_MemMapPtr port,int name,int state);/*/ 函数名:Light_control*/功能:控制灯的亮和暗/参数:port: 端口名*/ name:指定端口引脚号/ state:状态,1 =高电平,0=低电平/返回:无*/说 明:调用GPIO_Set函数/*void light_control(GPIO_MemMapPtr port,int name,int state);/*/ 函数名:Light_change*/功 能:状态切换:原来暗,则变亮;原来亮,则变暗/参数:port:端口名/name指定端口引脚号/返回:无*/说明:调用GPIO_Get/-*GPIO_Set 函 数void light_change(GPIO_MemMapPtr port,int name)

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!