在使用第三方库的时候通常要使用到引脚号,比如那个i2c吧,就用到引脚编号了,那个号码到底是什么鬼呢?这个文件适合你了。高手都喜欢说,看代码。对于我等低手,我们就用能用的函数,把它打印出来就得了。高级货本文不说,就用基本的方法把它查出来。
当然,如果你够用心,会发现这个gpio中的代码也是有bug的。
drv_gpio.c中有这么个玩样。哎,不是说不看代码吗?好吧,跳过,想看的看一下
struct port_info
{
uint8_t start_pin;//这个是sub_index,PAPB等口的首位编号多数情况是0
uint8_t delta_pin;//这个是sub_nums,PAPB等口的总脚数
uint8_t total_pin;//从后面表中可以看出,是前面列出脚的总个数,即本行起始占位
};
/* It needs to be adjusted to the hardware. /
static const struct port_info port_table[] =
{
{0, 8, 0}, / PA0-PA7 /
{0, 5, 8}, / PB0-PB5 /
{0, 8, 13}, / PE0-PE7 /
{0, 6, 21}, / PF0-PF6 */
};
不管它了,有个函数在mian的示列里面就有,那就是很喜欢用的 rt_pin_get(),咱们啥也不知道,就知道这个是用来得到引脚号的,输入的参数是字符串”PA.1”这种玩样。
那就把它打出来就好了嘛,不废话了,直接复制,里面有个p的验证比较重要,不然会卡死
#include <rtthread.h>
#include "board.h"
static int gpio_num(int argc, char **argv)
{
int result = 0;
char name[6] = {0};
char i;
char len;
if (argc != 2)
{
result = -RT_ERROR;
goto _exit;
}
len = rt_strlen(argv[1]);
if(len >= 6)
{
goto _exit;
}
rt_memcpy(name,argv[1],len);
for(i=0;i<len;i++)//字母搞成大写,其实前面2个就可以,PA PB PE PF
{
if(name[i] >= 'a')
{
name[i] -= 32;
}
}
if(name[0] != 'P')
{
goto _exit;
}
if(!((name[1] == 'A')||(name[1] == 'B')||(name[1] == 'E')||(name[1] == 'F')))
{
goto _exit;
}
result = rt_pin_get(name);
if (result >= 0)
{
rt_kprintf("[%s] : %d\n",name,result);
return RT_EOK;
}
_exit: rt_kprintf("Usage: gpio_num PA.1 , only PA0-PA7,PB0-PB5,PE0-PE7,PF0-PF6\n");
return result;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(gpio_num, printf gpio numbers);
gpio查找的bug出现在这里,没有啥子好讲的,低层是做加减法得到的序号,并没有做限制造成的,使用的时候小心一点就可。当然,可以自己写一个全部打印的函数,都是顺着来的。

原作者:wlof
|