查看: 2112|回复: 4

[求助] GPIOTE模块的运用

[复制链接]

8

主题

2

好友

404

积分

秀才

Rank: 3Rank: 3

  • TA的每日心情
    奋斗
    2014-11-26 16:58
  • 签到天数: 34 天

    [LV.5]常住居民I

    发表于 2014-4-2 11:36:46 |显示全部楼层
    我在查看  app_gpiote.c  时有几个疑惑.还希望了解的人能不吝赐教!

    1、app_gpiote_user_enable(user_id) 函数
            此函数会事先判断各输入引脚的状态, 并根据状态来判断是高电平还是低电平触发GPIOTE中断. 如果当前 PIN 输入为 LOW 则检测高电平,如果当前 PIN 为 HIGH 则检测低电平.
             不知道我这么理解对不对,这么设计的初衷是什么呢?  让GPIOTE_USER 自己指定是检测哪个电平是不是会更好一点?

    2、sense_level_toggle(p_user, pins)函数
            这个函数在GPIOTE_IRQHandler() 中被调用,不知道这样做到底是想要做什么?






    回复

    使用道具 举报

    10

    主题

    6

    好友

    868

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    该用户从未签到

    发表于 2014-4-3 09:45:56 |显示全部楼层
    1、app_gpiote_user_enable(user_id) 函数
    我想这个函数默认当前状态为没有按键的状态,所以只要状态变化就能触发相应的时间。
    不知道你用的是不是5.2的SDK,好像5.2的SDK支持按键的双向检测了。

    2、sense_level_toggle(p_user, pins)函数
    应该是检测电平的翻转,可以用来检测按键按下之后的抬起动作吧。
    回复

    使用道具 举报

    8

    主题

    2

    好友

    404

    积分

    秀才

    Rank: 3Rank: 3

  • TA的每日心情
    奋斗
    2014-11-26 16:58
  • 签到天数: 34 天

    [LV.5]常住居民I

    发表于 2014-4-3 10:31:38 |显示全部楼层
    本帖最后由 Depth 于 2014-4-3 10:33 编辑
    nrf51822 发表于 2014-4-3 09:45
    1、app_gpiote_user_enable(user_id) 函数
    我想这个函数默认当前状态为没有按键的状态,所以只要状态变化就 ...

    SDK 用的是4.4.2,   SoftDevice 是5.2.1

    那意思就是说,并没有规定相关引脚的初试状态,于是有两种情况:
    @ 按键初试状态为 Low, 按下之后为 High
    @ 按键初试状态为 High,按下之后为Low.
    那么按照官方库的设计,可以实现:只要电平变化了,就能检测到.   包括了按键的按下,和抬起.
    可是这么做的话,岂不是 按下和抬起 都会产生中断,那么一次按键动作会导致  GPIOTE_IRQHandler() 被执行两次了啊.


    回复

    使用道具 举报

    3

    主题

    1

    好友

    130

    积分

    童生

    Rank: 2

  • TA的每日心情
    郁闷
    2014-4-24 15:31
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2014-4-9 12:14:23 |显示全部楼层
    nrf51822 发表于 2014-4-3 09:45
    1、app_gpiote_user_enable(user_id) 函数
    我想这个函数默认当前状态为没有按键的状态,所以只要状态变化就 ...

    不知道你用的是不是5.2的SDK,好像5.2的SDK支持按键的双向检测了。这个很好写的
    //获知io脚电平
    int8_t IO(uint8_t GPIO)
    {
            uint32_t NUM;
            if(NRF_GPIO->PIN_CNF[GPIO]&0x01)//这个脚之前是不是输出
                {
                              NUM=NRF_GPIO->PIN_CNF[GPIO];//输出配置保存
                              NRF_GPIO->PIN_CNF[GPIO]=0;
            gpio_bit_in(GPIO,1,2);//中断用io脚配置  X引脚     Y内拉电阻00无 01下拉,11上拉      Z电平感知沿10上升沿11下降沿
                        if((NRF_GPIO->IN)&(1<<GPIO))//判断X脚电平
                                 {
                NRF_GPIO->PIN_CNF[GPIO]=NUM;
                                                    nrf_delay_ms(10);
                                        return 1;
               }
            else
                                       {
                                              NRF_GPIO->PIN_CNF[GPIO]=NUM;
                                                    nrf_delay_ms(10);
                                              return 0;
                                       }
          }
       else
                {
                        if((NRF_GPIO->IN)&(1<<GPIO))//判断X脚电平
                                 {
                                        return 1;
               }
           else
                                       {
                                              return 0;
                                       }
          }
    }
    回复

    使用道具 举报

    10

    主题

    6

    好友

    868

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    该用户从未签到

    发表于 2014-4-11 09:46:15 |显示全部楼层
    函数调用(形参) 发表于 2014-4-9 12:14
    不知道你用的是不是5.2的SDK,好像5.2的SDK支持按键的双向检测了。这个很好写的
    //获知io脚电平
    int8_t  ...

    是的,楼上正解。

    建议使用最新版本的SDK。

    软件更新请联系购买时的客服索取。
    回复

    使用道具 举报

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

    关闭

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


    手机版|爱板网 |网站地图  

    GMT+8, 2016-12-7 22:26 , Processed in 0.081558 second(s), 12 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部