查看: 5564|回复: 4

[原创] 【高校争霸赛】LPC824寄存器开发指南【三】实战篇

[复制链接]
  • TA的每日心情
    开心
    2019-3-22 20:15
  • 签到天数: 21 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    23

    主题

    341

    帖子

    1

    高级会员

    Rank: 4

    积分
    909
    最后登录
    2019-4-7
    发表于 2016-11-24 22:43:18 | 显示全部楼层 |阅读模式
    1. void LED_Init(void)//LED初始化
    2. {
    3.         //LED_R P0-15
    4.         //LED_G P0-16
    5.         //LED_B P0-17
    6.         PORT0_IOCON15 = 0;
    7.         PORT0_GPIO_DIR |= 1UL << 15;
    8.         PORT0_OUT(15) = 1;
    9.        
    10.         PORT0_IOCON16 = 0;
    11.         PORT0_GPIO_DIR |= 1UL << 16;
    12.         PORT0_OUT(16) = 1;
    13.        
    14.         PORT0_IOCON17 = 0;
    15.         PORT0_GPIO_DIR |= 1UL << 17;
    16.         PORT0_OUT(17) = 1;
    17. }
    复制代码
    1. //LED
    2. #define LED_R PORT0_OUT(15)
    3. #define LED_G PORT0_OUT(16)
    4. #define LED_B PORT0_OUT(17)
    复制代码


    当你看到这个程序时,你肯定会觉得这寄存器配置还是蛮简单的,可是你却不知道这其中的寄存器是怎样编写出来的,下面我就给大家讲解LED灯是如何点亮的!!


    1.关于最底层的文件为什么没有再软件篇讲呢,原因是这样的,为了方便大家快速开发寄存器,更多的是教会大家如何自己配置功能,以及如何使用寄存器来开发一些项目。
    2.下面介绍一下外设寄存器的底层寄存器编写:
    1. /* ----------------------------------------------------------------------------
    2.    -- I/O pin configuration (IOCON)
    3.    ---------------------------------------------------------------------------- */
    4. //LPC5410x I/O pin configuration (IOCON)        P87
    5. //Register overview: I/O configuration (base address 0x4004 4000)
    6. //地址
    7. #define PORT0_IOCON_PTR                                                                ((IOCON_MemMapPtr)0x40044000UL)

    8. //结构体
    9. typedef struct IOCON_MemMap {
    10.   uint32_t PIO[31];                                
    11. } volatile *IOCON_MemMapPtr;
    12. //控制配置
    13. #define PORT_IOCON_PIO_REG(base,index)                 ((base)->PIO[index])
    14. //PORT0_IOCON
    15. #define PORT0_IOCON0                    PORT_IOCON_PIO_REG(PORT0_IOCON_PTR,0x11)
    16. #define PORT0_IOCON1                    PORT_IOCON_PIO_REG(PORT0_IOCON_PTR,0x0B)
    17. #define PORT0_IOCON2                    PORT_IOCON_PIO_REG(PORT0_IOCON_PTR,0x06)
    18. #define PORT0_IOCON3                    PORT_IOCON_PIO_REG(PORT0_IOCON_PTR,0x05)
    19. #define PORT0_IOCON4                    PORT_IOCON_PIO_REG(PORT0_IOCON_PTR,0x04)
    20. #define PORT0_IOCON5                    PORT_IOCON_PIO_REG(PORT0_IOCON_PTR,0x03)
    21. #define PORT0_IOCON6                    PORT_IOCON_PIO_REG(PORT0_IOCON_PTR,0x10)
    22. #define PORT0_IOCON7                    PORT_IOCON_PIO_REG(PORT0_IOCON_PTR,0x0F)
    23. #define PORT0_IOCON8                    PORT_IOCON_PIO_REG(PORT0_IOCON_PTR,0x0E)
    24. #define PORT0_IOCON9                    PORT_IOCON_PIO_REG(PORT0_IOCON_PTR,0x0D)
    25. #define PORT0_IOCON10                   PORT_IOCON_PIO_REG(PORT0_IOCON_PTR,0x08)
    26. #define PORT0_IOCON11                   PORT_IOCON_PIO_REG(PORT0_IOCON_PTR,0x07)
    27. #define PORT0_IOCON12                   PORT_IOCON_PIO_REG(PORT0_IOCON_PTR,0x02)
    28. #define PORT0_IOCON13                   PORT_IOCON_PIO_REG(PORT0_IOCON_PTR,0x01)
    29. #define PORT0_IOCON14                   PORT_IOCON_PIO_REG(PORT0_IOCON_PTR,0x12)
    30. #define PORT0_IOCON15                   PORT_IOCON_PIO_REG(PORT0_IOCON_PTR,0x0A)
    31. #define PORT0_IOCON16                   PORT_IOCON_PIO_REG(PORT0_IOCON_PTR,0x09)
    32. #define PORT0_IOCON17                   PORT_IOCON_PIO_REG(PORT0_IOCON_PTR,0x00)
    33. #define PORT0_IOCON18                   PORT_IOCON_PIO_REG(PORT0_IOCON_PTR,0x1E)
    34. #define PORT0_IOCON19                   PORT_IOCON_PIO_REG(PORT0_IOCON_PTR,0x1D)
    35. #define PORT0_IOCON20                   PORT_IOCON_PIO_REG(PORT0_IOCON_PTR,0x1C)
    36. #define PORT0_IOCON21                   PORT_IOCON_PIO_REG(PORT0_IOCON_PTR,0x1B)
    37. #define PORT0_IOCON22                   PORT_IOCON_PIO_REG(PORT0_IOCON_PTR,0x1A)
    38. #define PORT0_IOCON23                   PORT_IOCON_PIO_REG(PORT0_IOCON_PTR,0x19)
    39. #define PORT0_IOCON24                   PORT_IOCON_PIO_REG(PORT0_IOCON_PTR,0x18)
    40. #define PORT0_IOCON25                   PORT_IOCON_PIO_REG(PORT0_IOCON_PTR,0x17)
    41. #define PORT0_IOCON26                   PORT_IOCON_PIO_REG(PORT0_IOCON_PTR,0x16)
    42. #define PORT0_IOCON27                   PORT_IOCON_PIO_REG(PORT0_IOCON_PTR,0x15)
    43. #define PORT0_IOCON28                   PORT_IOCON_PIO_REG(PORT0_IOCON_PTR,0x14)


    44. /* ----------------------------------------------------------------------------
    45.    -- General Purpose I/O (GPIO)
    46.    ---------------------------------------------------------------------------- */
    47. // LPC82x General Purpose I/O (GPIO) P123
    48. // Register overview: GPIO port (base address 0xA000 0000)

    49. //地址
    50. #define PORT_GPIO_PTR                                                                ((LPC_GPIO_MemMapPtr)0xA0000000UL)

    51. //结构体
    52. typedef struct LPC_GPIO_MemMap{/*!< GPIO_PORT Structure */               
    53.         __IO uint8_t B[128][32];        /*!< Offset 0x0000: Byte pin registers ports 0 to n; pins PIOn_0 to PIOn_31 */
    54.         __IO uint32_t W[32][32];        /*!< Offset 0x1000: Word pin registers port 0 to n */
    55.         __IO uint32_t DIR[32];                /*!< Offset 0x2000: Direction registers port n */
    56.         __IO uint32_t MASK[32];                /*!< Offset 0x2080: Mask register port n */
    57.         __IO uint32_t PIN[32];                /*!< Offset 0x2100: Portpin register port n */
    58.         __IO uint32_t MPIN[32];                /*!< Offset 0x2180: Masked port register port n */
    59.         __IO uint32_t SET[32];                /*!< Offset 0x2200: Write: Set register for port n Read: output bits for port n */
    60.         __O  uint32_t CLR[32];                /*!< Offset 0x2280: Clear port n */
    61.         __O  uint32_t NOT[32];                /*!< Offset 0x2300: Toggle port n */
    62.         __O  uint32_t DIRSET[32];   /*!< Offset 0x2380: Set Direction */
    63.         __O  uint32_t DIRCLR[32];   /*!< Offset 0x2400: Clear Direction */
    64.         __O  uint32_t DIRNOT[32];   /*!< Offset 0x2480: Toggle Dirction */
    65. } volatile *LPC_GPIO_MemMapPtr;
    66. //控制配置
    67. #define PORT_GPIO_B_REG(base,index,port)                ((base)->B[index][port])
    68. #define PORT_GPIO_DIR_REG(base,index)                                           ((base)->DIR[index])
    69. #define PORT_GPIO_MASK_REG(base,index)                         ((base)->MASK[index])
    70. #define PORT_GPIO_PIN_REG(base,index)                         ((base)->PIN[index])
    71. #define PORT_GPIO_MPIN_REG(base,index)                         ((base)->MPIN[index])
    72. #define PORT_GPIO_SET_REG(base,index)                         ((base)->SET[index])
    73. #define PORT_GPIO_CLR_REG(base,index)                         ((base)->CLR[index])
    74. #define PORT_GPIO_NOT_REG(base,index)                         ((base)->NOT[index])

    75. //GPIO_B
    76. #define PORT0_OUT(n)                                                   PORT_GPIO_B_REG(PORT_GPIO_PTR,0,n)  //输出 n<32
    77. #define PORT0_IN(n)                                                    PORT_GPIO_B_REG(PORT_GPIO_PTR,0,n)  //输入

    78. //GPIO_DIR
    79. #define PORT0_GPIO_DIR                                           PORT_GPIO_DIR_REG(PORT_GPIO_PTR,0)  

    80. //GPIO_MASK
    81. #define PORT0_GPIO_MASK                                           PORT_GPIO_MASK_REG(PORT_GPIO_PTR,0)  

    82. //GPIO_PIN
    83. #define PORT0_GPIO_PIN                                           PORT_GPIO_PIN_REG(PORT_GPIO_PTR,0)  

    84. //GPIO_MPIN
    85. #define PORT0_GPIO_MPIN                                           PORT_GPIO_MPIN_REG(PORT_GPIO_PTR,0)  

    86. //GPIO_SET
    87. #define PORT0_GPIO_SET                                           PORT_GPIO_SET_REG(PORT_GPIO_PTR,0)  

    88. //GPIO_CLR
    89. #define PORT0_GPIO_CLR                                           PORT_GPIO_CLR_REG(PORT_GPIO_PTR,0)  

    90. //GPIO_NOT
    91. #define PORT0_GPIO_NOT                                           PORT_GPIO_NOT_REG(PORT_GPIO_PTR,0)  
    复制代码
    该寄存器配置模式大家可以模仿继续编写其他的寄存控制配置
    关于该寄存器的编写模式可参考该贴: https://www.nxpic.org.cn/module/forum/thread-607140-1-1.html
    提供寄存器LED工程源码:
    2.LED.zip (51.67 KB, 下载次数: 25)
    成功的小小喜悦里,大脑自身可以产生兴奋剂哦!
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2019-3-22 20:15
  • 签到天数: 21 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    23

    主题

    341

    帖子

    1

    高级会员

    Rank: 4

    积分
    909
    最后登录
    2019-4-7
     楼主| 发表于 2016-11-25 15:33:51 | 显示全部楼层
    本帖最后由 噬猎者 于 2017-6-4 21:07 编辑

    让我们边练边学边做,来做个简单的裁判计时系统。首先先把硬件搭起来,所需要的就是普通的IO口就足够了
    我们这里会用到的模块有 Systick滴答定时器 gpio模块
    而硬件上我们用的是普通的共阴极数码管、蜂鸣器,红外漫反射测距传感器
    由于ISP下载速度过慢,我们这里采用4线SWD下载,需要把VCC PIO0_2(SWD_DIO), PIO0_3(SWD_CLK) GND管脚引出来
    在硬件上的数码管第三个是反向的,我们用来做分钟提示的 ”:“ 秒闪烁显示,在连线上稍微有点麻烦
    关于管脚的使用,只要是不是串口、SWD 、ISP、 LED 、RES ,剩下的管脚都是可以用的,细心的网友会发现其他的管脚中包含XTAL,是的,由于LPC824board板上无外部时钟晶振,我们采用内部时钟振荡器,这样外部的管脚就更多了。

    IMG_20161124_222930.jpg
    IMG_20161125_145826.jpg

    下一步我们就需要分析上节的GPIO寄存器部分了。由于管脚都采用的普通GPIO,那么所有的管脚都可以像这样配置


    1. PORT0_IOCON17 = 0;
    2.         PORT0_GPIO_DIR |= 1UL << 17;
    3.         PORT0_OUT(17) = 1;
    复制代码
    1. #define DP_0         PORT0_OUT(23)
    2. #define DP_1         PORT0_OUT(24)
    3. #define DP_2         PORT0_OUT(28)
    4. #define DP_3         PORT0_OUT(8)
    5. #define DP_4         PORT0_OUT(26)
    6. #define DP_5         PORT0_OUT(6)
    7. #define DP_6         PORT0_OUT(4)
    8. #define DP_7         PORT0_OUT(27)        
    复制代码
    配置完硬件部分,我们就需要学习新的内容了Systick(滴答定时器)SysTick 是 MDK 定义了的一个结构体 (在 core_m0plus.h 里面) , 里面包含 CTRL、 LOAD、 VAL、CALIB 等 4 个寄存器,而我们只需要做的就是学会调用其函数 :
    1. #define SYSTICK_RATE_HZ        1000//滴答定时器定时时间
    复制代码
    1. SysTick_Config(SystemCoreClock / SYSTICK_RATE_HZ);
    复制代码
    该函数只需要配置完中断频率即可使用,稍后大家可以参考我的源码分析


    而完成这个定时器的设计就不在这里为大家讲解了,都是数码管显示的部分和控制,大家可以参考我的源码


    数码管裁判计时系统: 4.数码管计时系统.zip (54.48 KB, 下载次数: 32)
    成功的小小喜悦里,大脑自身可以产生兴奋剂哦!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-1-19 09:35
  • 签到天数: 39 天

    连续签到: 1 天

    [LV.5]常住居民I

    1

    主题

    290

    帖子

    0

    高级会员

    Rank: 4

    积分
    846
    最后登录
    2020-8-23
    发表于 2016-11-25 10:55:55 | 显示全部楼层
    谢谢楼主的分享
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2016-12-31 20:54
  • 签到天数: 19 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    3

    主题

    66

    帖子

    0

    注册会员

    Rank: 2

    积分
    198
    最后登录
    2017-8-8
    发表于 2016-11-26 00:09:34 | 显示全部楼层
    这才是寄存器中的大神啊!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-24 08:30
  • 签到天数: 50 天

    连续签到: 1 天

    [LV.5]常住居民I

    22

    主题

    817

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1713
    最后登录
    2019-12-7
    发表于 2016-11-26 10:33:53 | 显示全部楼层
    这个不错,  
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-21 16:42 , Processed in 0.106119 second(s), 28 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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