在mm32f3270为micropython创建Pin模块(3)

本文档详细介绍了如何在MM32F3270微控制器上为MicroPython实现Pin模块,包括`value()`函数的巧妙设计,允许读写GPIO状态,并通过`print()`函数显示Pin对象的名称。作者通过实例展示了如何使用这些功能,并指出用Pin名称初始化引脚的限制,需要以字符串形式传入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在mm32f3270为micropython创建Pin模块(3)

苏勇,2021年8月

Introduction

书接上文,本节继续完成Pin类的其余实例化方法的实现。

value()

value()函数内部调用的是call(),也就是说,在REPL中可以用pin0.value(),也可以用pin0()来返回值,同时,可以通过pin0.value(val)和pin0(val)写入值。

STATIC mp_obj_t machine_pin_obj_call(mp_obj_t self_in, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args)
{
    /* self_in is machine_pin_obj_t. */
    mp_arg_check_num(n_args, n_kw, 0, 1, false);
    machine_pin_obj_t *self = self_in;

    if ( n_args == 0 )
    {
        return MP_OBJ_NEW_SMALL_INT(GPIO_ReadInputDataBit(self->gpio_port, self->gpio_pin) ? 1u: 0u);
    }
    else
    {
        GPIO_WriteBit(self->gpio_port, 1u << self->gpio_pin, mp_obj_is_true(args[0]) ? 1u : 0u);
        return mp_const_none;
    }
}

这里的设计比较巧妙,用传参长度表示了GPIO的数据方向:如果传入参数的长度为0,则说明是读引脚;如果有长度,则读取第一个设定值作为GPIO的输出。

再编一下,下载到板子上试试看。

MicroPython v1.16 on 2021-08-23; MB_F3270 with MM32F3277G7P
>>> from machine import Pin
>>> pin0 = Pin(0, mode=Pin.OUT_PUSHPULL)
>>> pin0.high()
>>> pin0.value(0)
>>> pin0.value(1)
>>> pin0(0)
>>> pin0(1)
>>>

print()

最后再放一个大招,用print()函数打印pin0的时候,出现pin0的名字。 等下还可以试试用名字初始化引脚的功能。

STATIC     void machine_pin_obj_print(const mp_print_t *print, mp_obj_t o, mp_print_kind_t kind)
{
    /* o is the machine_pin_obj_t. */
    (void)kind;
    const machine_pin_obj_t *self = MP_OBJ_TO_PTR(o);
    mp_printf(print, "Pin(%s)", qstr_str(self->name));
}

再编一下,下载到板子上试试看。

MicroPython v1.16 on 2021-08-23; MB_F3270 with MM32F3277G7P
>>> from machine import Pin
>>> pin0 = Pin(0, mode=Pin.OUT_PUSHPULL)
>>> pin0.high()
>>> print(pin0)
Pin(PA1)
>>> print(Pin)
<class 'Pin'>
>>> pin1 = Pin(PA1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name not defined
>>>

看起来打印实例化对象的名字是可以工作了。但是,用名字初始化引脚的功能不通,这是什么鬼?

果然,需要当成字符串传入才能生效:

MicroPython v1.16 on 2021-08-23; MB_F3270 with MM32F3277G7P
>>> from machine import Pin
>>> pin0 = Pin(0, mode=Pin.OUT_PUSHPULL)
>>> pin0.high()
>>> print(pin0)
Pin(PA1)
>>> print(Pin)
<class 'Pin'>
>>> pin1 = Pin(PA2, mode=Pin.OUT_PUSHPULL)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name not defined
>>> pin1 = Pin(PA1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name not defined
>>> pin1 = Pin('PA1')
>>> pin1.low()
>>>

用Pin类实现GPIO的功能基本完成了。

接下来考虑如何把af也加到GPIO中,可以作为一个关键字传入。

END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值