安信可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> <p>部分GPIO并不支持中断但是支持直接唤醒,这个应该在数据手册中有说明</p>
<p>例程的库中延时函数就无法使用,库中的这个延时无法使用的原因是什么</p>
<p>写的不错,赞一个。</p>
Jacktang 发表于 2021-12-5 20:36
例程的库中延时函数就无法使用,库中的这个延时无法使用的原因是什么
<p>研究不来,很多东西手册根本没说,SDK开发过程比较痛苦</p>
页:
[1]