620|0

38

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

先楫半导体HPM5361EVK--点亮一颗led与按键中断 [复制链接]

 

本帖最后由 chejia12 于 2023-11-30 19:42 编辑

先楫半导体HPM5361EVK--点亮一颗led

gpio分为io控制器和gpio控制器

2.1*IO 控制器 *

2.1.1IOC特性

  • 外设复用功能映射
  • 输出回送控制 (loopback)
  • 模拟功能配置
  • 压摆率配置
  • 开漏设置
  • 施密特触发器
  • 上下拉配置
  • 驱动能力配置

2.1.2基本配置IOC_X_PAD_CTL 寄存器

  • 开漏
  • 施密特触发
  • 上下拉电阻
  • 压摆率
  • 驱动能力

2.1.3外设功能配置 IOC_X_FUNC_CTL 寄存器

  • 输出回送功能
  • 模拟功能和外设
  • 功能映射(外设引脚复用)

2.1.5涉及的数据结构

  1. typedef struct {
  2. struct {
  3. __RW uint32_t FUNC_CTL; /* 0x0: ALT SELECT */
  4. __RW uint32_t PAD_CTL; /* 0x4: PAD SETTINGS */
  5. } PAD[456];
  6. } IOC_Type;

电气属性相关的宏定义

  1. 回环使能
  2. 模拟输入使能
  3. 引脚复用选择ALT0~ALT31
  4. 施密特触发使能
  5. 上下拉电阻大小选择
  6. 上下拉选择
  7. 上下拉使能
  8. 电平保持使能
  9. 开漏使能
  10. 摇摆率高低速选择
  11. 引脚速度选择4种
  12. 驱动能力选择
  1. /* Bitfield definition for register of struct array PAD: FUNC_CTL */
  2. /*
  3. * LOOP_BACK (RW)
  4. *
  5. * force input on
  6. * 0: disable
  7. * 1: enable
  8. */
  9. #define IOC_PAD_FUNC_CTL_LOOP_BACK_MASK (0x10000UL)
  10. #define IOC_PAD_FUNC_CTL_LOOP_BACK_SHIFT (16U)
  11. #define IOC_PAD_FUNC_CTL_LOOP_BACK_SET(x) (((uint32_t)(x) << IOC_PAD_FUNC_CTL_LOOP_BACK_SHIFT) & IOC_PAD_FUNC_CTL_LOOP_BACK_MASK)
  12. #define IOC_PAD_FUNC_CTL_LOOP_BACK_GET(x) (((uint32_t)(x) & IOC_PAD_FUNC_CTL_LOOP_BACK_MASK) >> IOC_PAD_FUNC_CTL_LOOP_BACK_SHIFT)
  13. /*
  14. * ANALOG (RW)
  15. *
  16. * select analog pin in pad
  17. * 0: disable
  18. * 1: enable
  19. */
  20. #define IOC_PAD_FUNC_CTL_ANALOG_MASK (0x100U)
  21. #define IOC_PAD_FUNC_CTL_ANALOG_SHIFT (8U)
  22. #define IOC_PAD_FUNC_CTL_ANALOG_SET(x) (((uint32_t)(x) << IOC_PAD_FUNC_CTL_ANALOG_SHIFT) & IOC_PAD_FUNC_CTL_ANALOG_MASK)
  23. #define IOC_PAD_FUNC_CTL_ANALOG_GET(x) (((uint32_t)(x) & IOC_PAD_FUNC_CTL_ANALOG_MASK) >> IOC_PAD_FUNC_CTL_ANALOG_SHIFT)
  24. /*
  25. * ALT_SELECT (RW)
  26. *
  27. * alt select
  28. * 0: ALT0
  29. * 1: ALT1
  30. * ...
  31. * 31:ALT31
  32. */
  33. #define IOC_PAD_FUNC_CTL_ALT_SELECT_MASK (0x1FU)
  34. #define IOC_PAD_FUNC_CTL_ALT_SELECT_SHIFT (0U)
  35. #define IOC_PAD_FUNC_CTL_ALT_SELECT_SET(x) (((uint32_t)(x) << IOC_PAD_FUNC_CTL_ALT_SELECT_SHIFT) & IOC_PAD_FUNC_CTL_ALT_SELECT_MASK)
  36. #define IOC_PAD_FUNC_CTL_ALT_SELECT_GET(x) (((uint32_t)(x) & IOC_PAD_FUNC_CTL_ALT_SELECT_MASK) >> IOC_PAD_FUNC_CTL_ALT_SELECT_SHIFT)
  37. /* Bitfield definition for register of struct array PAD: PAD_CTL */
  38. /*
  39. * HYS (RW)
  40. *
  41. * schmitt trigger enable
  42. * 0: disable
  43. * 1: enable
  44. */
  45. #define IOC_PAD_PAD_CTL_HYS_MASK (0x1000000UL)
  46. #define IOC_PAD_PAD_CTL_HYS_SHIFT (24U)
  47. #define IOC_PAD_PAD_CTL_HYS_SET(x) (((uint32_t)(x) << IOC_PAD_PAD_CTL_HYS_SHIFT) & IOC_PAD_PAD_CTL_HYS_MASK)
  48. #define IOC_PAD_PAD_CTL_HYS_GET(x) (((uint32_t)(x) & IOC_PAD_PAD_CTL_HYS_MASK) >> IOC_PAD_PAD_CTL_HYS_SHIFT)
  49. /*
  50. * PRS (RW)
  51. *
  52. * select pull up/down internal resistance strength:
  53. * For pull down, only have 100 Kohm resistance
  54. * For pull up:
  55. * 00: 100 KOhm
  56. * 01: 47 KOhm
  57. * 10: 22 KOhm
  58. * 11: 22 KOhm
  59. */
  60. #define IOC_PAD_PAD_CTL_PRS_MASK (0x300000UL)
  61. #define IOC_PAD_PAD_CTL_PRS_SHIFT (20U)
  62. #define IOC_PAD_PAD_CTL_PRS_SET(x) (((uint32_t)(x) << IOC_PAD_PAD_CTL_PRS_SHIFT) & IOC_PAD_PAD_CTL_PRS_MASK)
  63. #define IOC_PAD_PAD_CTL_PRS_GET(x) (((uint32_t)(x) & IOC_PAD_PAD_CTL_PRS_MASK) >> IOC_PAD_PAD_CTL_PRS_SHIFT)
  64. /*
  65. * PS (RW)
  66. *
  67. * pull select
  68. * 0: pull down
  69. * 1: pull up
  70. */
  71. #define IOC_PAD_PAD_CTL_PS_MASK (0x40000UL)
  72. #define IOC_PAD_PAD_CTL_PS_SHIFT (18U)
  73. #define IOC_PAD_PAD_CTL_PS_SET(x) (((uint32_t)(x) << IOC_PAD_PAD_CTL_PS_SHIFT) & IOC_PAD_PAD_CTL_PS_MASK)
  74. #define IOC_PAD_PAD_CTL_PS_GET(x) (((uint32_t)(x) & IOC_PAD_PAD_CTL_PS_MASK) >> IOC_PAD_PAD_CTL_PS_SHIFT)
  75. /*
  76. * PE (RW)
  77. *
  78. * pull enable
  79. * 0: pull disable
  80. * 1: pull enable
  81. */
  82. #define IOC_PAD_PAD_CTL_PE_MASK (0x20000UL)
  83. #define IOC_PAD_PAD_CTL_PE_SHIFT (17U)
  84. #define IOC_PAD_PAD_CTL_PE_SET(x) (((uint32_t)(x) << IOC_PAD_PAD_CTL_PE_SHIFT) & IOC_PAD_PAD_CTL_PE_MASK)
  85. #define IOC_PAD_PAD_CTL_PE_GET(x) (((uint32_t)(x) & IOC_PAD_PAD_CTL_PE_MASK) >> IOC_PAD_PAD_CTL_PE_SHIFT)
  86. /*
  87. * KE (RW)
  88. *
  89. * keeper capability enable
  90. * 0: keeper disable
  91. * 1: keeper enable
  92. */
  93. #define IOC_PAD_PAD_CTL_KE_MASK (0x10000UL)
  94. #define IOC_PAD_PAD_CTL_KE_SHIFT (16U)
  95. #define IOC_PAD_PAD_CTL_KE_SET(x) (((uint32_t)(x) << IOC_PAD_PAD_CTL_KE_SHIFT) & IOC_PAD_PAD_CTL_KE_MASK)
  96. #define IOC_PAD_PAD_CTL_KE_GET(x) (((uint32_t)(x) & IOC_PAD_PAD_CTL_KE_MASK) >> IOC_PAD_PAD_CTL_KE_SHIFT)
  97. /*
  98. * OD (RW)
  99. *
  100. * open drain
  101. * 0: open drain disable
  102. * 1: open drain enable
  103. */
  104. #define IOC_PAD_PAD_CTL_OD_MASK (0x100U)
  105. #define IOC_PAD_PAD_CTL_OD_SHIFT (8U)
  106. #define IOC_PAD_PAD_CTL_OD_SET(x) (((uint32_t)(x) << IOC_PAD_PAD_CTL_OD_SHIFT) & IOC_PAD_PAD_CTL_OD_MASK)
  107. #define IOC_PAD_PAD_CTL_OD_GET(x) (((uint32_t)(x) & IOC_PAD_PAD_CTL_OD_MASK) >> IOC_PAD_PAD_CTL_OD_SHIFT)
  108. /*
  109. * SR (RW)
  110. *
  111. * slew rate
  112. * 0: Slow slew rate
  113. * 1: Fast slew rate
  114. */
  115. #define IOC_PAD_PAD_CTL_SR_MASK (0x40U)
  116. #define IOC_PAD_PAD_CTL_SR_SHIFT (6U)
  117. #define IOC_PAD_PAD_CTL_SR_SET(x) (((uint32_t)(x) << IOC_PAD_PAD_CTL_SR_SHIFT) & IOC_PAD_PAD_CTL_SR_MASK)
  118. #define IOC_PAD_PAD_CTL_SR_GET(x) (((uint32_t)(x) & IOC_PAD_PAD_CTL_SR_MASK) >> IOC_PAD_PAD_CTL_SR_SHIFT)
  119. /*
  120. * SPD (RW)
  121. *
  122. * additional 2-bit slew rate to select IO cell operation frequency range with reduced switching noise
  123. * 00: Slow frequency slew rate(50Mhz)
  124. * 01: Medium frequency slew rate(100 Mhz)
  125. * 10: Fast frequency slew rate(150 Mhz)
  126. * 11: Max frequency slew rate(200Mhz)
  127. */
  128. #define IOC_PAD_PAD_CTL_SPD_MASK (0x30U)
  129. #define IOC_PAD_PAD_CTL_SPD_SHIFT (4U)
  130. #define IOC_PAD_PAD_CTL_SPD_SET(x) (((uint32_t)(x) << IOC_PAD_PAD_CTL_SPD_SHIFT) & IOC_PAD_PAD_CTL_SPD_MASK)
  131. #define IOC_PAD_PAD_CTL_SPD_GET(x) (((uint32_t)(x) & IOC_PAD_PAD_CTL_SPD_MASK) >> IOC_PAD_PAD_CTL_SPD_SHIFT)
  132. /*
  133. * DS (RW)
  134. *
  135. * drive strength
  136. * 1.8V Mode:
  137. * 000: 260 Ohm
  138. * 001: 260 Ohm
  139. * 010: 130 Ohm
  140. * 011: 88 Ohm
  141. * 100: 65 Ohm
  142. * 101: 52 Ohm
  143. * 110: 43 Ohm
  144. * 111: 37 Ohm
  145. * 3.3V Mode:
  146. * 000: 157 Ohm
  147. * 001: 157 Ohm
  148. * 010: 78 Ohm
  149. * 011: 53 Ohm
  150. * 100: 39 Ohm
  151. * 101: 32 Ohm
  152. * 110: 26 Ohm
  153. * 111: 23 Ohm
  154. */
  155. #define IOC_PAD_PAD_CTL_DS_MASK (0x7U)
  156. #define IOC_PAD_PAD_CTL_DS_SHIFT (0U)
  157. #define IOC_PAD_PAD_CTL_DS_SET(x) (((uint32_t)(x) << IOC_PAD_PAD_CTL_DS_SHIFT) & IOC_PAD_PAD_CTL_DS_MASK)
  158. #define IOC_PAD_PAD_CTL_DS_GET(x) (((uint32_t)(x) & IOC_PAD_PAD_CTL_DS_MASK) >> IOC_PAD_PAD_CTL_DS_SHIFT)

2.2gpio控制器

2.2.1特性总结

本章节介绍 GPIO 控制器的主要特性:

  • 配置 IO 作为输入或者输出
  • 读取 IO 输入的状态
  • 设置 IO 的输出
  • 原子化操作设置 IO 输出高,输出低,翻转

GPIO,PGPIO 支持配置 GPIO 中断,FGPIO0 不支持生成中断。

2.2.2GPIO** 控制

OE:控制gpio方向

DO:控制输出电平

DI 寄存器可以实现 IO 监听和状态读取

原子化操作寄存器

  • 输出高寄存器 SET
  • 输出低寄存器 CLEAR
  • 翻转寄存器 TOGGLE

2.2.3GPIO中断

  • IE 寄存器打开 GPIO 中断
  • TP 寄存器来指定中断的类型;置 1,表示中断由边沿触发,置0,表示中断由电平触发。
  • PL 寄存器来指定中断的极性;位置 1,表示中断由下降沿或者低电平触发,置 0,表示中断由上升沿或高电平触发
  • IF 寄存器来查询中断的状态,对应标志位置 1,表示对应 IO 有中断待处理;位写 1,可以清除这个标志位
  • GPIO 控制器支持在检测到上升沿或下降沿生成中断,也支持双沿或单沿触发模式。
  • GPIO 支持生成异步中断,异步中断允许在系统时钟异常时生成中断。

2.2.4相关的数据结构

  1. typedef struct {
  2. struct {
  3. __Ruint32_t VALUE; /* 0x0: GPIO input value IO数据读取*/
  4. __Ruint8_tRESERVED0[12]; /* 0x4 - 0xF: Reserved */
  5. } DI[16];
  6. struct {
  7. __RW uint32_t VALUE; /* 0x100: GPIO output value IO数据写入 */
  8. __RW uint32_t SET; /* 0x104: GPIO output set */
  9. __RW uint32_t CLEAR; /* 0x108: GPIO output clear */
  10. __RW uint32_t TOGGLE; /* 0x10C: GPIO output toggle */
  11. } DO[16];
  12. struct {
  13. __RW uint32_t VALUE; /* 0x200: GPIO direction value IO方向写入*/
  14. __RW uint32_t SET; /* 0x204: GPIO direction set */
  15. __RW uint32_t CLEAR; /* 0x208: GPIO direction clear */
  16. __RW uint32_t TOGGLE; /* 0x20C: GPIO direction toggle */
  17. } OE[16];
  18. struct {
  19. __Wuint32_t VALUE; /* 0x300: GPIO interrupt flag value 中断标志*/
  20. __Ruint8_tRESERVED0[12]; /* 0x304 - 0x30F: Reserved */
  21. } IF[16];
  22. struct {
  23. __RW uint32_t VALUE; /* 0x400: GPIO interrupt enable value 中断使能控制*/
  24. __RW uint32_t SET; /* 0x404: GPIO interrupt enable set */
  25. __RW uint32_t CLEAR; /* 0x408: GPIO interrupt enable clear */
  26. __RW uint32_t TOGGLE; /* 0x40C: GPIO interrupt enable toggle */
  27. } IE[16];
  28. struct {
  29. __RW uint32_t VALUE; /* 0x500: GPIO interrupt polarity value中断极性设置 */
  30. __RW uint32_t SET; /* 0x504: GPIO interrupt polarity set */
  31. __RW uint32_t CLEAR; /* 0x508: GPIO interrupt polarity clear */
  32. __RW uint32_t TOGGLE; /* 0x50C: GPIO interrupt polarity toggle */
  33. } PL[16];
  34. struct {
  35. __RW uint32_t VALUE; /* 0x600: GPIO interrupt type value 中断类型设置*/
  36. __RW uint32_t SET; /* 0x604: GPIO interrupt type set */
  37. __RW uint32_t CLEAR; /* 0x608: GPIO interrupt type clear */
  38. __RW uint32_t TOGGLE; /* 0x60C: GPIO interrupt type toggle */
  39. } TP[16];
  40. struct {
  41. __RW uint32_t VALUE; /* 0x700: GPIO interrupt asynchronous value 中断异步使能*/
  42. __RW uint32_t SET; /* 0x704: GPIO interrupt asynchronous set */
  43. __RW uint32_t CLEAR; /* 0x708: GPIO interrupt asynchronous clear */
  44. __RW uint32_t TOGGLE; /* 0x70C: GPIO interrupt asynchronous toggle */
  45. } AS[16];
  46. struct {
  47. __RW uint32_t VALUE; /* 0x800: GPIO dual edge interrupt enable value 中断双边沿使能触发*/
  48. __RW uint32_t SET; /* 0x804: GPIO dual edge interrupt enable set */
  49. __RW uint32_t CLEAR; /* 0x808: GPIO dual edge interrupt enable clear */
  50. __RW uint32_t TOGGLE; /* 0x80C: GPIO dual edge interrupt enable toggle */
  51. } PD[16];
  52. } GPIO_Type;

LED使用场景的配置方法

  1. 配置复用

  2. 配置电气属性;

    1. void init_gpio_pins(void)
    2. {
    3. /* configure pad setting: pull enable and pull up, schmitt trigger enable */
    4. /* enable schmitt trigger to eliminate jitter of pin used as button */
    5. /* Button 上下拉使能;上拉;施密特触发使能 */
    6. uint32_t pad_ctl = IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1) | IOC_PAD_PAD_CTL_HYS_SET(1);
    7. HPM_IOC->PAD[IOC_PAD_PA09].FUNC_CTL = IOC_PA09_FUNC_CTL_GPIO_A_09;
    8. HPM_IOC->PAD[IOC_PAD_PA09].PAD_CTL = pad_ctl;
    9. }
  3. 设置gpio属性

    1. //输入
    2. gpio_set_pin_input(BOARD_APP_GPIO_CTRL, BOARD_APP_GPIO_INDEX, BOARD_APP_GPIO_PIN);
    3. //输出
    4. gpio_write_pin(HPM_GPIO0, GPIO_DI_GPIOA,23, 1);
  4. LED电平翻转

    1. gpio_toggle_pin(HPM_GPIO0, GPIO_DI_GPIOA,23, 1);

LED实例

  1. /*
  2. 配置gpio
  3. */
  4. void bsp_init_gpio_pins(void)
  5. {
  6. /*
  7. 上下拉使能,上拉,使能施密特触发器
  8. configure pad setting: pull enable and pull up, schmitt trigger enable */
  9. /* enable schmitt trigger to eliminate jitter of pin used as button */
  10. /* Button */
  11. uint32_t pad_ctl = IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1) | IOC_PAD_PAD_CTL_HYS_SET(1);
  12. HPM_IOC->PAD[IOC_PAD_PA23].FUNC_CTL = IOC_PA23_FUNC_CTL_GPIO_A_23;
  13. HPM_IOC->PAD[IOC_PAD_PA23].PAD_CTL = pad_ctl;
  14. }
  15. /*
  16. 配置gpio方向
  17. in_out=1:out
  18. in_out=1:in
  19. */
  20. void bsp_init_gpio(int in_out)
  21. {
  22. if(in_out)
  23. {
  24. gpio_set_pin_output(HPM_GPIO0, GPIO_DI_GPIOA, IOC_PAD_PA23);
  25. }
  26. else{
  27. gpio_set_pin_input(HPM_GPIO0, GPIO_DI_GPIOA, IOC_PAD_PA23);
  28. }
  29. }
  30. int main(void)
  31. {
  32. board_init();
  33. bsp_init_gpio_pins();
  34. bsp_init_gpio(1);
  35. printf("gpio example\n");
  36. gpio_write_pin(HPM_GPIO0, GPIO_DI_GPIOA, IOC_PAD_PA23,1);
  37. for (uint32_t i = 0; i < 10; i++) {
  38. gpio_toggle_pin(HPM_GPIO0, GPIO_DI_GPIOA, IOC_PAD_PA23);
  39. board_delay_ms(500);
  40. gpio_toggle_pin(HPM_GPIO0, GPIO_DI_GPIOA, IOC_PAD_PA23);
  41. board_delay_ms(500);
  42. printf("toggling led %u/%u times\n", i + 1, 10);
  43. }
  44. while (1);
  45. return 0;
  46. }

按键中断实例

  1. #include "board.h"
  2. #include "hpm_gpio_drv.h"
  3. void inti_key_int(void)
  4. {
  5. gpio_interrupt_trigger_t trigger;
  6. gpio_set_pin_output(HPM_GPIO0, GPIO_DI_GPIOA,23);
  7. gpio_set_pin_input(HPM_GPIO0, GPIO_DI_GPIOA,9);
  8. trigger = gpio_interrupt_trigger_edge_both;
  9. //配置中断参数
  10. gpio_config_pin_interrupt(HPM_GPIO0, GPIO_DI_GPIOA,9, trigger);
  11. //使能中断
  12. gpio_enable_pin_interrupt(HPM_GPIO0, GPIO_DI_GPIOA,9);
  13. //设置中断优先级
  14. intc_m_enable_irq_with_priority(IRQn_GPIO0_A, 1);
  15. }
  16. void isr_gpio(void)
  17. {
  18. //清除中断标志
  19. gpio_clear_pin_interrupt_flag(HPM_GPIO0, GPIO_DI_GPIOA,9);
  20. gpio_toggle_pin(HPM_GPIO0, GPIO_DI_GPIOA,23);
  21. printf("toggle led pin output\n");
  22. if (gpio_read_pin(HPM_GPIO0, GPIO_DI_GPIOA,9) == false) {
  23. printf("user key pressed\n");
  24. } else {
  25. printf("user key released\n");
  26. }
  27. }
  28. //注册中断处理函数
  29. SDK_DECLARE_EXT_ISR_M(IRQn_GPIO0_A, isr_gpio)
  30. int main(void)
  31. {
  32. board_init();
  33. board_init_gpio_pins();
  34. inti_key_int();
  35. printf("gpio example\n");
  36. while (1);
  37. return 0;
  38. }

寄存器分组

  1. #define GPIO_DI_GPIOA (0UL)
  2. #define GPIO_DI_GPIOB (1UL)
  3. #define GPIO_DI_GPIOC (2UL)
  4. #define GPIO_DI_GPIOD (3UL)
  5. #define GPIO_DI_GPIOE (4UL)
  6. #define GPIO_DI_GPIOF (5UL)
  7. #define GPIO_DI_GPIOX (13UL)
  8. #define GPIO_DI_GPIOY (14UL)
  9. #define GPIO_DI_GPIOZ (15UL)

gpio触发结构体

  1. /**
  2. * @brief Interrupt trigger type
  3. */
  4. typedef enum gpio_interrupt_trigger {
  5. gpio_interrupt_trigger_level_high = 0,
  6. gpio_interrupt_trigger_level_low,
  7. gpio_interrupt_trigger_edge_rising,
  8. gpio_interrupt_trigger_edge_falling,
  9. #if defined(GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT) && (GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT == 1)
  10. gpio_interrupt_trigger_edge_both,
  11. #endif
  12. } gpio_interrupt_trigger_t;
点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表