本帖最后由 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 语言模块。
|