打印
[APM32F4]

APM32F407移植python虚拟机PikaPython(二)——点灯

[复制链接]
368|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hexbei|  楼主 | 2024-4-29 18:57 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hexbei 于 2024-4-29 18:56 编辑

上一篇:APM32F407 移植 python 虚拟机 PikaPython(一)

上一篇我们介绍了如何移植 PikaPython 到 APM32F407VG 开发板,并且通过串口命令行运行 python 交互解释器。

虽然可以在解释器里面运行各种 python 代码,但如果只能通过命令行输出一些结果的话,好像用处不大。有没有方法可以通过 PikaPython 控制单片机的外设,比如嵌入式领域的hello world,也就是简单点个 led 灯呢?

答案是肯定的。PikaPython 已经深度集成到 RT-Thread 系统当中,可以很方便地调用 RT-Thread 的一些常用模块。

这一篇我们就来介绍,如何用 PikaPython 点 APM32F407VG 开发板的 led 灯。



这里使用的开发板是极海 APM32F407VG MINI Board,在极海官网上可以找到相关资料(https://www.geehy.com/design/hardware_detail/26#document)




1. 开发板上有两个LED灯,查看原理图可以得知对应引脚是 PE6 和 PE5,低电平导通。




2. 大家都知道,python 有两种运行方式,一种是通过命令行交互,另一种是运行事先写好的脚本。在 PikaPython 里面,同样可以用第二种方法,让代码编译到工程里面,这样就不用每次都在解释器输入代码了。

PikaPython 的主模块源文件在路径 `packages\pikascript-latest\main.py`​。每次 PikaPython 初始化时,主模块的代码都会被执行。

一般 PikaPython 的初始化是在第一次通过命令进入解释器的时候,但也可以修改 RT-Thread Studio 的设置,使 PikaPython 随 RT-Thread 初始化运行。如图打开开关即可。



3. 修改 main.py 的代码如下:

import PikaStdLib
import pikaRTThread
import PikaStdDevice

thread = pikaRTThread.Thread()
mem = PikaStdLib.MemChecker()
led2 = PikaStdDevice.GPIO()
led3 = PikaStdDevice.GPIO()

led2.setPin('PE.6')
led2.setMode('out')
led2.enable()

led3.setPin('PE.5')
led3.setMode('out')
led3.enable()

for i in range(0, 3):
    print('hello PikaScript!')

    led2.high()
    led3.low()
    thread.mdelay(500)

    led2.low()
    led3.high()
    thread.mdelay(500)

print('mem use max:')
mem.max()

其中添加了 PikaStdDevice 模块,并实例化里面的 GPIO 类得到两个变量 led2 和 led3。之后调用相关方法,指定对应的 led 引脚并初始化输出模式。然后在 for 循环里面,通过调用 high() 和 low() 方法,切换两个引脚的高低电平。

这里可能会有个疑问,`led2.setPin('PE.6')`​ 的参数 'PE.6' 是怎么来的呢?实际上这个方法相当于调用了 RT-Thread 的 rt_pin_get 函数,而这个函数在极海的驱动文件 `drivers\drv_gpio.c`​ 里面注册如下:

static rt_base_t apm32_pin_get(const char *name)
{
    rt_base_t pin = 0;
    int hw_port_num, hw_pin_num = 0;
    int i, name_len;

    name_len = rt_strlen(name);

    if ((name_len < 4) || (name_len >= 6))
    {
        return -RT_EINVAL;
    }
    if ((name[0] != 'P') || (name[2] != '.'))
    {
        return -RT_EINVAL;
    }

    if ((name[1] >= 'A') && (name[1] <= 'Z'))
    {
        hw_port_num = (int)(name[1] - 'A');
    }
    else
    {
        return -RT_EINVAL;
    }

    for (i = 3; i < name_len; i++)
    {
        hw_pin_num *= 10;
        hw_pin_num += name[i] - '0';
    }

    pin = PIN_NUM(hw_port_num, hw_pin_num);

    return pin;
}

所以可以看出来,引脚的命名规则是 PX.XX 的形式。不同厂商 bsp 的命名规则可能不一致,要注意一下。


4. 为了编译 main.py,需要在编译工程前,先同步 scons 配置。如图在 RT-Thread Studio 里操作:



RT-Thread Studio 的控制台输出如下,main.py 已经被编译了。




5. 最后编译 RT-Thread Studio 工程,下载代码,在串口终端运行 pika(如果配置了第 2 步的自动运行,就不用手动输入命令了)





观察串口终端输出和开发板的两个 led,可以看到串口在打印 “hello PikaScript!” 的同时,led 都会交替闪烁一次。调试成功



以上就是在 APM32F407VG 开发板上用 PikaPython 点灯的步骤。既然 PikaPython 可以调用 RT-Thread 的 PIN 设备来操作引脚,那么操作其他外设,甚至自定义的外设可不可以呢?下一篇就讲下如何在 PikaPython 中调用自己编写的 C 语言模块。


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

21

帖子

2

粉丝