单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9601|回复: 6
收起左侧

Cortex-M3学习LPC1768 - GPIO实验

[复制链接]
xiongxiao 发表于 2015-5-27 19:05 | 显示全部楼层 |阅读模式
因为项目所需,所以不得不开始研究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            
    好了,下面给出实验程序,由于程序太多,只给出部分,剩下的源文件可以到工程文件夹中去找:
  1. /*********************************************************************************
  2. 文件名称:mian.c
  3. 功    能: 主要调度函数及应用函数                                                                                          
  4. 编译环境: MDKV4.12                                                   
  5. 时    钟: 外部12Mhz                                                                                                                                             
  6. 日    期: 11/08/16                                                         
  7. 作    者: 懒猫爱飞
  8. 备    注:NULL
  9. ---------------------------------------------------------------------------------
  10. 修改内容:NULL
  11. 修改日期:XXXX年xx月xx日      xx时xx分
  12. 修改人员:xxx xxx xxx
  13.                                                                                                                                                                                        
  14. **********************************************************************************/
  15. #include"main.h"
  16. volatile unsigned long SysTickCnt;      /* 用于系统时钟计数 */
  17. /********************************************************************************
  18. * 函数名称 :void SysTick_Handler (void)
  19. * 函数功能 : 系统节拍定时器中断函数,每1ms计数一次
  20. * 入口参数 : 无
  21. * 出口参数 : 无
  22. * 备    注 :无
  23. *******************************************************************************/
  24. void SysTick_Handler (void)
  25. {         
  26.   SysTickCnt++;
  27. }
  28. /********************************************************************************
  29. * 函数名称 :void Delay (unsigned long tick)
  30. * 函数功能 : 毫秒级延时函数
  31. * 入口参数 : unsigned long tick -- 延时时长
  32. * 出口参数 : 无
  33. * 备    注 :无
  34. *******************************************************************************/
  35. void DelayMs (unsigned long tick)
  36. {     
  37.   unsigned long systickcnt;

  38.   systickcnt = SysTickCnt;
  39.   while ((SysTickCnt - systickcnt) < tick);
  40. }
  41. /********************************************************************************
  42. * 函数名称 :void PortInit(void)
  43. * 函数功能 : 端口初始化
  44. * 入口参数 : 无
  45. * 出口参数 : 无
  46. * 备    注 :无
  47. *******************************************************************************/
  48. void PortInit(void)
  49. {
  50.    GPIO1->FIODIR = 0xB0000000;           /* LEDs on PORT1 defined as Output    */
  51.    GPIO2->FIODIR = 0x0000007C;           /* LEDs on PORT2 defined as Output    */
  52.    Led1Off();     /* 初始化时熄灭所有的灯 */
  53.    Led2Off();
  54.    Led3Off();
  55.    Led4Off();
  56.    Led5Off();
  57.    Led6Off();
  58.    Led7Off();
  59.    Led8Off();
  60. }

  61. /********************************************************************************
  62. * 函数名称 :int main(void)
  63. * 函数功能 : 主函数
  64. * 入口参数 : 无
  65. * 出口参数 : 无
  66. * 备    注 :无
  67. *******************************************************************************/
  68. int main(void)
  69. {
  70.               SystemInit();     /* 系统初始化,函数在system_LPC17xx.c文件夹中定义 */
  71.               SysTick_Config(SystemFrequency/1000 - 1);   /* 配置时钟中断,每1ms中断一次 */
  72.                                                           /* 在core_cm3.h中定义*/
  73.     PortInit();       /* 端口初始化 */
  74.               while(1)
  75.               {
  76.                             Led1On();     //LED1开
  77.                     Led4On();    //LED4 开
  78.                             DelayMs(200);
  79.                             Led1Off();    //LED1关
  80.                             Led4Off();    //LED4关
  81.                             DelayMs(200);
  82.               }
  83. }
复制代码


    因为程序是最基础的实验,所以不是太难,程序中延时函数用的是系统节拍定时器,每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等资料,还可多到论坛转转,有些坛子里深藏了好多老鸟,好多大虾,好多大牛,有你学的,有你问的,只要肯用心,一根网线,能解决很多问题。

完整程序源代码工程文件下载地址: 7006307544840.rar (144.72 KB, 下载次数: 45)

评分

参与人数 1黑币 +6 收起 理由
aygc + 6

查看全部评分

回复

使用道具 举报

lu2361181 发表于 2017-4-27 09:52 | 显示全部楼层
谢谢露珠分享,
回复

使用道具 举报

xiaop4357 发表于 2017-11-23 16:12 | 显示全部楼层
感谢分享!!
回复

使用道具 举报

aygc 发表于 2018-3-9 12:24 | 显示全部楼层
感谢分享!!
回复

使用道具 举报

HUGOCHU1212 发表于 2019-1-4 09:25 | 显示全部楼层
This is a excellent data for new learner, thanks for sharing indeed.
回复

使用道具 举报

pm1981 发表于 2019-2-27 10:54 | 显示全部楼层
正在学习谢谢分享
回复

使用道具 举报

7#
无效楼层,该帖已经被删除
xuanyuan88 发表于 2019-4-24 10:19 | 显示全部楼层
学习学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;技术交流QQ群7344883

Powered by 单片机教程网

快速回复 返回顶部 返回列表