我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 3382|回复: 46

[技术文章] 三、新唐N32905U1DN开发教程:使用寄存器配置IO口

[复制链接]

该用户从未签到

3

主题

22

回帖

12

积分

一级逆天

积分
12

终身成就奖社区居民

QQ
发表于 2018-8-1 09:36:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
新唐单片机学习交流群:57955260,欢迎加入学习交流

由于官方提供的IO口配置函数效率低,且配置比较繁琐,下面使用寄存器配置的方式来控制IO口,实现实验一的点亮LED。通过查阅N329_Design_Guide_A0.pdf第627页可以发现,IO口相关寄存器的基址为0xB8001000,由此我们定义一个宏 #define GP_BA 0xB8001000

                               
登录/注册后可看大图

根据上图寄存器的偏移量,我们对寄存器的地址进行宏定义,为了方便对IO口进行初始化,定义一个结构体,同时也要把相关变量类型重新定义一下,符合我们的使用习惯,我创建的是n3290x.h,内容如下所示:
  1. #ifndef __N3290X_H
  2. #define __N3290X_H
  3. #include "stdint.h"
  4. #ifdef __cplusplus
  5. extern "C" {
  6. #endif
  7. #ifdef __cplusplus
  8.   #define     __I     volatile  
  9. #else
  10.   #define     __I     volatile const         
  11. #endif
  12. #define     __O     volatile
  13. #define     __IO    volatile
  14.      
  15. typedef int32_t  s32;
  16. typedef int16_t s16;
  17. typedef int8_t  s8;
  18. typedef const int32_t sc32;  /*!< Read Only */
  19. typedef const int16_t sc16;  /*!< Read Only */
  20. typedef const int8_t sc8;   /*!< Read Only */
  21. typedef __IO int32_t  vs32;
  22. typedef __IO int16_t  vs16;
  23. typedef __IO int8_t   vs8;
  24. typedef __I int32_t vsc32;  /*!< Read Only */
  25. typedef __I int16_t vsc16;  /*!< Read Only */
  26. typedef __I int8_t vsc8;   /*!< Read Only */
  27. typedef uint32_t  u32;
  28. typedef uint16_t u16;
  29. typedef uint8_t  u8;
  30. typedef const uint32_t uc32;  /*!< Read Only */
  31. typedef const uint16_t uc16;  /*!< Read Only */
  32. typedef const uint8_t uc8;   /*!< Read Only */
  33. typedef __IO uint32_t  vu32;
  34. typedef __IO uint16_t vu16;
  35. typedef __IO uint8_t  vu8;
  36. typedef __I uint32_t vuc32;  /*!< Read Only */
  37. typedef __I uint16_t vuc16;  /*!< Read Only */
  38. typedef __I uint8_t vuc8;   /*!< Read Only */
  39.      
  40. #define GP_BA 0xB8001000
  41. #define GPIOA_BASE (GP_BA + 0x00)
  42. #define GPIOB_BASE (GPIOA_BASE+ 0x10)
  43. #define GPIOC_BASE (GPIOB_BASE+ 0x10)
  44. #define GPIOD_BASE (GPIOC_BASE+ 0x10)
  45. #define GPIOE_BASE (GPIOD_BASE+ 0x10)
  46. typedef struct
  47. {
  48.     __IO uint32_t OMD;
  49.     __IO uint32_t PUEN;
  50.     __IO uint32_t DOUT;
  51.     __I uint32_t PIN;
  52. }GPIO_TypeDef;
  53. #define GPIOA ((GPIO_TypeDef*)(GPIOA_BASE))
  54. #define GPIOB ((GPIO_TypeDef*)(GPIOB_BASE))
  55. #define GPIOC ((GPIO_TypeDef*)(GPIOC_BASE))
  56. #define GPIOD ((GPIO_TypeDef*)(GPIOD_BASE))
  57. #define GPIOE ((GPIO_TypeDef*)(GPIOE_BASE))
  58. #endif
复制代码
    GPIOx_ODM是一个32bit寄存器,控制IO口为输入或输出,每一bit控制一个IO口。当某一位为1时,配置对应的IO口为输出;当为0时,配置对应的IO口为输入。
如GPIOA->ODM = 0x00000001表示将PA0设为输出,PA的其它口均设为输入。
GPIOx_DOUT控制IO的输出为高电平或低电平,当某位为1时,表示对应的IO口输出高电平,反之输出低电平,前提是该IO口配置为输出模式。
下面贴出main.c的代码
  1. #include "wblib.h"
  2. #include "n3290x.h"
  3. int main(void)
  4. {
  5.     sysSetSystemClock(eSYS_UPLL,    //E_SYS_SRC_CLK eSrcClk,   
  6.                         192000,     //UINT32 u32PllKHz,     
  7.                         192000,     //UINT32 u32SysKHz,
  8.                         192000,     //UINT32 u32CpuKHz,
  9.                           96000,        //UINT32 u32HclkKHz,
  10.                           48000);       //UINT32 u32ApbKHz  
  11.     //PB3~PB6设为输出
  12.     GPIOB->OMD |= 0x0F<<3;
  13.     //PB3~PB6输出高电平
  14.     GPIOB->DOUT |= 0x0F<<3;
  15.     //PB3~PB6输出低电平
  16.     GPIOB->DOUT &= ~(0x0F<<3);
  17.     while(1)
  18.     {
  19.     }
  20. }
复制代码
通过仿真可以看到执行GPIOB->DOUT |= 0x0F<<3;后,灯就灭了,如此,用寄存器控制LED的实验完成。



回复

使用道具 举报

该用户从未签到

3

主题

22

回帖

12

积分

一级逆天

积分
12

终身成就奖社区居民

QQ
 楼主| 发表于 2018-8-1 09:46:55 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

11

主题

176

回帖

0

积分

1元学习PADS(5期)

积分
0

终身成就奖特殊贡献奖

QQ
发表于 2018-8-1 10:22:10 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

94

主题

516

回帖

0

积分

二级逆天

积分
0

终身成就奖

QQ
发表于 2018-8-22 08:10:48 | 显示全部楼层
回复

使用道具 举报

  • TA的每日心情
    慵懒
    11 小时前
  • 签到天数: 106 天

    [LV.6]常住居民II

    2

    主题

    7207

    回帖

    1万

    积分

    三级逆天

    积分
    10620

    终身成就奖特殊贡献奖原创先锋奖

    QQ
    发表于 2020-3-10 08:46:58 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    160

    回帖

    0

    积分

    二级逆天

    积分
    0

    终身成就奖原创先锋奖

    发表于 2020-3-10 16:55:22 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    11 小时前
  • 签到天数: 106 天

    [LV.6]常住居民II

    2

    主题

    7207

    回帖

    1万

    积分

    三级逆天

    积分
    10620

    终身成就奖特殊贡献奖原创先锋奖

    QQ
    发表于 2020-10-21 08:52:31 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    11

    主题

    41

    回帖

    0

    积分

    二级逆天

    积分
    0

    终身成就奖

    发表于 2020-10-28 09:19:13 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    7 小时前
  • 签到天数: 160 天

    [LV.7]常住居民III

    2

    主题

    8784

    回帖

    1万

    积分

    三级逆天

    积分
    10243

    社区居民终身成就奖特殊贡献奖原创先锋奖

    QQ
    发表于 2020-12-25 08:52:25 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    17

    主题

    54

    回帖

    0

    积分

    二级逆天

    积分
    0

    终身成就奖

    发表于 2020-12-29 09:46:45 | 显示全部楼层
    回复

    使用道具 举报

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

    本版积分规则

    每日签到,有金币领取。


    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    ( 闽ICP备2024076463号-1 ) 论坛技术支持QQ群171867948 ,论坛问题,充值问题请联系QQ1308068381

    平平安安
    TOP
    快速回复 返回顶部 返回列表