[应用方案] 新唐芯片学习笔记——GPIO

[复制链接]
2088|17
 楼主| 狗啃模拟 发表于 2021-3-29 14:40 | 显示全部楼层 |阅读模式
新唐芯片学习笔记——GPIO
概述
NuMicro®NUC029 最多有40个通用I/O引脚,这些引脚和其它功能共享。40个引脚分为6个端口,分别命名为P0, P1, P2, P3, P4和P5,每个端口最多有8个引脚。每个引脚都是独立的,都有相应的寄存器来控制引脚工作模式与数据。每个引脚的I/O类型可由软件独立地配置为输入,输出,开漏或准双向模式。每个I/O引脚配有一个非常弱的独立的上拉电阻,VDD从5.0V 到 2.5V时,内部弱上拉电阻阻值大约为110千欧~300千欧。



 楼主| 狗啃模拟 发表于 2021-3-29 14:40 | 显示全部楼层
特性
-4 种 I/O 模式:
准双向
推挽输出
开漏输出
输入模式带高阻

触发输入模式由Px_MFP[23:16]中的Px_TYPE[15:0]选择

每个I/O 引脚都可以作为中断源,支持边沿/电平触发

所有I/O引脚复位后的默认模式由CIOINI(CONFIG[10])决定

NUC029xAN:
如果 CIOINI 为 0,所有GPIO引脚在芯片复位后为输入三态模式
如果 CIOINI 为 1,所有GPIO引脚在芯片复位后为准双向模式(默认)
在复位后,所有引脚的I/O模式都保持为准双向模式,且每个端口数据寄存器
Px_DOUT[7:0]的值复位为0x000_00FF。
 楼主| 狗啃模拟 发表于 2021-3-29 22:46 | 显示全部楼层
标题功能描述 :
输入模式
设置 Px_PMD(PMDn[1:0]) 为00’b ,Px.n为输入模式,I/O引脚为三态(高阻态),没有输出驱动能力。Px_PIN 的值反映相应端口引脚的状态。
 楼主| 狗啃模拟 发表于 2021-3-29 22:49 | 显示全部楼层
推挽输出模式
设置Px_PMD(PMDn[1:0])为 01’b,Px.n为推挽输出模式,I/O引脚支持数字输出功能,有拉电流/灌电流能力。Px_DOUT[n] 相应位的值被送到相应引脚上
 楼主| 狗啃模拟 发表于 2021-3-29 22:50 | 显示全部楼层
 楼主| 狗啃模拟 发表于 2021-3-29 22:53 | 显示全部楼层
开漏输出模式
设置 Px_PMD(PMDn[1:0])为 10’b,Px.n为开漏模式,I/O支持数字输出功能,但仅有灌电流能力,
为了把I/O引脚拉到高电平状态,需要外接一颗上拉电阻。 如果Px_DOUT[n] 相应位的值为“0”,引
脚上输出低电平. 如果Px_DOUT[n] 相应位的值为“1”, 该引脚由外部上拉电阻控制输出高电平。
————————————————
 楼主| 狗啃模拟 发表于 2021-3-29 23:00 | 显示全部楼层
 楼主| 狗啃模拟 发表于 2021-3-29 23:01 | 显示全部楼层
准双向模式
设置Px_PMD(PMDn[1:0]) 为 11’b,Px.n引脚为准双向模式,I/O同时支持数字输出和输入功能,但拉电流仅达数百uA。 要实现数字输入功能,需要先将Px_DOUT[n] 相应位置1。若Px_DOUT[n]相应位为”0”,引脚上输出为“低电平”。 若Px_DOUT[n]相应位为”1”,该引脚将检查引脚值,若引脚值为高,没有任何动作,若引脚值为低,该引脚将驱动2个时钟周期的强拉电流,然后关闭强输出驱动,然后引脚状态由内部上拉电阻控制。 需注意的是,准双向模式拉电流的能力只有200uA到30uA,其中VDD由5.0 V 到 2.5 V。
 楼主| 狗啃模拟 发表于 2021-3-29 23:04 | 显示全部楼层
 楼主| 狗啃模拟 发表于 2021-3-29 23:05 | 显示全部楼层
GPIO 中断和唤醒功能
通过设置Px_IEN 和 Px_IMD寄存器,每个GPIO引脚都可以设置为中断源。有5种类型的中断条件可以选择:低电平触发、高电平触发、下降沿触发、上升沿触发、上升和下降沿都触发。对于边沿触发,用户可以使能输入信号去抖动功能来避免由干扰导致的不期望的中断发生。de-bounce 时钟源和采样周期可以由DBNCECON 寄存器设定。
 楼主| 狗啃模拟 发表于 2021-3-29 23:07 | 显示全部楼层
  1. 四种模式:
  2. GPIO_PMD_INPUT           输入模式
  3. GPIO_PMD_OUTPUT          输出模式(推挽输出,有电流驱动能力)
  4. GPIO_PMD_OPEN_DRAIN      开漏输出模式
  5. GPIO_PMD_QUASI           准双向模式

  6. 中断:
  7. GPIO_INT_RISING         上升沿触发
  8. GPIO_INT_FALLING        下降沿触发
  9. GPIO_INT_BOTH_EDGE      上升下降沿触发
  10. GPIO_INT_HIGH           高电平触发
  11. GPIO_INT_LOW            低电平触发

  12. 函数描述:用于设置指定的GPIO操作模式
  13. 参数:  port        端口P0, P1, P2, P3 or P4.
  14. 参数:  u32PinMask  具体引脚BIT0 ~ BIT7.
  15. 参数:  u32Mode     四种模式
  16. void GPIO_SetMode(GPIO_T *port, uint32_t u32PinMask, uint32_t u32Mode)

  17. 函数描述:使能GPIO中断
  18. 参数:   port            P0, P1, P2, P3 or P4.
  19. 参数:   u32Pin          引脚号码0 ~ 7
  20. 参数:   u32IntAttribs   中断触发
  21. void GPIO_EnableInt(GPIO_T *port, uint32_t u32Pin, uint32_t u32IntAttribs)

  22. 函数描述:失能GPIO中断
  23. 参数:   port            P0, P1, P2, P3 or P4.
  24. 参数:   u32Pin          引脚号码0 ~ 7
  25. void GPIO_DisableInt(GPIO_T *port, uint32_t u32Pin)
  26. 函数描述:获取GPIO中断标志
  27. GPIO_GET_INT_FLAG(port, u32PinMask)

  28. 函数描述:清除GPIO中断标志
  29. GPIO_CLR_INT_FLAG(port, u32PinMask)

  30. 函数描述:失能中断消抖功能
  31. GPIO_DISABLE_DEBOUNCE(port, u32PinMask)

  32. 函数描述:使能中断消抖功能
  33. GPIO_ENABLE_DEBOUNCE(port, u32PinMask)

  34. 函数描述:设置消抖采样采样周期、时间
  35. GPIO_SET_DEBOUNCE_TIME(u32ClkSrc, u32ClkSel)



  36. //初始化
  37. Void GPIO_Init()
  38. {
  39.         /* P10 配置为输出,P24 配置为输入模式 */
  40.         GPIO_SetMode(P1, 0, GPIO_PMD_OUTPUT);
  41.         GPIO_SetMode(P2, 4, GPIO_PMD_INPUT);
  42.         /* P10 配置为输出*/
  43.         GPIO_SetMode(P1, 0, GPIO_PMD_OUTPUT);
  44.        
  45.         /*从P10输出0*/
  46.         P10 = 0;

  47.    /*如果P11为低电平,P12输出高电平*/
  48.         if(P11 == 0)
  49.                 P12 = 1;
  50.        
  51.         /* 将 P25 配置为输入模式并使能上升沿中断 */
  52.         GPIO_SetMode(P2, 5, GPIO_PMD_INPUT);
  53.         GPIO_EnableInt(P2, 5, GPIO_INT_RISING);
  54.         NVIC_EnableIRQ(GPIO_P2P3P4_IRQn);
  55.        
  56.         /*  将 P12 配置为输入模式,打开内部上拉,并使能下降沿中断 */
  57.         GPIO_SetMode(P1, 2, GPIO_PMD_INPUT);
  58.        
  59.         GPIO_EnableInt(P1, 2, GPIO_INT_FALLING);
  60.         NVIC_EnableIRQ(GPIO_P0P1_IRQn);
  61.         }
  62.        
  63.         //中断服务函数
  64.         void GPIOP2P3P4_IRQHandler()
  65.         {
  66.                 if(GPIO_GET_INT_FLAG(P2, BIT0))
  67.                 {
  68.                         GPIO_CLR_INT_FLAG(BIT0);
  69.                        
  70.                 }
  71.                 else//清除其他端口不必要的中断
  72.                 {
  73.                 P2->ISRC = P2->ISRC;
  74.                 P3->ISRC = P3->ISRC;
  75.                 P4->ISRC = P4->ISRC;
  76.                 }
  77.         }
kxsi 发表于 2021-4-8 16:02 | 显示全部楼层
可以通过什么方式进行唤醒啊
aoyi 发表于 2021-4-8 16:04 | 显示全部楼层
唤醒时间需要多久啊
gwsan 发表于 2021-4-8 16:04 | 显示全部楼层
最多有多少个io口啊
drer 发表于 2021-4-8 16:06 | 显示全部楼层
本身有多大的带载能力啊
nawu 发表于 2021-4-8 16:07 | 显示全部楼层
io的操作既简单又深奥
caigang13 发表于 2021-4-8 18:53 来自手机 | 显示全部楼层
IO最大速度能到多少?
zhuomuniao110 发表于 2021-4-8 22:59 | 显示全部楼层
中断就可以唤醒。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

68

主题

1054

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部