原创 Cortex-M3学习日志(一)-- GPIO实验1

2011-9-9 17:55 5862 8 13 分类: MCU/ 嵌入式

以前在学校时不知以后会干什么所以什么都学点,感觉什么有用就拿起学学,但是出来以后发现学没有致以用,于是也开始学者老前辈们抱怨当前教育与社会严重脱钩,但是学校也有冠冕堂皇的理由,我们教你的是思想,教你的是学习的方法。也许社会的现实就是这样吧,一遇到事,公说公有理,婆说婆有理,我们又能奈何?幸亏我们还有网络,幸亏我们还没有完全被封口,所以我们还能发发牢骚,好了,时间不早了,牢骚发的差不多了,下面开始写学习总结。

因为项目所需,所以不得不开始研究M3,我用的是NXP公司的LPC1768这个芯片,它是具有三级流水线的哈佛结构,带独立的本地指令和数据总线以及用于外设的稍微低性能的第三条总线,还包含一个支持随机跳转的内部预取指单元。关于LPC1768这个芯片的内部资源这里就不罗列了,这些数据手册上都写的很详细,以后在学习总结中也会慢慢涉及。好了,今天只是初步测试一下它的GPIO功能,所谓的GPIO20110817131801001.gif

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网站逛逛看看其它的handbookwhitepaper            

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

/*********************************************************************************

 文件名称:mian.c

     : 主要调度函数及应用函数                                                                                          

 编译环境: MDKV4.12                                                   

     : 外部12Mhz                                                                                                                                             

     : 11/08/16                                                         

     : 懒猫爱飞

     注:NULL

 ---------------------------------------------------------------------------------

 修改内容:NULL

 修改日期:XXXXxxxx      xxxx

 修改人员:xxx xxx xxx

                                                                                                                                                                                       

**********************************************************************************/

#include"main.h"

volatile unsigned long SysTickCnt;      /* 用于系统时钟计数 */

/********************************************************************************

 * 函数名称 void SysTick_Handler (void)

 * 函数功能 : 系统节拍定时器中断函数,每1ms计数一次

 * 入口参数 :

 * 出口参数 :

 *     :无

 *******************************************************************************/

void SysTick_Handler (void)

{         

  SysTickCnt++;

}

/********************************************************************************

 * 函数名称 void Delay (unsigned long tick) 

 * 函数功能 : 毫秒级延时函数

 * 入口参数 : unsigned long tick -- 延时时长

 * 出口参数 :

 *     :无

 *******************************************************************************/

void DelayMs (unsigned long tick)

{     

  unsigned long systickcnt;

 

  systickcnt = SysTickCnt;

  while ((SysTickCnt - systickcnt) < tick);

}

/********************************************************************************

 * 函数名称 void PortInit(void) 

 * 函数功能 : 端口初始化

 * 入口参数 :

 * 出口参数 :

 *     :无

 *******************************************************************************/

void PortInit(void)

{

   GPIO1->FIODIR = 0xB0000000;           /* LEDs on PORT1 defined as Output    */

   GPIO2->FIODIR = 0x0000007C;           /* LEDs on PORT2 defined as Output    */

   Led1Off();     /* 初始化时熄灭所有的灯 */

   Led2Off();

   Led3Off();

   Led4Off();

   Led5Off();

   Led6Off();

   Led7Off();

   Led8Off();

}

 

/********************************************************************************

 * 函数名称 int main(void)

 * 函数功能 : 主函数

 * 入口参数 :

 * 出口参数 :

 *     :无

 *******************************************************************************/

int main(void)

{

              SystemInit();     /* 系统初始化,函数在system_LPC17xx.c文件夹中定义 */

              SysTick_Config(SystemFrequency/1000 - 1);   /* 配置时钟中断,每1ms中断一次 */

                                                          /* core_cm3.h中定义*/

    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;

__O  uint32_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网站看一下它的handbookwhitepaper等资料,还可多到论坛转转,有些坛子里深藏了好多老鸟,好多大虾,好多大牛,有你学的,有你问的,只要肯用心,一根网线,能解决很多问题。

好了,1点多了,该休息一下了,下午还要干活呢,最后再吼一下懒猫的口号:

rar.gifSW.rar(源程序代码)

每天进步一点点,开心多一点^_^

 

 

 

 

 

 


PARTNER CONTENT

文章评论5条评论)

登录后参与讨论

用户1627677 2011-9-9 10:12

GPIO1->FIODIR = 0xB0000000; /* LEDs on PORT1 defined as Output */   GPIO2->FIODIR = 0x0000007C; /* LEDs on PORT2 defined as Output */ 这句话我有点看不太明白。请解释下。

用户1627677 2011-9-9 10:12

对了,我的qq5770102.

用户1627677 2011-9-9 09:53

你好,我正好开始学lpc,无意中发现你的博客,希望你坚持!和你一起学习。能加下我qq么,想向您请教一些问题。

xucun915_925777961 2011-8-19 14:11

我用的是我们公司项目的板子,处理器是NXP公司的LPC1768,有些功能我是把IO口引出来在万用板上焊的……

用户388268 2011-8-19 10:59

博主,我准备本月买M3开发板,请问您用的是?
相关推荐阅读
xucun915_925777961 2013-04-28 11:31
毕业后的五年拉开大家差距的原因在哪里?【转】
  有人工作,有人继续上学,大家千万不要错过这篇文章,能看到这篇文章也是一种幸运,真的受益匪浅,对我有很大启迪,这篇文章将会改变我的一生,真的太好了,希望与有缘人分享,也希望对有缘人有所帮助!...
xucun915_925777961 2013-03-31 20:28
职场大牛精彩总结:职场上,如何做人做事做管理【转】(文/张子阳)
      大道至简,越是根源和基本的问题,道理实际上越简单。关于如何做人、做事、做管理的书很多,我看得不多,但是我觉得这些书更多是侧重技术和实现细节上的,而很少从人的思想和观念去讲。实际...
xucun915_925777961 2013-03-28 14:03
介绍几种优秀的UML工具
统一建模语言(UML是 Unified Modeling Language的缩写)是用来对软件密集系统进行可视化建模的一种语言。UML为面向对象开发系统的产品进行说明、可视化、和编制文档的一种标准语言...
xucun915_925777961 2013-03-27 18:05
IAR EW FOR 8051 修改工程名称的方法
        近段时间一直在搞蓝牙4.0的开发任务,所以用到了IAR编译器,话说IAR编译器用途蛮广,可以编译MSP430,ARM,还有TI的51核芯片,当然,这要不同的版本,我现在用的是for...
xucun915_925777961 2013-03-26 16:40
Cortex-M3学习日志(八)-- TFT实验Part(a)
    自己用的LPC1768的开板带有一块2.4寸的TFT彩色液晶屏,虽然自己工作中还用不过显示屏,但是晚上闲着也是闲着,于是继续玩咱的LPC1768吧。 我的开发板上的液晶屏的用的是SPI接口,当...
xucun915_925777961 2013-03-25 20:48
说说那几款查看源代码的工具
说说那几款查看代码的工具 今天给大家介绍几款单片机工程师所喜欢的几款查看源代码的工具,这几款工具在懒猫的日常工作中可是帮了不少忙。 一、 Source Insight     Source Insig...
EE直播间
更多
我要评论
5
8
关闭 站长推荐上一条 /3 下一条