JL杰理蓝牙芯片交流论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 441|回复: 0

ad16IO中断示例

[复制链接]

15

主题

19

回帖

316

积分

版主

Rank: 7Rank: 7Rank: 7

积分
316
发表于 2023-8-29 19:12:43 | 显示全部楼层 |阅读模式

注册登录,了解更多芯片技术。

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

x
  1. /*JL_WAKEUP->CON0:
  2. *                0:IO-wkup
  3. *                1:IRFLT-wkup 与红外功能复用
  4. *                2:uart0_rxas 与uart0_rx功能复用
  5. *                3:uart1_rxas 与uart1_rx功能复用
  6. * */
  7.    
  8. enum WAKEUP_SOURCE {
  9.     WKUP_S_ICH_WKUP = 0,
  10.     WKUP_S_IRFLT,
  11.     WKUP_S_UART0_RXAS,
  12.     WKUP_S_UART1_RXAS,
  13. };
  14. enum WAKEUP_EDGE {
  15.     PORT_WKUP_EDGE_RISE,
  16.     PORT_WKUP_EDGE_FALL,
  17. };
  18. extern int gpio_ich_disable_input_signal(u32 gpio, enum INPUT_CH_SIGNAL signal, enum INPUT_CH_TYPE type);

  19. static u32 port_wkup_source_pfi[] = {
  20.     INPUT_CH_SIGNAL_IRFLT,
  21.     INPUT_CH_SIGNAL_IRFLT,
  22.     PFI_UART0_RX,
  23.     PFI_UART1_RX,
  24. };
  25. static void (*port_wkup_irq_cbfun[4])(u32 port, u32 edge) = {NULL};
  26. static u8 user_port[4] = {0};
  27. /**
  28. * @brief 引脚中断函数
  29. */
  30. ___interrupt
  31. void port_wkup_irq_fun(void)
  32. {
  33.     u8 wakeup_index = 0;
  34.     //printf("png:0x%x\n", JL_WAKEUP->CON3);
  35.     for (; wakeup_index < 4; wakeup_index++) {
  36.         if (JL_WAKEUP->CON3 & BIT(wakeup_index)) {
  37.             JL_WAKEUP->CON2 |= BIT(wakeup_index);
  38.             if (port_wkup_irq_cbfun[wakeup_index]) {
  39.                 //printf(">");
  40.                 port_wkup_irq_cbfun[wakeup_index](user_port[wakeup_index], (!!(JL_WAKEUP->CON1 & BIT(wakeup_index))));
  41.             }
  42.         }
  43.     }
  44. }
  45. /**
  46. * @brief 引脚中断初始化//注意功能复用
  47. * @param port 任意引脚的引脚号:IO_PORTA_00......
  48. * @param trigger_edge 触发边沿。 0:上升沿触发。 1;下降沿触发
  49. * @param cbfun 相应的中断回调函数
  50. */
  51. void port_wkup_info_init()
  52. {
  53.     static u8 init_flag = 1;
  54.     if (init_flag) {
  55.         memset((u8 *)user_port, 0xff, sizeof(user_port));
  56.         memset((u8 *)port_wkup_irq_cbfun, 0, sizeof(port_wkup_irq_cbfun));
  57.         init_flag = 0;
  58.     }
  59. }
  60. int port_wkup_interrupt_init(u32 port, enum WAKEUP_SOURCE wkup_s, enum WAKEUP_EDGE trigger_edge, void (*cbfun)(u32 port, u32 edge)) //注意功能复用
  61. {
  62.     port_wkup_info_init();
  63.     if (JL_WAKEUP->CON0 & BIT(wkup_s)) {
  64.         log_error("port wkup(%d) has been open.please close!\n", wkup_s);
  65.         return -1;
  66.     }
  67.     if (trigger_edge == PORT_WKUP_EDGE_RISE) {
  68.         JL_WAKEUP->CON1 &= ~BIT(wkup_s);//0:上升沿
  69.         gpio_set_direction(port, 1);
  70.         gpio_set_die(port, 1);
  71.         gpio_set_pull_up(port, 0);
  72.         gpio_set_pull_down(port, 1);
  73.     } else {
  74.         JL_WAKEUP->CON1 |= BIT(wkup_s);
  75.         gpio_set_direction(port, 1);
  76.         gpio_set_die(port, 1);
  77.         gpio_set_pull_up(port, 1);
  78.         gpio_set_pull_down(port, 0);
  79.     }
  80.     if (wkup_s <= WKUP_S_IRFLT) {
  81.         gpio_ich_sel_input_signal(port, port_wkup_source_pfi[wkup_s], INPUT_CH_TYPE_GP_ICH2);
  82.     } else {
  83.         gpio_set_fun_input_port(port, port_wkup_source_pfi[wkup_s]);
  84.     }
  85.     user_port[wkup_s] = port;
  86.     if (cbfun) {
  87.         port_wkup_irq_cbfun[wkup_s] = cbfun;
  88.     }
  89.     request_irq(IRQ_PORT_IDX, 3, port_wkup_irq_fun, 0); //注册中断函数
  90.     JL_WAKEUP->CON2 |= BIT(wkup_s);                          //清一次pnd
  91.     JL_WAKEUP->CON0 |= BIT(wkup_s);                          //引脚中断使能
  92.     JL_WAKEUP->CON2 |= BIT(wkup_s);
  93.     log_info("init ok:port:%d,wkup_s:%d\n", port, wkup_s);
  94.     return 0;//ok
  95. }

  96. /**
  97. * @brief 关掉该引脚的中断功能
  98. * @param port 引脚号:IO_PORTA_00......
  99. */
  100. int port_wkup_interrupt_deinit(u32 port, enum WAKEUP_SOURCE wkup_s)
  101. {
  102.     if (JL_WAKEUP->CON0 & BIT(wkup_s)) {
  103.         if (port == user_port[wkup_s]) {
  104.             JL_WAKEUP->CON0 &= ~BIT(wkup_s);
  105.             gpio_set_direction(port, 1);
  106.             gpio_set_die(port, 0);
  107.             gpio_set_pull_up(port, 0);
  108.             gpio_set_pull_down(port, 0);
  109.             if (wkup_s <= WKUP_S_IRFLT) {
  110.                 gpio_ich_disable_input_signal(port, port_wkup_source_pfi[wkup_s], INPUT_CH_TYPE_GP_ICH0);
  111.             } else {
  112.                 gpio_disable_fun_input_port(port_wkup_source_pfi[wkup_s]);
  113.             }

  114.             gpio_disable_fun_input_port(port_wkup_source_pfi[wkup_s]);
  115.             user_port[wkup_s] = 0xff;
  116.             port_wkup_irq_cbfun[wkup_s] = NULL;
  117.         } else {
  118.             log_error("%s parameter:port error!\n", __func__);
  119.             return -2;
  120.         }
  121.     } else {
  122.         log_error("port wkup source:%d has been closed!\n", wkup_s);
  123.         return -3;
  124.     }
  125.     return 0;
  126. }

  127. //切换边沿
  128. int port_wkup_interrupt_change_edge(enum WAKEUP_SOURCE wkup_s, enum WAKEUP_EDGE trigger_edge)
  129. {
  130.     if ((JL_WAKEUP->CON0 & BIT(wkup_s)) == 0) {
  131.         log_error("port wkup(%d) has been close.please open!\n", wkup_s);
  132.         return -1;
  133.     }
  134.     if (trigger_edge == PORT_WKUP_EDGE_RISE) {
  135.         JL_WAKEUP->CON1 &= ~BIT(wkup_s);//0:上升沿
  136.         gpio_set_direction(user_port[wkup_s], 1);
  137.         gpio_set_die(user_port[wkup_s], 1);
  138.         gpio_set_pull_up(user_port[wkup_s], 0);
  139.         gpio_set_pull_down(user_port[wkup_s], 1);
  140.     } else {
  141.         JL_WAKEUP->CON1 |= BIT(wkup_s);
  142.         gpio_set_direction(user_port[wkup_s], 1);
  143.         gpio_set_die(user_port[wkup_s], 1);
  144.         gpio_set_pull_up(user_port[wkup_s], 1);
  145.         gpio_set_pull_down(user_port[wkup_s], 0);
  146.     }
  147.     return 0;
  148. }
  149. //切换回调函数
  150. int port_wkup_interrupt_change_cbfun(enum WAKEUP_SOURCE wkup_s, void (*cbfun)(u32 port, u32 edge))
  151. {
  152.     if ((JL_WAKEUP->CON0 & BIT(wkup_s)) == 0) {
  153.         log_error("port wkup(%d) has been close.please open!\n", wkup_s);
  154.         return -1;
  155.     }
  156.     if (cbfun) {
  157.         port_wkup_irq_cbfun[wkup_s] = cbfun;
  158.     }
  159.     return 0;
  160. }
  161. /*********************************************************************************************************
  162. * ******************************           使用举例如下           ***************************************
  163. * ******************************************************************************************************/
  164. #if 1

  165. static void _ich_wkup(u32 port, u32 edge)
  166. {
  167.     printf("%s\n", __func__);
  168. }
  169. //void _irflt_wkup(u32 port, u32 edge)
  170. //{
  171. //    printf("%s\n", __func__);
  172. //}
  173. //void _ut0_wkup(u32 port, u32 edge)
  174. //{
  175. //    printf("%s\n", __func__);
  176. //}
  177. //void _ut1_wkup(u32 port, u32 edge)
  178. //{
  179. //    printf("%s\n", __func__);
  180. //}

  181. void wdt_clear(void);
  182. void port_wkup_test()
  183. {
  184.     port_wkup_interrupt_init(IO_PORTA_03, WKUP_S_ICH_WKUP, PORT_WKUP_EDGE_RISE, _ich_wkup);//上升沿触发
  185.     port_wkup_interrupt_init(IO_PORTA_04, WKUP_S_IRFLT, PORT_WKUP_EDGE_FALL, _irflt_wkup);//下降沿触发
  186.     port_wkup_interrupt_init(IO_PORTA_05, WKUP_S_UART0_RXAS, PORT_WKUP_EDGE_FALL, _ut0_wkup);//下降沿触发
  187.     port_wkup_interrupt_init(IO_PORTA_02, WKUP_S_UART1_RXAS, PORT_WKUP_EDGE_FALL, _ut1_wkup);//下降沿触发
  188.     port_wkup_interrupt_deinit(IO_PORTC_05, WKUP_S_ICH_WKUP);
  189.     port_wkup_interrupt_deinit(IO_PORTA_03, WKUP_S_ICH_WKUP);
  190.     while (1) {
  191.         wdt_clear();
  192.     }
  193. }
复制代码


回复

使用道具 举报

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

本版积分规则

QQ|JL杰理蓝牙芯片交流论坛 ( 粤ICP备18068352号 )

GMT+8, 2024-9-8 09:59 , Processed in 0.071499 second(s), 22 queries .

Powered by yunthinker云信

© 2001-2023 yunthinker Team.

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