dirty 发表于 2025-1-21 14:01

【嘉楠K230开发板】基础功能汇总调测

<p>&nbsp; &nbsp; &nbsp; 本篇讲述可开发板基本外设功能如按键、定时器、ADC、UART和线程与文件读写的基础功能体验。</p>

<p><strong><span style="color:#0000ff;">一.硬件原理</span></strong></p>

<p>&nbsp; &nbsp; &nbsp; 这部分功能硬件上主要在开发板扇出引脚和已经有的硬件接口。</p>

<div style="text-align: center;"></div>

<p>&nbsp; &nbsp; &nbsp; 按键原理如下,可以看到是低电平触发:</p>

<div style="text-align: center;"></div>

<p>&nbsp; &nbsp; &nbsp; 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,在通道量程耐受范围内。接好后硬件如下:</p>

<div style="text-align: center;"></div>

<p>&nbsp; &nbsp; &nbsp; CanMV K230系统内置了文件系统,上电后可看到CanMV盘符。打开后可以看到里面又有2个盘符,分别是sdcard和data。这里文件读写在sdcard下</p>

<div style="text-align: center;"></div>

<p>&nbsp; &nbsp; &nbsp; K230内部包含五个UART硬件模块,其中UART0被小核终端占用,UART3被大核终端占用,剩余UART1,UART2,UART4。K230开发板通过排针引出了UART1和UART2共2个UART供用户使用。UART1&nbsp;TX1(GPIO3), RX1(GPIO4);UART2:TX2(GPIO11), RX2(GPIO12)。这里使用带有端子的UART2。</p>

<p>&nbsp;</p>

<p>&nbsp; &nbsp; &nbsp; 当我们需要分时完成不同任务时候,线程编程就派上用场了。这有点像RTOS(实时操作系统)。下面代码包含有编程实现多线程同时运行任务。</p>

<p>&nbsp;</p>

<p><strong><span style="color:#0000ff;">二.程序代码准备</span></strong></p>

<p>&nbsp; &nbsp; &nbsp; 程序实现按键控灯取反,定时器5s间隔回调,串口2打印与接收,线程调度,文件读写。代码如下</p>

<pre>
<code>'''
#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 &amp; 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




</code></pre>

<p>&nbsp;</p>

<p><strong><span style="color:#0000ff;">三.调试测验</span></strong></p>

<p>&nbsp; &nbsp; &nbsp; 运行可看到UART2串口输出,文件读写,按按键可以看到LED灯亮/灭,调可调电阻采集电压有变化,定时器计数,线程运行。日志如下</p>

<div style="text-align: center;"></div>

<div style="text-align: center;">
<div style="text-align: center;"></div>

<p>&nbsp;</p>
</div>

<p>视频如下</p>

<p>c2dafe3580296e8df5ca7663ffd1c40d</p>

<p>&nbsp;</p>

<p>&nbsp; &nbsp; &nbsp; 至此,选择的基础功能调试测验完成,得出相应结果/效果,后面继续探索。</p>

Jacktang 发表于 2025-1-22 07:35

<p>线程编程还是很有用的</p>

dirty 发表于 2025-1-22 09:26

Jacktang 发表于 2025-1-22 07:35
线程编程还是很有用的

<p>是的,在API里回调函数实现线程功能</p>
页: [1]
查看完整版本: 【嘉楠K230开发板】基础功能汇总调测