常见问题汇总
配置、编译
Q: 1.在menuconfig中,配置好adc类后,开发板上电报错如下:
A: 错误提示“No adc similar devices found!”,说明开发板上没有adc设备,而microPython却要使用该设备,触发oneOS操作系统断言。应该在使用microPython的某个device模块\machine模块的设备类前,先查硬件原理图,看该开发板的是否支持。
Q: 2.在menuconfig中,配置好wdt类后,开发板上电成功,但是报错如下:
A: 配置问题。上电成功,说明开发板有看门狗设备,因此错误提示“ Find device: wdg failed”则说明设备名字不对。在配置时,如果遇到类似wdt这类需要确认设备名字的,请先在已上电的设备上,命令行输入"device",查看设备名,如图:
“iwdg”才为此开发板的看门狗设备名。 此外类似:uart\spi等由“前缀”+“数字”组成的设备名,可以只输入前缀,如UART配置时,可以只输入“uart”,在实例化对象时如“uart = UART(6)”,再输入数字"6", 即可实例化出uart设备“uart6”的对象,后续操作“uart”既是在操作设备“uart6”。
Q: 3.如何上传py脚本文件到开发板?如何执行脚本文件? A: 目前支持通过SD\TF卡的方式,在开发板上加载、运行python脚本文件。因此需要先确认设备是否支持插SD\TF卡,是否支持fatFS,如果都支持,则在menuconfig中开启配置, 完整步骤如下: 1.先确认挂载文件系统的块设备名,如本answer中的,“sd0”:
2.在menuconfig中,microPython配置项里,选中“(Top) → Thirdparty → MicroPython → Enable MicroPyth→ Micropython components libs”的“ Mount file system to sd card or internal flash”项,输入第一步中得到的block device 名“sd0”:
3.在menuconfig中,components配置项“(Top) → Components→ FileSystemo”,查看fatFS是否选中,否,则选中即可:
4.在menuconfig中,drivers配置项“(Top) → Components→ FileSystemo”,查看SPI是否选中,否,则选中即可, 注:有的设备可能是通过SDIO方式去操作SD\TF卡,此处驱动的操作视具体开发板、操作系统而定:
5.上电后,文件系统会挂载在根目录“/”,看到如下信息则说明挂载成功。 可以通过shell命令“mpy xxxx.py”执行脚本,其中xxxx.py为将用执行的python脚本。
库使用
本章节主要介绍特定库中device、machine模块,标准库问题请参看开源社区:http://docs.micropython.org/en/latest/index.html Q: 1.标准库中的utime模块,睡眠时间怎么计算? A: utime模块所有方法的时间单位均和开源社区版本(http://docs.micropython.org/en/latest/library/utime.html)一致。
Q: 2.特定库中的machine模块下的timer类,定时时间怎么计算? A: timer类中的时间单位是操作系统时钟tick。当前1 tick对应的时间可以通过类方法Timer.tick_per_second()获取到,oneOS2.0中,1 tick默认10ms。
Q: 3.ADC\DAC设备都有channel范围,而特定库中的machine模块下的ADC\DCA类,channel参数为何可以随意输入? A: channel参数的检查在oneOS驱动层做,在类对象方法的init([channel])和read/write([channel])中,channel都是透传,如果channel不合法,会在read/write的结果中报错。
Q: 4.特定库中的machine模块下的can设备类如何使用,默认模式是什么? A: 支持can设备的两种模式,mode默认为正常模式,can.read()方法是阻塞式读取can设备上的输入,can.write(msg)方法中,需要注意消息格式,为严格的can总线数据格式:4字节'id'+1字节'ide'+1字节'rtr'+1字节'len'+'len'字节数据'data',can.read()方法的返回值是json格式数据,如{'id': '00000068', ‘ide’: 0, 'rtr': 0, 'value': '1234'}。
Q: 5.stm32开发板上,如何通过machine模块的Pin类,获取到如GPIO号'PB0'对应Pin脚索引? A: 可以使用Pin.index('Pin组名', 'Pin组num'),如获取'PB0',则使用Pin.index('B', 0), 则获取输出:16,即为PB0对应的Pin脚索引。该函数为Pin类方法,不需要实例化Pin对象后再使用。
Q: 6.machine模块的PWM类,在实例化对象后,为何不可使用:如pwm = PWM(4,1,1000, 50),报设备未打开的错误? A: machine模块和device模块的各类库,在使用构造函数实例化一个具体的设备对象后,此时只是在microPython中创建出与硬件对应的python对象,此时硬件是未打开状态,还需要使用obj.init([param]),设备初始化方法来打开设备,obj即构造函数实例化的对象,init即其初始化方法,每个类都有自己的init方法,详情请参考第三章节中的类使用指导。
Q: 7.machine模块的UART类,在调用uart.read([size])方法读取串口数据时,会阻塞一段时间? A: 因为UART对象的read([size])方法读取数据,如不传可选参数size,则使用的是底层uart驱动中的阻塞方法,超时时间是20秒,此设计的目的是完整读取uart串口数据,尽量不遗漏输入数据,因为microPython不知道串口中有多少数据。如果传入了size且size比串口中的数据少,或者使用readline()、readchar(),则是用的非阻塞方式。read出来的数据,尾部会填充'\r\n'。