jszszzy 发表于 2021-12-5 00:08

安信可PB-02模组评测(3)——PHY62XX GPIO使用指南

<div class='showpostmsg'># 安信可PB-02模组评测(3)——PHY62XX GPIO使用指南

## 本篇文章于EEWORLD首发,详情移步:(https://bbs.eeworld.com.cn/elecplay/content/189#F5)

- 软件环境:SDK
- 硬件:安信可PB-01kit

## PHY6212 GPIO介绍

GPIO, 全称 General-Purpose Input/Output(通用输入输出),是一种软件运行期间能够动 态配置和控制的通用引脚。PHY62XX GPIO 最多支持 35 个 IO。

值得注意的的是,PHY6216的GPIO在上电后电平是有固定的上下拉的,并且会配置成固定的输入输出模式,具体配置如下图:



### 不同的上下拉:

- 浮空:未知态。

- **弱上拉**:上拉到 AVDD33,高电平,驱动电流小。上拉电阻 150K 欧

- **强上拉**:上拉到 AVDD33,高电平,驱动电流大。上拉电阻 10K 欧

- 下拉:下拉到地,低电平,下拉电阻 100K 欧姆。



## GPIO使用指南:

### 一、GPIO的状态:

GPIO在初始化时分为五个状态:



### 二、代码分析与使用流程:

GPIO拉高模式:



```C
intmain(void)
{   
    // init global configuration of SOC
    int rrn = __return_address();//汇编函数,具体返回地址:SRAM0 0X1FFF4959

                g_system_clk = SYS_CLK_DLL_48M;
                osal_mem_set_heap((osalMemHdr_t *)g_largeHeap, LARGE_HEAP_SIZE);//设置系统堆栈
                init_config();//API并没有开放,推测是针对系统的初始化?
       
    hal_pwrmgr_init();//休眠控制初始化
   
    hal_rfphy_init();// 射频初始化

    hal_init();//外设初始化 ->>>GPIO 模块初始化就包含在这里
    LOG("%x\n", rrn);//打印出此地址
       
    app_main();       
}
/*这里是将任务初始化放到了这里,并不是在这里调用而是在osalInitTasks()中调用 */
void Led_Demo_Init(uint8 task_id)
{
        hal_gpio_pin_init(P34,OEN);//配置 GPIO 输出
        hal_gpio_write(GPIO_P34,1);//将GPIO34 拉高
}
```

GPIO外部中断与唤醒:



需要指出的是,部分GPIO并不支持中断但是支持直接唤醒,这就让设计在某些不需要中断处理德情况下变得方便。

顺便吐槽一下,例程给的很多东西都是不完善的,比如库中延时函数就无法使用。

```c
void Led_Demo_Init(uint8 task_id)
{
        hal_gpio_pin_init(P34,OEN);
        hal_gpio_write(GPIO_P34,1);
        //osal_start_reload_timerEx(task_id,LED_SHAKE,1000);
        while(1)
        {
                //WaitMs(10);
                for(int i=0;i<480000;i++);
                hal_gpio_write(GPIO_P34,0);
                //WaitMs(10);
                for(int i=0;i<480000;i++);
                hal_gpio_write(GPIO_P34,1);
        }
}
```

最终效果如下:



接下来就是中断和唤醒注册模块,这部分同样说得不明不白,OSAL是怎么管理休眠的?

```c
typedef struct gpioin_wakeup_t{
        GPIO_Pin_e pin;
        gpioin_Hdl_t posedgeHdl;
        gpioin_Hdl_t negedgeHdl;
}gpioin_wakeup;

#define GPIO_WAKEUP_PIN_NUM 3
gpioin_wakeup gpiodemo =
{
        GPIO_P14,posedge_callback_wakeup,negedge_callback_wakeup,
        GPIO_P23,posedge_callback_wakeup,negedge_callback_wakeup,
        GPIO_P31,posedge_callback_wakeup,negedge_callback_wakeup,
};

void Gpio_Wakeup_Init(uint8 task_id )
{
        uint8_t i = 0;
        static bool gpioin_state;
       
        gpio_wakeup_TaskID = task_id;
       
        for(i = 0;i<GPIO_WAKEUP_PIN_NUM;i++)
        {
                hal_gpioin_register(gpiodemo.pin,gpiodemo.posedgeHdl,gpiodemo.negedgeHdl);
                gpioin_state = hal_gpio_read(gpiodemo.pin);
                LOG("gpioin_state:%d %d\n",i,gpioin_state);
        }               
        //pwroff_cfg_t gpio={GPIO_P14,POSEDGE};
        //hal_pwrmgr_poweroff(&gpio,GPIO_P14);
}

uint16 Gpio_Wakeup_ProcessEvent( uint8 task_id, uint16 events )
{
        if(task_id != gpio_wakeup_TaskID)
        {
                return 0;
        }
        return 0;
}
```

当使用跳线触发GPIO14的时候,就会调用函数**posedge_callback_wakeup**来提示触发了中断。回调函数如下:

```c
void posedge_callback_wakeup(GPIO_Pin_e pin,IO_Wakeup_Pol_e type)
{
        if(type == POSEDGE)
        {
                LOG("wakeup(pos):gpio:%d type:%d\n",pin,type);
        }
        else
        {
                LOG("error\n");
        }
}
```

中断触发效果如下:





问题汇总:

- 休眠模式如何进入?为什么P14的电平变化会进入休眠模式?
- RTC模块如何开启?如何使用延时函数?
- OSAL对模块的定义是如何?模块的休眠是什么意思?可以单独模块进入休眠吗?
- 如何触发任务事件?OSAL的应用手册有吗?



</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                               
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

Jacktang 发表于 2021-12-5 20:35

<p>部分GPIO并不支持中断但是支持直接唤醒,这个应该在数据手册中有说明</p>

Jacktang 发表于 2021-12-5 20:36

<p>例程的库中延时函数就无法使用,库中的这个延时无法使用的原因是什么</p>

tagetage 发表于 2021-12-6 18:56

<p>写的不错,赞一个。</p>

jszszzy 发表于 2021-12-11 22:20

Jacktang 发表于 2021-12-5 20:36
例程的库中延时函数就无法使用,库中的这个延时无法使用的原因是什么

<p>研究不来,很多东西手册根本没说,SDK开发过程比较痛苦</p>
页: [1]
查看完整版本: 安信可PB-02模组评测(3)——PHY62XX GPIO使用指南