dfjs 发表于 2024-10-13 16:15

嘉楠K230 AI开发板测评2--GPIO、LED、按键、定时器

<div>
<ol>
        <li><strong>GPIO介绍</strong><br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;K230开发板总共引出了46个引脚,有常见的通用GPIO口、4路PWM、2路串口、1路SPI、I2C、I2S和4路的ADC,提供5V和3.3V的电源输出引脚对外供电,用常见的type-c引脚对开发板供电,方便简洁,GPIO引脚图如图1所示。<br />
        <br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图 1 K230 GPIO引脚图</li>
        <li><strong>点亮第一个LED</strong><br />
        &nbsp; &nbsp; &nbsp; CanMV K230有一个与GPIO直接连接的可控制LED蓝灯,其连接到GPIO52,其原理图如图2所示,从电路图可以看出,当GPIO口为高电平时,蓝灯被点亮。<br />
        <br />
        &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 图 2 LED灯原理图<br />
        &nbsp; &nbsp; &nbsp; 由于K230功能多,在引脚有限的情况下,会复用引脚功能,通过FPIO库(也叫现场可编程IO阵列,库介绍网址<a href="https://developer.canaan-creative.com/k230_canmv/main/zh/api/machine/K230_CanMV_FPIOA%E6%A8%A1%E5%9D%97API%E6%89%8B%E5%86%8C.html">2.8 FPIOA 模块API手册 &mdash; K230 CanMV (canaan-creative.com)</a>)实现对引脚的不同功能的选择。<br />
        &nbsp; &nbsp; &nbsp; 代码编写流程如下:<br />
        <br />
        &nbsp; &nbsp; &nbsp; &nbsp; 首先引入FPIO模块,对GPIO52引脚的功能设置为IO口功能。引入Pin对象设置IO口,通过Pin(id, mode, pull) 设置IO口的引脚,模式与电阻配置,value()设置输出电平。<br />
        &nbsp; &nbsp; &nbsp; &nbsp; 完整代码如下:
        <table border="1">
                <tbody>
                        <tr>
                                <td>&#39;&#39;&#39;<br />
                                实验名称:点亮LED蓝灯<br />
                                版本:v1.0<br />
                                作者:01Studio<br />
                                实验平台:01Studio CanMV K230<br />
                                教程:wiki.01studio.cc<br />
                                &#39;&#39;&#39;<br />
                                from machine import Pin #导入Pin模块<br />
                                from machine import FPIOA<br />
                                import time<br />
                                #将GPIO52配置为普通GPIO<br />
                                fpioa = FPIOA()<br />
                                fpioa.set_function(52,FPIOA.GPIO52)<br />
                                LED=Pin(52,Pin.OUT) #构建led对象,GPIO52,输出<br />
                                LED.value(1) #点亮LED,也可以使用led.on()</td>
                        </tr>
                </tbody>
        </table>
        &nbsp; &nbsp; &nbsp;实验结果如图3所示:<br />
        <br />
        &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 图 3 点亮led灯</li>
        <li><strong>按键</strong><br />
        &nbsp; &nbsp; &nbsp; &nbsp;按键是最常见的输入设备,通过检测按键被按下之后,改变LED灯的亮灭状态。按键对应的IO口引脚原理图如下图4所示,按键的一段接到GPIO21,另一端接到GND,所以按键在没按下的时候输入高电平1,按下的时候输入低电平0。<br />
        <br />
        &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 图 4 按键原理图<br />
        &nbsp; &nbsp; &nbsp; &nbsp; 按键按下时的电平变化如下图5所示,会发生抖动,有可能会造成误判,因此需要延时函数来进行消抖。常见的方法就是当检测到按键值为0时,延时一段时间,大约10ms,再次判断按键引脚至仍然是0,是的话说明按键被按下,延时使用time模块(<a href="https://docs.micropython.org/en/latest/library/time.html#module-time">time &ndash; time related functions &mdash; MicroPython latest documentation</a>)。<br />
        <br />
        &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;图 5 按键一次出现的电平变化<br />
        &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;首先将IO21配置为GPIO功能(使用FPIO模块),需要将按键的GPIO21引脚配置为输入模式(使用pin模块),当K230检测到按键被按下时led灯点亮,松开时led灯熄灭,代码编写流程图如图6所示。<br />
        <br />
        &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 图 6 按键代码流程图<br />
        &nbsp; &nbsp; &nbsp; &nbsp;完整代码如下所示:
        <table border="1">
                <tbody>
                        <tr>
                                <td>&#39;&#39;&#39;<br />
                                实验名称:按键<br />
                                版本:v1.0<br />
                                作者:01Studio<br />
                                实验平台:01Studio CanMV K230<br />
                                说明:通过按键改变LED的亮灭状态<br />
                                &#39;&#39;&#39;<br />
                                from machine import Pin<br />
                                from machine import FPIOA<br />
                                import time<br />
                                #将GPIO52、GPIO21配置为普通GPIO模式<br />
                                fpioa = FPIOA()<br />
                                fpioa.set_function(52,FPIOA.GPIO52)<br />
                                fpioa.set_function(21,FPIOA.GPIO21)<br />
                                LED=Pin(52,Pin.OUT) #构建LED对象,开始熄灭<br />
                                KEY=Pin(21,Pin.IN,Pin.PULL_UP) #构建KEY对象<br />
                                state=0 #LED引脚状态<br />
                                while True:<br />
                                if KEY.value()==0: #按键被按下<br />
                                time.sleep_ms(10) #消除抖动<br />
                                if KEY.value()==0: #确认按键被按下<br />
                                state=not state #使用not语句而非~语句<br />
                                LED.value(state) #LED状态翻转<br />
                                print(&#39;KEY&#39;)<br />
                                while not KEY.value(): #检测按键是否松开<br />
                                pass</td>
                        </tr>
                </tbody>
        </table>
        &nbsp; &nbsp; &nbsp;实验结果如图7所示,当按键KEY每次被按下时,LED灯的亮灭状态发生反转。<br />
        <br />
        &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;图 7 按键控制LED灯结果图</li>
        <li><strong>定时器</strong><br />
        &nbsp; &nbsp; &nbsp; &nbsp;定时器常常用来计时,通过定时器来周期性的执行各种任务。<br />
        &nbsp; &nbsp; &nbsp; 引用machine的Timer模块(<a href="https://developer.canaan-creative.com/k230_canmv/main/zh/api/machine/K230_CanMV_Timer%E6%A8%A1%E5%9D%97API%E6%89%8B%E5%86%8C.html">2.11 Timer 模块API手册 &mdash; K230 CanMV (canaan-creative.com)</a>)用定时器让LED灯周期性每秒闪烁一次。<br />
        &nbsp; &nbsp; &nbsp; 首先构造函数tim = machine.Timer(id),接着初始化tim.init(mode, freq, period, callback)就可以轻松调用定时器模块。<br />
        &nbsp; &nbsp; &nbsp; 代码编写流程如图8所示,定时器到达预定设计时间后,产生中断,跟外部中断的编程方式类似。<br />
        <br />
        &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 图 8 定时器调用代码流程图<br />
        &nbsp; &nbsp; &nbsp;完整代码如下:
        <table border="1">
                <tbody>
                        <tr>
                                <td>&#39;&#39;&#39;<br />
                                实验名称:定时器<br />
                                版本:v1.0<br />
                                作者:01Studio<br />
                                实验平台:01Studio CanMV K230<br />
                                说明:通过定时器让LED周期性每秒闪烁1次。<br />
                                &#39;&#39;&#39;<br />
                                from machine import Pin,Timer<br />
                                import time<br />
                                led=Pin(52,Pin.OUT)<br />
                                Counter = 0<br />
                                Fun_Num = 0<br />
                                def fun(tim):<br />
                                global Counter<br />
                                Counter = Counter + 1<br />
                                print(Counter)<br />
                                led.value(Counter%2)<br />
                                #使用软件定时器,编号-1<br />
                                tim = Timer(-1)<br />
                                tim.init(period=1000, mode=Timer.PERIODIC,callback=fun) #周期为1000ms<br />
                                while True:<br />
                                time.sleep(0.01) #避免CPU满跑</td>
                        </tr>
                </tbody>
        </table>
        &nbsp; &nbsp; 实验结果:可以看到LED灯每隔一秒闪烁一次</li>
</ol>
</div>

<p><!--importdoc--></p>
页: [1]
查看完整版本: 嘉楠K230 AI开发板测评2--GPIO、LED、按键、定时器