历史上的今天
返回首页

历史上的今天

今天是:2024年11月26日(星期二)

正在发生

2019年11月26日 | Cortex-M3学习LPC1768 - GPIO实验

2019-11-26 来源:51hei

因为项目所需,所以不得不开始研究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            


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

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

文件名称:mian.c

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

编译环境: MDKV4.12                                                   

时    钟: 外部12Mhz                                                                                                                                             

日    期: 11/08/16                                                         

作    者: 懒猫爱飞

备    注:NULL

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

修改内容:NULL

修改日期:XXXX年xx月xx日      xx时xx分

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

推荐阅读

史海拾趣

Circuit Technology Inc公司的发展小趣事

在追求经济效益的同时,CTI也高度重视环保和可持续发展。公司积极响应国家环保政策,引进环保设备和技术,减少生产过程中的污染排放。同时,CTI还致力于开发环保型电子产品,推动电子行业的绿色发展。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实的基础。

这五个故事只是关于Circuit Technology Inc公司可能发展路径的虚构描述,并不代表该公司的真实历史。实际上,每个公司的发展都有其独特的经历和故事,需要具体的研究和了解才能得知。

APSA公司的发展小趣事

APSA公司在创业初期,专注于电子行业中某一特定领域的技术研发。通过团队的不懈努力和持续创新,公司成功开发出一款具有竞争力的产品,填补了市场空白。这一技术突破不仅为APSA公司赢得了首批客户,也为公司的后续发展奠定了坚实的基础。

CDE [ CORNELL DUBILIER ELECTRONICS ]公司的发展小趣事

近年来,随着新能源市场的蓬勃发展,CDE公司敏锐地抓住了这一机遇。公司积极参与军事和能源应用的高压直流链路电容器市场,并成功推出了针对EV快速充电的高压直流链路电容器。这一产品的推出不仅满足了市场对高效、可靠电容器的需求,也为CDE在新能源领域的发展奠定了坚实基础。

Allied Electronic & Semiconductor Technology Inc公司的发展小趣事

AE&ST公司自创立之初,就深知技术创新是电子行业的核心竞争力。公司投入大量资源进行研发,不断探索新的半导体材料和生产工艺。在一次偶然的实验中,AE&ST的研发团队发现了一种新型半导体材料,这种材料在能效和稳定性方面表现出色。公司迅速将这一发现转化为产品,并推向市场。新产品一经推出,便因其卓越的性能获得了市场的广泛认可,AE&ST公司因此获得了巨大的商业成功。

CET Technology公司的发展小趣事

随着数字化转型的深入,CET Technology紧跟时代步伐,成功研发出数字化安全生产管控平台。该平台通过整合配电、给水、电梯、消防、空调、安防等各系统,建立统一的安全物联感知平台,实现对安全生产各要素的在线监测。利用3D可视化技术,关键信息得以直观呈现,为企业的安全生产管理提供了有力支持。此外,CET还引入了AI技术,对安全风险进行精准预测,助力企业防范和应对各类安全事件。

Apacer公司的发展小趣事

除了产品创新,Apacer宇瞻科技还注重为客户提供量身定制的解决方案。在某次客户系统升级中,宇瞻科技的技术团队发现原有SD卡无法满足大量随机小数据的存取应用,甚至可能缩短SSD使用寿命。于是,宇瞻科技建议客户导入Page Mapping技术,并搭配Smart Read Refresh技术的SD卡,成功解决了客户的存储问题。这一技术突破不仅帮助客户实现了系统升级,也为宇瞻科技赢得了更多的信任和赞誉。

问答坊 | AI 解惑

ISD1110、1420语音录放电路

ISD1110的/PLAYL、/PLAYE、/REC、A7和A6内部有上拉电阻,A5~A0内部有下拉电阻。因此R6、R7和R8不用接;不分段的话,地址也不必接地。按键和A7、A6接地会产生100微安的电流。 三、工作模式 1、单段录放音模式: 单段录放音时,需全部地址线 ...…

查看全部问答>

基于单片机的可画图智能小车

看到这个题目大家觉得如何下手?我是新手,希望大家给点思路(如单片机如何选择,用C语言编写的程序等),谢谢! 一、设计任务:制作一部可画简单图形的智能小车,小车带一支水彩笔,可在全开白纸上画出各种图形。 二、设计要求: 1.基本要求 ...…

查看全部问答>

关于凌阳公司赞助问题

本帖最后由 paulhyde 于 2014-9-15 09:30 编辑 请问各路大侠们,今年国赛凌阳还赞助吗?  …

查看全部问答>

SPLL几个问题,求助

我在作三相电网的软件锁相环(见附图),碰到一些问题。 1)输入电压如果很低时,如01pu时,SPLL无法锁定,得重新调整参数,想适应0.1pu~1.0pu工作范围有没有什么好办法,方法最好运算量不大,可以用C2000软件实现? 2)3s/2r变换的输入输出关系 ...…

查看全部问答>

买51单片机应该怎么说?

去买51单片机,应该怎么说,卖的人会不会反问你要什么型号的?应该怎么回答呢…

查看全部问答>

wince下string、vector、pair等的使用方法

在wince下如何使用string、vector、pair 现在我使用string的时候已经没有什么问题了,添加了编译选项/GX之后,警告也没有了 但是现在使用vector会出现很多警告 使用pair还会出现错误 大家帮忙解决一下,谢谢…

查看全部问答>

如何在PB添加已编译好的DLL文件?

本人刚开始学习驱动,写了一个简单的驱动,已经编译通过并生成了dll文件,但是想添加到PB中,但是没法下手,劳烦哪位大哥指点一二,谢谢!!…

查看全部问答>

WinCE上 如何设置一个进程的优先级?

WinCE上 线程的优先级是可以设置的,请问如何设置一个进程的优先级? …

查看全部问答>

基于DDS芯片和FPGA实现的任意波形发生卡

基于DDS芯片和FPGA实现的任意波形发生卡…

查看全部问答>

收到EZ430-RF2500套件,show一下

今天收到了拍的EZ430-RF2500套件,这次快递给力,很快。谢谢EEWORLD,套件比我想象的要小,包装很好,这里来几张开箱照和官方资料。这个跳线要插上…

查看全部问答>