本篇讲述可开发板基本外设功能如按键、定时器、ADC、UART和线程与文件读写的基础功能体验。
一.硬件原理
这部分功能硬件上主要在开发板扇出引脚和已经有的硬件接口。
按键原理如下,可以看到是低电平触发:
K230内部包含一个ADC硬件模块,有6个通道,采样分辨率为12bit(0-4095),采样速率为1M。开发板引出0~3共4个通道。其中通道0、1量程为0-3.6V,通道2、3量程为0-1.8V。这里使用可调电阻100K,使用通道0,排针的32脚,电压使用3.3V,在通道量程耐受范围内。接好后硬件如下:
CanMV K230系统内置了文件系统,上电后可看到CanMV盘符。打开后可以看到里面又有2个盘符,分别是sdcard和data。这里文件读写在sdcard下
K230内部包含五个UART硬件模块,其中UART0被小核终端占用,UART3被大核终端占用,剩余UART1,UART2,UART4。K230开发板通过排针引出了UART1和UART2共2个UART供用户使用。UART1 TX1(GPIO3), RX1(GPIO4);UART2:TX2(GPIO11), RX2(GPIO12)。这里使用带有端子的UART2。
当我们需要分时完成不同任务时候,线程编程就派上用场了。这有点像RTOS(实时操作系统)。下面代码包含有编程实现多线程同时运行任务。
二.程序代码准备
程序实现按键控灯取反,定时器5s间隔回调,串口2打印与接收,线程调度,文件读写。代码如下
'''
#1.按键.通过按键改变LED的亮灭状态
#2.ADC(电压测量).ADC共4个通道,其中通道0、1实际量程为0-3.6V,通道2、3量程为0-1.8V。(请勿超出测量量程,可能导致主控芯片烧坏!)
#3.定时器. 5s间隔
#4.多线程使用.5s调度
#5.文件读写
'''
from machine import Pin
from machine import FPIOA
#导入串口模块
from machine import UART
#导入定时器模块
from machine import Timer
#导入adc模块
from machine import ADC
#导入线程模块
import _thread
import time
Counter = 0
adc_cnt =0
def timer_fun(tim):
global Counter
Counter = Counter + 1
print(Counter)
#将GPIO52、GPIO21配置为普通GPIO模式
fpioa = FPIOA()
fpioa.set_function(52,FPIOA.GPIO52)
fpioa.set_function(21,FPIOA.GPIO21)
LED=Pin(52,Pin.OUT) #构建LED对象,开始熄灭
KEY=Pin(21,Pin.IN,Pin.PULL_UP) #构建KEY对象
state=0 #LED引脚状态
#使用软件定时器,编号-1
tim = Timer(-1)
tim.init(period=5000, mode=Timer.PERIODIC,callback=timer_fun) #周期为5000ms
'''
# UART1代码
fpioa.set_function(3,FPIOA.UART1_TXD)
fpioa.set_function(4,FPIOA.UART1_RXD)
uart=UART(UART.UART1,115200) #设置串口号1和波特率
'''
# UART2代码
fpioa.set_function(11,FPIOA.UART2_TXD)
fpioa.set_function(12,FPIOA.UART2_RXD)
uart=UART(UART.UART2,115200) #设置串口号2和波特率
uart.write('Hello EEWord & 01Studio. \r\nWelcome to Use K230 Board!\r\n')#发送一条数据
#线程函数
def func(name):
while True:
print("hello {}".format(name))
time.sleep(5)
_thread.start_new_thread(func,("EEWord",)) #开启线程1,参数必须是元组
_thread.start_new_thread(func,("K230",)) #开启线程2,参数必须是元组
'''文件读写,先写再读'''
#写文件
f = open('/sdcard/1.txt', 'w') #以写的方式打开一个文件,没有该文件就自动新建
f.write('Today is a Good Day\r\n') #写入数据
f.write('2025年,你好\r\n') #写入数据
f.close() #每次操作完记得关闭文件
# 读文件
f = open('/sdcard/1.txt', 'r') #以读方式打开一个文件
text = f.read()
print(text) #读取数据并在终端打印
f.close() #每次操作完记得关闭文件
adc = ADC(0) #通道0
while True:
'''按键控制灯亮/灭'''
if KEY.value()==0: #按键被按下
time.sleep_ms(10) #消除抖动
if KEY.value()==0: #确认按键被按下
state=not state #使用not语句而非~语句
LED.value(state) #LED状态翻转
print('KEY')
while not KEY.value(): #检测按键是否松开
pass
'''串口接收数据并原样输出打印'''
text=uart.read(128) #接收128个字符
if text != None:
print(text) #通过REPL打印串口3接收的数据
adc_cnt+=1
if adc_cnt==10:
adc_cnt=0;
print(adc.read_u16()) # 获取ADC通道采样值
# 获取ADC通道电压值,保留2为小数。通道0、1实际量程为0-3.6V,返回值x2。
print('%.2f'%(adc.read_uv()/1000000*2), "V")
time.sleep(0.1) #100ms
三.调试测验
运行可看到UART2串口输出,文件读写,按按键可以看到LED灯亮/灭,调可调电阻采集电压有变化,定时器计数,线程运行。日志如下
视频如下
基础功能视频
至此,选择的基础功能调试测验完成,得出相应结果/效果,后面继续探索。
|