您的位置 首页 芯闻

Cortex-M3学习日志(一)– GPIO试验1

以前在学校时不知以后会干什么所以什么都学点,感觉什么有用就拿起学学,但是出来以后发现学没有致以用,于是也开始学者老前辈们抱怨当前教

曾经在校园时不知今后会干什么所以什么都学点,感觉什么有用就拿起学学,可是出来今后发现学没有致以用,所以也开端学者老前辈们诉苦当时教育与社会严峻脱钩,可是校园也有官样文章的理由,咱们教你的是思维,教你的是学习的办法。或许社会的实际便是这样吧,一遇到事,公说公有理,婆说婆有理,咱们又能怎么办?幸而咱们还有网络,幸而咱们还没有彻底被封口,所以咱们还能发发怨言,好了,时刻不早了,怨言发的差不多了,下面开端写学习总结。

由于项目所需,所以不得不开端研讨M3,我用的是NXP公司的LPC1768这个芯片,它是具有三级流水线的哈佛结构,带独立的本地指令和数据总线以及用于外设的略微低功用的第三条总线,还包含一个支撑随机跳转的内部预取指单元。关于LPC1768这个芯片的内部资源这儿就不罗列了,这些数据手册上都写的很具体,今后在学习总结中也会渐渐触及。好了,今日仅仅开始测验一下它的GPIO功用,所谓的GPIO

图1-1硬件原理图

硬件原理图很简单了,74LVC244是用来驱动LED的,74LVC244内部便是8个三态门,关于它的具体电气参数,请参阅它的数据手册。关于程序也不是太难,有几个当地要说一下。即然是GPIO试验,当然要重视GPIO的装备了,由于大部分引脚都具有一个以上功用,所以首先要装备引脚功用寄存器PINSEL,只有当引脚装备为GPIO功用时,GPIO的方向位才有用,关于其它功用来说,方向是主动的。关于引脚功用寄存器PINSEL功用如下表所示:

PINSEL0~PINSEL9的值

功用

复位后的值

00

默许功用,一般为GPIO口

00

01

第一个可选功用

10

第二个可选功用

11

第三个可选功用

PINSEL寄存器每两位操控一个引脚,由于各个引脚的功用不一样,所以PINSEL0~PINSEL9的装备也相应的有所不同,想具体了解这10个寄存器的功用能够参看《user.manual.lpc17xx》,这个手册能够到NXP的网站上去下载。由于这次试验仅仅用到GPIO功用,所以暂时不必管这个寄存器,用它的默许值就能够了。

另一个寄存器是引脚形式挑选寄存器PINMODE,它操控一切端口的作业形式,包含是否装备上拉/下拉电阻和特定的开漏操作形式等。引脚形式挑选寄存器PINMODE的功用如下表所示:

PINMODE0~PINMODE9的值

功用

复位后的值

00

引脚使能片内上拉电阻

00

01

中止形式

10

引脚没有使能片内上拉/下拉电阻

11

引脚使能下拉电阻

当引脚处于逻辑高电平时,中继形式使能上拉电阻,当引脚处于逻辑低电平时,使能下拉电阻,当引脚装备为输入且不是经过外部驱动时,引脚将坚持上一个已知状况。PINMODE_0D寄存器操控寄存器的开漏形式,引脚装备为输出且值为0时,开漏形式会正常地将引脚电平拉低。可是假如输出引脚为1,则引脚输出驱动封闭,等同于改变了引脚的方向,实际上是模拟了一个开漏输出。

PINMODE_0D0~PINMODE_0D4的值

功用

复位后的值

00

引脚处于正常形式(非开漏形式)

00

01

引脚处于开漏形式

除了以上两个寄存器要装备,与GPIO端口相关的寄存器还有快速端口值寄存器FIOPIN能够用来读/写端口的值,端口输出置位寄存器FIOSET,当这个寄存器的相应方位1时,相应端口引脚输出1,当然也能够从这个寄存器读取当时引脚输出的值,与它对应的寄存器是FIOCLR,当寄存器FIOCLR相应方位1时,相应引脚输出0,但这个寄存器是只写寄存器,不能读取数据。好了,关于这些寄存器先总结到这,具体的装备还要看LPC1768的用户手册《user.manual.lpc17xx》,当然也能够经常去NXP网站逛逛看看其它的handbook或whitepaper

好了,下面给出试验程序,由于程序太多,只给出部分,剩余的源文件能够到工程文件夹中去找:

#include”main.h”

volatile unsigned long SysTickCnt;

void SysTick_Handler (void)

{

SysTickCnt++;

}

void DelayMs (unsigned long tick)

{

unsigned long systickcnt;

systickcnt = SysTickCnt;

while ((SysTickCnt – systickcnt) < tick);

}

void PortInit(void)

{

GPIO1->FIODIR = 0xB0000000;

GPIO2->FIODIR = 0x0000007C;

Led1Off();

Led2Off();

Led3Off();

Led4Off();

Led5Off();

Led6Off();

Led7Off();

Led8Off();

}

int main(void)

{

SystemInit();

SysTick_Config(SystemFrequency/1000 – 1);

PortInit();

while(1)

{

Led1On();//LED1开

Led4On();//LED4

DelayMs(200);

Led1Off();//LED1关

Led4Off();//LED4关

DelayMs(200);

}

}

由于程序是最根底的试验,所以不是太难,程序中延时函数用的是体系节拍定时器,每1m中止一次,体系节拍定时器的中止装备函数是SysTick_Config(uint32_t ticks)它在core_cm3.h中有界说,有爱好的话能够看看。GPIO是一个结构体指针,原型在LPC17XX.H这个头文件中,其界说的原型如下所示:

typedef struct

{

__IO uint32_t FIODIR;

uint32_t RESERVED0[3];

__IO uint32_t FIOMASK;

__IO uint32_t FIOPIN;

__IO uint32_t FIOSET;

__Ouint32_t FIOCLR;

} GPIO_TypeDef;

还有几个宏界说,如下所示:

1)、#define GPIO1((GPIO_TypeDef *)GPIO1_BASE)

上面这个宏是把GPIO1指向芯片GPIO1的基址上,

2)、#define GPIO1_BASE(GPIO_BASE + 0x00020)

3)、#define GPIO_BASE(0x2009C000UL)

这三个宏就把GPIO的基址界说了出来,关于LPC1768内部地址的分配情况,能够参看它的数据手册,也可参阅一下《ARM Cortex-M3威望攻略》,这本书在网上有电子书,如同宋岩宁牛人早已把它翻译成中文了,懒猫现在也正在参阅这本书,别的一定要多去NXP网站看一下它的handbook,whitepaper等材料,还可多到论坛转转,有些坛子里深藏了许多老鸟,许多大虾,许多大牛,有你学的,有你问的,只需肯用心,一根网线,能处理许多问题。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/xinwen/263272.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部