本次将对CanMV K230的基础功能外设进行测试体验,主要是体验这块开发板与传统嵌入式开发板(例如STM32)的开发步骤差异。
按键
按键能够给开发板提供外界控制信号,使得开发板能够处理一些特定任务。首先,基于官方例程进行按键功能的体验。官方提供的例程代码为:通过按键控制LED的亮灭,代码
from machine import Pin
from machine import FPIOA
import time
fpioa = FPIOA()
fpioa.set_function(52,FPIOA.GPIO52)
fpioa.set_function(21,FPIOA.GPIO21)
LED=Pin(52,Pin.OUT)
KEY=Pin(21,Pin.IN,Pin.PULL_UP)
state=0
while True:
if KEY.value()==0:
time.sleep_ms(10)
if KEY.value()==0:
state=not state
LED.value(state)
print('KEY')
while not KEY.value():
pass
首先依旧是配置引脚,代码
LED=Pin(52,Pin.OUT)
KEY=Pin(21,Pin.IN,Pin.PULL_UP)
然后使用一个死循环,检测按键状态,如果按下按键就转换LED等的状态。
可以看出注释里写明:#使用not语句而非~语句,因为 ~ 是按位取反,not是布尔值的反转,这里LED的状态是0或1。
针对按键可以进行功能扩展,K230只提供了一个用户按键,有时需要使用按键控制不同的任务,那么就可以使用长按和短按来达到目的。
from machine import Pin, FPIOA
import time
fpioa = FPIOA()
fpioa.set_function(52, FPIOA.GPIO52)
fpioa.set_function(21, FPIOA.GPIO21)
LED = Pin(52, Pin.OUT)
KEY = Pin(21, Pin.IN, Pin.PULL_UP)
DEBOUNCE_DELAY_MS = 50
LONG_PRESS_THRESHOLD_MS = 800
FAST_BLINK_INTERVAL_MS = 100
MODE_OFF = 0
MODE_SOLID_ON = 1
MODE_FAST_BLINK = 2
current_led_mode = MODE_OFF
button_pressed = False
press_start_time = 0
blink_last_toggle_time = 0
led_actual_state = 0
print("程序启动,等待按键操作...")
while True:
raw_key_value = KEY.value()
if raw_key_value == 0:
if not button_pressed:
time.sleep_ms(DEBOUNCE_DELAY_MS)
if KEY.value() == 0:
button_pressed = True
press_start_time = time.ticks_ms()
print("按键按下...")
else:
if button_pressed:
time.sleep_ms(DEBOUNCE_DELAY_MS)
if KEY.value() == 1:
button_pressed = False
press_duration = time.ticks_diff(time.ticks_ms(), press_start_time)
print(f"按键松开,按下时长: {press_duration} ms")
if press_duration >= LONG_PRESS_THRESHOLD_MS:
current_led_mode = MODE_FAST_BLINK
print("检测到长按:LED进入快闪模式")
led_actual_state = 1
LED.value(led_actual_state)
blink_last_toggle_time = time.ticks_ms()
else:
current_led_mode = MODE_SOLID_ON
print("检测到短按:LED进入常亮模式")
if current_led_mode == MODE_SOLID_ON:
LED.value(1)
led_actual_state = 1
elif current_led_mode == MODE_FAST_BLINK:
if time.ticks_diff(time.ticks_ms(), blink_last_toggle_time) >= FAST_BLINK_INTERVAL_MS:
led_actual_state = not led_actual_state
LED.value(led_actual_state)
blink_last_toggle_time = time.ticks_ms()
elif current_led_mode == MODE_OFF:
LED.value(0)
led_actual_state = 0
time.sleep_ms(10)
上图给实现长按、短按的程序代码,实现功能:运行程序后,检测按键状态,长按:LED进入快闪状态;短按:LED进入常亮状态
下图为程序运行结果:

UART实验
UART是嵌入式开发中常用的通信接口和调试工具,所以UART功能对于一块嵌入式开发板至关重要。
首先依旧使用官方例程来体验K230的UART的配置流程。
代码
from machine import UART
from machine import FPIOA
import time
fpioa = FPIOA()
fpioa.set_function(3,FPIOA.UART1_TXD)
fpioa.set_function(4,FPIOA.UART1_RXD)
uart=UART(UART.UART1,115200)
'''
# UART2代码
fpioa.set_function(11,FPIOA.UART2_TXD)
fpioa.set_function(12,FPIOA.UART2_RXD)
uart=UART(UART.UART2,115200) #设置串口号2和波特率
'''
uart.write('Hello 01Studio!')
while True:
text=uart.read(128)
if text != None:
print(text)
time.sleep(0.1)
使用UART1,波特率为115200,连接电脑,使用串口调试助手XCOM,可以看到能够接收到K230发送过来的数据

K230也可以收到电脑调试助手发送的数据:

但我发现:K230接收到的中文不能正确在串行终端正确显示。

其中的原因可能是:串口助手和K230对于中文的编码方式不同,所以为了能够正确在串行终端显示接收的中文,可以对接收到的数据指定编码方式。首先设置电脑串口助手编码方式为:utf-8,程序里面也是用utf-8编码方式。
结果能够正确显示,如下图所示:

核心代码如下:
CHINESE_ENCODING = 'utf-8'
text_bytes = uart.read(128)
decoded_text = text_bytes.decode(CHINESE_ENCODING)
本期主要体验了官方例程中关于KEY和UART的使用,并对相关功能进行拓展。
下一期将针对摄像头、AI模型等功能进行体验,并查看运行AI模型时的开发板功耗。