当前位置:首页 > 嵌入式 > 嵌入式软件
[导读]自学Cortex-M3(1):GPIO实验1

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

  因为项目所需,所以不得不开始研究M3,我用的是NXP公司的LPC1768这个芯片,它是具有三级流水线的哈佛结构,带独立的本地指令和数据总线以及用于外设的稍微低性能的第三条总线,还包含一个支持随机跳转的内部预取指单元。关于LPC1768这个芯片的内部资源这里就不罗列了,这些数据手册上都写的很详细,以后在学习总结中也会慢慢涉及。好了,今天只是初步测试一下它的GPIO功能,所谓的GPIO也就是通用输入/输出口(General Purpose Input Output),万丈高楼平地起,慢慢来吧。实验的原理图很简单,就是几个LED灯,关于灯的电流及电压参数,这里不作详细介绍,有兴趣的可以到网上或供应商那里要一份数据手册看一下,做技术的不能懒,有些东西该看的还是要看的。

图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 -- 延时时长

  * 出口参数: 无

  * 备    注:无

  *******************************************************************************/[!--empirenews.page--]

  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的基址定义了出来,关于LPV1768内部地址的分配情况,可以参看它的数据手册,也可参考一下《ARM Cortex-M3 权威指南》,这本书在网上有电子书,好像宋岩宁牛人早已把它翻译成中文了,懒猫现在也正在参考这本书,另外一定要多去NXP网站看一下它的handbook,whitepaper等资料,还可多到论坛转转,有些坛子里深藏了好多老鸟,好多大虾,好多大牛,有你学的,有你问的,只要肯用心,一根网线,能解决很多问题。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭