视觉开发板—K210自学笔记(三)

本期我们来遵循其他单片机的学习路线开始去做一位点灯大师—点亮一个LED。那么第一步还是先知道K210里面的硬件电路是怎么连接的,需要查看上一节的文档,看看开发板原理图到底是哪个LED跟哪个IO连在一起。

一、硬件电路

根据之前官方提供的assembly drawing资料我们能看到实际的LED的位置,一共有四个

LED,那么我们再来检查一下原理图里的这些灯到底是怎么连接的。

 

DS1很明显没有连接任何IO,所以它是不可控的,就是电源指示灯,只要数据线连接到PC,DS1就会被点亮。DS2和DS则分别被CH552_TX0和ISP_TX两个IO端口控制。

而LED1从命名来看就是自成一派,从原理图分析来看,这是一个RGB的三色灯,原理图写的已经非常详细了,里面核心是三个灯封装在一个器件里,分别被LED_R, LED_G, LED_B三个IO控制。

通过检查K210本身的IO我们看到,LED_R, LED_G, LED_B分别连接到CPU的IO_13, IO_12和IO_14,那么我们可以学习相关的IO编程方法来控制LED灯的亮灭了。

K210比较强大的功能是可以通过内部映射让外部引脚实现不同的功能,我们要学习如何让指定的IO干它能干的事。那么我们就需要学习实现这种映射关系的方法。这个与一般的单片机的学习稍有不同。

二、GPIO的配置

那么我们如何来理解K210的这种引脚映射的[内部功能]呢?K210 芯片上的 外部引脚 和 内部功能 是彼此独立的,引脚是指从芯片上引出的许多金属触点,也就是我们俗称的功能引脚,它可以是 GPIO / PWM / ADC / I2C 等内部功能引脚,传统的认知是引脚对应的内部功能是不可改变的,但可以复用的,而 K210 是可以通过映射来改变引脚功能的,看如下示意图理解具体的映射功能。

首先可以将 I2C 的 SCL/SDA 映射(MAP)到 IO6/IO7 引脚,从而在此引脚上进行 I2C 的读写操作。

    +------------------------------+

    |                              |

    |           +---+              |

<-----+ <-----+ |I2C|              |

 IO6|           +---+              |

    |           |                  |

    |           |   +----+         |

<-----+ <-------+   |UART|         |

 IO7|               +----+         |

    |                              |

    |           +---+              |

<-----+         |SPI|              |

 IO8|           +---+              |

    |                              |

    |             +---+            |

<-----+           |I2S|            |

 IO9|             +---+            |

    |                              |

    |                              |

    +------------------------------+

接着还可以将 SPI 的 SCLK/MOSI/MISO/CS 映射(MAP)到 IO6/IO7/IO8/IO9 引脚,也就可以在此引脚上进行 SPI 的读写操作。

    +------------------------------+

    |                              |

    |               +---+          |

<------<-------<--  |I2C|          |

 IO6|            |  +---+          |

    |            |                 |

    |            |       +----+    |

<------<------+  |       |UART|    |

 IO7|         |  |       +----+    |

    |         +--+-+               |

    |          |SPI|               |

<------<--------+--+               |

 IO8|           |                  |

    |           |                  |

    |           |    +---+         |

<------<--------+    |I2S|         |

 IO9|                +---+         |

    |                              |

    |                              |

    +------------------------------+

调用 register 函数将 pin 引脚与具体的硬件功能(GPIO/I2C/UART/I2S/SPI)绑定起来,在不使用的时候调用 unregister 释放引脚所绑定的硬件功能(或称 function ),这不同于传统单片机的理解, K210 可以将一定范围内的引脚映射到具体的硬件功能。

如下代码所示:

from fpioa_manager import fm

fm.register(11, fm.fpioa.GPIO0, force=True)

fm.register(12, fm.fpioa.GPIOHS0, force=True)

fm.register(13, fm.fpioa.UART2_TX)

fm.register(14, fm.fpioa.UART2_RX)

其中上段程序中的register函数,调用方法如下:

register (pin, func, force=True)#

pin: 功能映射引脚

function : 芯片功能

force: 强制分配,如果为True,则可以多次对同一个引脚注册;False则不允许同一引脚多次注册。默认为True是为了方便IDE多次运行程序使用

设置引脚(pin)对应的外设功能(func),默认启用强制绑定参数(force=True),它将强制更换指定的引脚功能,如果发现存在上一个绑定的引脚,则会发出一个警告,但不影响代码继续执行。

如果设置 force=False ,则会在 register 发现硬件功能已经被使用了,此时就会弹出异常,方便深度开发的时候不清楚 GPIO/HS 的分配情况,常见于运行某个代码的按键在访问某些功能的时候不能使用了的场合。

使用方法:

from fpioa_manager import fm

fm.register(16, fm.fpioa.GPIO2)

fm.register(13, fm.fpioa.GPIO2)

fm.register(12, fm.fpioa.GPIO2, force=False)

此时会出现提示:

[Warning] function is used by fm.fpioa.GPIO2(pin:16)

Traceback (most recent call last):

  File "<stdin>", line 5, in <module>

  File "fpioa_manager.py", line 20, in register

Exception: [Warning] function is used by fm.fpioa.GPIO2(pin:13)

可见提示了 fm.fpioa.GPIO2(pin:16) 和 fm.fpioa.GPIO2(pin:13) 的占用情况。

注意:

以下 GPIOHS 默认已经被使用, 程序中如非必要尽量不要使用,以下引脚已经在 MaxiPy 开机启动时注册,请注意。

GPIOHS

功能

GPIOHS31

LCD_DC

GPIOHS30

LCD_RST

GPIOHS29

SD_CS

GPIOHS28

MIC_LED_CLK

GPIOHS27

MIC_LED_DATA

三、程序开发实战

上一节的例程比较好的配合LCD的使用,如果是没有采购LCD的同学可以尝试学习本节提供的例程—点亮LED。再次强调一下,可能你曾经用过一些单片机,在手册上都规定了引脚和片上外设功能(就是芯片内部集成的外设,比如 GPIO、I2C、SPI 等)的绑定,或者重映射。比如规定了 I2C 只能用 Pin9 和 Pin10,启动了重映射功能后,只能用Pin11和Pin12

但是 MaixPy 所使用的硬件 K210 的片上外设对应的引脚(硬件引脚)是可以任意映射的,相比之下 K210 硬件设计和软件设计的自由度更大。 比如 I2C 可以使用 Pin11 和 Pin12,也可以改成其它任意引脚。注意要区分 GPIO  IO的区别, IO也可以叫Pin 也就是引脚,是芯片引出来的硬件引脚, GPIO是一种外设,可以控制这些Pin/IO 的外设。两者可以有一种方法映射,就像一道桥一样连接他们。因为有了这个强大的映射功能, 所以在使用引脚时,需要增加一步映射的步骤:

from fpioa_manager import fm    # 导入库

fm.register(28, fm.fpioa.GPIO0)

这里我们将引脚 28 映射为了 GPIO0 的功能, 执行了这句命令后,引脚28和GPIO0就映射(绑定)好了,要取消映射(解绑),则需要调用fm.unregister函数,如fm.unregister(28)可取消引脚28的绑定。

另外,Pin 和 外设只能唯一对应, 不能一对多,需要对同一个外设或者引脚重复映射,否则程序可能产生难以发现的错误(BUG)

接下来我们就要开始控制 LED 需要使用到 GPIO。board_info 与板卡相关,不同板卡配置不同,使用前需要手动配置。

程序如下:

from fpioa_manager import fm
from Maix import GPIOio_led_red = 13
fm.register(io_led_red, fm.fpioa.GPIO0)led_r=GPIO(GPIO.GPIO0, GPIO.OUT)
led_r.value(0)

按照前面运行代码的方法在终端里面运行代码, 会发现 LED 灯的红色被点亮了!

接下来我们分析代码:

从 fpioa_manager 包导入fm 对象,主要用于引脚和外设的映射

从包 Maix 导入了 GPIO 这个类, GPIO 外设相关操作

定义一个变量io_led_red,值为13,即Pin13/IO13, 具体 LED 的引脚连接到了芯片的哪个引脚,请在前面的硬件介绍中看原理图

使用fm(fpioa manager 的缩写)这个内置的对象来注册芯片的外设和引脚的对应关系, 这里 fm.fpioa.GPIO0 是K210的一个 GPIO 外设(注意区分 GPIO(外设) 和引脚(实实在在的硬件引脚)的区别 ),所以把 fm.fpioa.GPIO0 注册到了引脚 IO13;

然后定义一个 GPIO 对象led_r,使用 led_r.value(1) 或者 led_r.value(0) 来设置高低电平即可, 因为这里设置了低电平,根据上面的原理图可知低电平导通,LED灯亮。到这里已经可以点灯了,现在可以自己尝试用 for 循环来实现 LED 闪烁或者流水灯~做出不同的变换效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2778319.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Redis进阶(二):事务

redis事务特点 弱化的原子性 redis事务的原子性不像MySQL原子性一样&#xff0c;执行不成功的话&#xff0c;redis事务不会进行回滚操作 不具备一致性 redis没有约束&#xff0c;也没有回滚机制&#xff0c;因此事务执行的过程中如果某个修改操作出现失败&#xff0c;就可能引起…

【【C++类与对象(下)】】

1. 再谈构造函数 构造函数体赋值 在创建对象时&#xff0c;编译器会通过调用构造函数&#xff0c;给对象中的各个成员变量一个合适的初始值&#xff1a; class Date { public:// 构造函数Date(int year 0, int month 1, int day 1){_year year;_month month;_day day;}…

基于SpringBoot+Vue的服装销售商城系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

UUID算法:独一无二的标识符解决方案

引言 在分布式系统和大数据环境下&#xff0c;唯一标识符的生成和管理是一项关键任务。UUID&#xff08;Universally Unique Identifier&#xff09;算法应运而生&#xff0c;成为了解决重复数据和标识符冲突的有效工具。本文将探讨UUID算法的优势和劣势&#xff0c;分析其在分…

数据可视化之维恩图 Venn diagram

文章目录 一、前言二、主要内容三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 维恩图&#xff08;Venn diagram&#xff09;&#xff0c;也叫文氏图或韦恩图&#xff0c;是一种关系型图表&#xff0c;用于显示元素集合之间的重叠区…

『运维备忘录』之 Find 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等只是&#xff0c;甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作&#xff0c;持续给大家更新运维工作所需要接触到的知识点&#xff0c;希望大…

算法学习——LeetCode力扣双指针篇

算法学习——LeetCode力扣双指针篇1 27. 移除元素 27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#…

159基于matlab的基于密度的噪声应用空间聚类(DBSCAN)算法对点进行聚类

基于matlab的基于密度的噪声应用空间聚类(DBSCAN)算法对点进行聚类&#xff0c;聚类结果效果好&#xff0c;DBSCAN不要求我们指定集群的数量&#xff0c;避免了异常值&#xff0c;并且在任意形状和大小的集群中工作得非常好。它没有质心&#xff0c;聚类簇是通过将相邻的点连接…

Prompt Engineering实战-构建“哄哄模拟器”

目录 一 背景 二 “哄哄模拟器”的Prompt Prompt 的典型构成 三 操作步骤 3.1 创建对话 3.2 游戏测试 一 背景 前几天《AI 大模型全栈工程师》第二节课讲了“Prompt Engineering&#xff0c;提示工程”&#xff0c;里面提到一些prompt相关的技巧&#xff0c;原则&#xf…

点云——噪声(代码)

本人硕士期间研究的方向就是三维目标点云跟踪&#xff0c;对点云和跟踪有着较为深入的理解&#xff0c;但一直忙于实习未进行梳理&#xff0c;今天趁着在家休息对点云的噪声进行梳理&#xff0c;因为预处理对于点云项目是至关重要的&#xff0c;所有代码都是近期重新复现过。 这…

C++ vector用法

目录 1. vector&#xff1a; 1.1 vector 说明 1.2 vector初始化&#xff1a; 方式1. 方式2. ​编辑方式3. 方式4. 方式5. 1.3 vector对象的常用内置函数使用&#xff08;举例说明&#xff09; pop_back&#xff08;&#xff09; 2. 顺序访问vector的几种方式&#x…

hook函数——useRef

useRef useRef 是一个 React Hook&#xff0c;它能帮助引用一个不需要渲染的值。也就是说useRef可以存储一个值&#xff0c;但是不被组件渲染&#xff0c;仅仅只是引用&#xff0c;主要包括两个方面&#xff0c;例如使用ref引用一个值&#xff0c;使用ref引用一个dom节点&…

前端工程化面试题 | 01.精选前端工程化高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

动态规划的一个初步学习

啥叫动态规划 在我们写很多的题目时&#xff0c;常常可以用暴力枚举来写&#xff0c;缺点就是速度太慢了。如果我们用一个数组或者哈希表&#xff08;虽然我还没学过哈希表&#xff09;将之前暴力枚举的数据储存起来&#xff0c;当再一次枚举到这个数字的时候就直接调用数组或…

【深蓝学院】移动机器人运动规划--第4章 动力学约束下的运动规划--笔记

0. Outline 1. Introduction 什么是kinodynamic&#xff1f; 运动学&#xff08;Kinematics&#xff09;和动力学&#xff08;Dynamics&#xff09;都是力学的分支&#xff0c;涉及物体的运动&#xff0c;但它们研究的焦点不同。 运动学专注于描述物体的运动&#xff0c;而…

【蓝桥杯冲冲冲】k 短路 / [SDOI2010] 魔法猪学院

蓝桥杯备赛 | 洛谷做题打卡day33 文章目录 蓝桥杯备赛 | 洛谷做题打卡day33题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示数据规模数据更新日志 题解代码我的一些话 【模板】k 短路 / [SDOI2010] 魔法猪学院 题目背景 注&#xff1a;对于 k k k 短路问…

mysql学习笔记-MYSQL介绍

什么是Mysql MySQL目前属于Oracle公司&#xff0c;常见的关系型数据库还有:sql server &#xff0c;MarlaDB,DB2等MYSQL区别于其它关系型数据库的很大一个特点是支持插件式的存储引擎支持如&#xff1a;innoDB&#xff0c;MyLSAM&#xff0c;Memory等MySQL是一种DBMS&#xff…

微信小程序(四十)API的封装与调用

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.在单独的js文件中写js接口 2.以注册为全局wx的方式调用接口 源码&#xff1a; utils/testAPI.js const testAPI{/*** * param {*} title */simpleToast(title提示){//可传参&#xff0c;默认为‘提示’wx.sho…

2024春晚刘谦魔术与约瑟夫环问题

各位小伙伴们大家——过~年~好~~&#xff01;[]~(&#xffe3;▽&#xffe3;)~* 昨晚播出了2024春节联欢晚会&#xff0c;本着在乡下无聊也是无聊不如看看今年春晚有没有什么乐子的心态从晚上20点到次日0点40共4个多小时的时间在人生中首次看完了一整场春晚直播 (((φ(◎ロ◎…

Mysql索引优化建议

1&#xff0c;最左前缀法则 如果为一张表创建了多列的组合索引&#xff0c;要遵守最左前缀法则。就是指查询从索引的最左前列开始并且不要跳过索引中的列。&#xff08;因为Mysql的InnoDB引擎的索引树是一个按顺利排序存储的数据结构&#xff08;BTREE&#xff09;&#xff0c…