在mm32f3270为micropython创建Pin模块(4)
苏勇,2021年8月
最后,就是为了给Pin初始化的时候增加一个af的关键字
typedef enum
{
...
PIN_INIT_ARG_AF,
} machine_pin_init_arg_t;
STATIC mp_obj_t machine_pin_obj_init_helper (
const machine_pin_obj_t *self, /* machine_pin_obj_t类型的变量,包含硬件信息 */
size_t n_args, /* 位置参数数量 */
const mp_obj_t *pos_args, /* 位置参数清单 */
mp_map_t *kw_args ) /* 关键字参数清单结构体 */
{
static const mp_arg_t allowed_args[] =
{
...
[PIN_INIT_ARG_AF] { MP_QSTR_af , MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0}},
};
...
if (args[PIN_INIT_ARG_MODE].u_int < PIN_MODE_AF_OPENDRAIN)
{
if (args[PIN_INIT_ARG_VALUE].u_obj != MP_OBJ_NULL)
{
if ( mp_obj_is_true(args[PIN_INIT_ARG_VALUE].u_obj) )
{
GPIO_WriteBit(self->gpio_port, 1u << self->gpio_pin, 1u);
}
else
{
GPIO_WriteBit(self->gpio_port, 1u << self->gpio_pin, 0u);
}
}
}
else
{
GPIO_PinAFConfig(self->gpio_port, 1u << self->gpio_pin, args[PIN_INIT_ARG_AF]);
}
return mp_const_none;
}
再编一下,下载到板子上运行。
MicroPython v1.16 on 2021-08-23; MB_F3270 with MM32F3277G7P
>>> from machine import Pin
>>> pin0 = Pin('PA1', mode=Pin.AF_PUSHPULL, af=2)
>>> pin0.init(af=3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: argument num/types mismatch
>>> pin0.init(mode=Pin.AF_PUSHPULL, af=3)
>>> pin0.init(mode=Pin.OUT_PUSHPULL)
>>>
从log中可以看到,“af”关键字已经被识别了。
另外发现一个现象,关键字参数的清单里,可以缺后面的,但不能缺前面的。
后面如果再有心思,可以把pin.irq()函数实现了。如果不愿意,就到此为止吧,基本够用了。
END