当前位置: 首页 > news >正文

AI嵌入式K210项目(4)-FPIOA

文章目录

  • 前言
  • 一、FPIOA是什么?
  • 二、FPIOA代码分析
  • 总结


前言

磨刀不误砍柴工,在正式开始学习之前,我们先来了解下K210自带的FPIOA,这个概念可能与我们之前学习STM32有很多不同,STM32每个引脚都有特定的功能,我们只需要对引脚进行配置后使用即可(配置其寄存器,进行输入/输出/上拉/下拉等)。使用FPIOA(现场可编程 IO 阵列),可能需要我们先从思维模式上做个转变,下面我们一起来看看吧;


一、FPIOA是什么?

引用下官方文档的说法:FPIOA(现场可编程 IO 阵列)允许用户将 255 个内部功能映射到芯片外围的 48 个自由 IO 上。
这个功能可以说的神秘点叫:硬件软件功能绑定,接口映射。简单的理解:其实这东西有点像STM32或者其他芯片上的引脚复用(因为复用这东西我们熟悉),即一个引脚有多个功能可以选择;只不过这48个IO口的可复用功能更多,有255个功能可选;有没有理解?如果没有理解,我们来追踪下FPIOA的代码实现瞅瞅!开源真好,哈哈哈哈。

二、FPIOA代码分析

对应的头文件 fpioa.h
总共为用户提供以下接口

• fpioa_set_function  //设置 IO0-IO47 管脚复用功能
• fpioa_get_io_by_function //根据功能号获取 IO 管脚号
• fpioa_set_io   //设置 IO 管脚的配置
• fpioa_get_io   //获得 IO 管脚的配置
• fpioa_set_tie_enable   //使能或禁用 FPIOA 功能输入信号的强制输入电平功能
• fpioa_set_tie_value   //设置 FPIOA 功能输入信号的强制输入电平高或者低,仅在强制输入电平功能启用时生效
• fpioa_set_io_pull    //设置 IO 的上拉下拉
• fpioa_get_io_pull  //获取 IO 管脚上下拉值
• fpioa_set_io_driving  //设置 IO 管脚的驱动能力
• fpioa_get_io_driving   //获取驱动能力

我们分析的话要从fpioa_set_function这个开始,一起看着代码;下方代码调用fpioa_set_function ,传入两个参数,一个是硬件IO的索引号,另外一个是要绑定的功能的索引,其中FUNC_GPIO1是固件中预定义好的功能索引号,可以查看fpioa.h文件

/*****************************HEAR-FILE************************************/
#include "fpioa.h"/*****************************HARDWARE-PIN*********************************/
// 硬件IO口,与原理图对应
#define PIN_RGB_R             (12)
#define PIN_RGB_G             (13)
#define PIN_RGB_B             (14)/*****************************SOFTWARE-GPIO********************************/
// 软件GPIO口,与程序对应
#define RGB_R_GPIONUM          (0)
#define RGB_G_GPIONUM          (1)
#define RGB_B_GPIONUM          (2)/*****************************FUNC-GPIO************************************/
// GPIO口的功能,绑定到硬件IO口
#define FUNC_RGB_R             (FUNC_GPIO0+ RGB_R_GPIONUM)
#define FUNC_RGB_G             (FUNC_GPIO0+ RGB_G_GPIONUM)
#define FUNC_RGB_B             (FUNC_GPIO0+ RGB_B_GPIONUM)void hardware_init(void)
{// fpioa映射fpioa_set_function(PIN_RGB_R, FUNC_RGB_R);fpioa_set_function(PIN_RGB_G, FUNC_RGB_G);fpioa_set_function(PIN_RGB_B, FUNC_RGB_B);}

可能大家在看#define FUNC_RGB_R这类宏定义的时候会很疑惑,那我换个写法大家可能看的更明白。但是我为什么要写成上面的这种FUNC_GPIO0+ RGB_B_GPIONUM形式那?因为做完绑定和初始化后,设置io时候只需要传入其索引号(即RGB_B_GPIONUM),那么使用就会简单些,如下写法只是为了方便大家理解。全量代码可以查看AI嵌入式K210项目(3)-GPIO控制

#define FUNC_RGB_R             (FUNC_GPIO0)
#define FUNC_RGB_G             (FUNC_GPIO1)
#define FUNC_RGB_B             (FUNC_GPIO2)

那么这个索引编号是不是可以无限编下去那?NO,通用IO就8个,在用就只能用高速IO了,下图看看GPIO High speed,这个绑定硬件引脚功能的操作理解了吗?
在这里插入图片描述
下面看看是如何实现的吧,我直接在代码里注释吧,这样你们看起来省事些。

int fpioa_set_function(int number, fpioa_function_t function)
{uint8_t index = 0;/* Check parameters FPIOA_NUM_IO为引脚数量48, FUNC_MAX为支持的功能数256*///检查引脚编号和功能编号是否超出限制if(number < 0 || number >= FPIOA_NUM_IO || function < 0 || function >= FUNC_MAX)return -1;//如果指定引脚number要绑定的功能为FUNC_RESV0,则直接调用fpioa_set_function_raw(number, FUNC_RESV0)if(function == FUNC_RESV0) {fpioa_set_function_raw(number, FUNC_RESV0);return 0;}/* Compare all IO *///如果指定引脚number要绑定的是其他功能,则会遍历所有引脚的功能配置,如果有其他引脚绑定着这个功能,则会将其他引脚的功能设置为FUNC_RESV0for(index = 0; index < FPIOA_NUM_IO; index++){if((fpioa->io[index].ch_sel == function) && (index != number))fpioa_set_function_raw(index, FUNC_RESV0);}//如果上面的情况都不是,那么调用fpioa_set_function_raw(number, function)配置引脚number为指定功能fpioa_set_function_raw(number, function);return 0;
}

可以看到如果不出现异常情况,最终正常处理的流程会调用fpioa_set_function_raw(),一起来看看这个函数的实现吧。

int fpioa_set_function_raw(int number, fpioa_function_t function)
{/* Check parameters */// 在检测一波引脚编号和功能编号是否超出限制if(number < 0 || number >= FPIOA_NUM_IO || function < 0 || function >= FUNC_MAX)return -1;/* Atomic write register *///如果没问题,把你传进来的function参数赋值给你定的硬件num上。fpioa->io[number] = (const fpioa_io_config_t){.ch_sel = function_config[function].ch_sel,.ds = function_config[function].ds,.oe_en = function_config[function].oe_en,.oe_inv = function_config[function].oe_inv,.do_sel = function_config[function].do_sel,.do_inv = function_config[function].do_inv,.pu = function_config[function].pu,.pd = function_config[function].pd,.sl = function_config[function].sl,.ie_en = function_config[function].ie_en,.ie_inv = function_config[function].ie_inv,.di_inv = function_config[function].di_inv,.st = function_config[function].st,/* resv and pad_di do not need initialization */};return 0;
}

然后你定义的这个硬件口就用了对应function的能力,是不是挺好玩。好了,如果要好好理解的话可以看看我的分析结合源码,神秘的FPIOA就是这样;


总结

本节主要用大白话和大家说了什么事FPIOA,解析了其实现过程。

相关文章:

AI嵌入式K210项目(4)-FPIOA

文章目录 前言一、FPIOA是什么&#xff1f;二、FPIOA代码分析总结 前言 磨刀不误砍柴工&#xff0c;在正式开始学习之前&#xff0c;我们先来了解下K210自带的FPIOA&#xff0c;这个概念可能与我们之前学习STM32有很多不同&#xff0c;STM32每个引脚都有特定的功能&#xff0c…...

FPGA开发设计

一、概述 FPGA是可编程逻辑器件的一种&#xff0c;本质上是一种高密度可编程逻辑器件。 FPGA的灵活性高、开发周期短、并行性高、具备可重构特性&#xff0c;是一种广泛应用的半定制电路。 FPGA的原理 采用基于SRAM工艺的查位表结构&#xff08;LUT&#xff09;&#xff0c;…...

上海亚商投顾:沪指冲高回落 旅游板块全天强势

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日冲高回落&#xff0c;创业板指跌近1%&#xff0c;北证50指数跌超3%。旅游、零售板块全天强势&#xf…...

Linux网络--- SSH服务

一、ssh服务简介 1、什么是ssh SSH&#xff08;Secure Shell&#xff09;是一种安全通道协议&#xff0c;主要用来实现字符界面的远程登录、远程复制等功能。SSH 协议对通信双方的数据传输进行了加密处理&#xff0c;其中包括用户登录时输入的用户口令&#xff0c;SSH 为建立在…...

2.1 数组

2.1 数组 &#xff08;1) 概述 定义 在计算机科学中&#xff0c;数组是由一组元素&#xff08;值或变量&#xff09;组成的数据结构&#xff0c;每个元素有至少一个索引或键来标识 因为数组内的元素是连续存储的&#xff0c;所以数组中元素的地址&#xff0c;可以通过其索引…...

超维空间M1无人机使用说明书——53、ROS无人机二维码识别与降落——V2升级版本

引言&#xff1a;使用二维码引导无人机实现精准降落&#xff0c;首先需要实现对二维码的识别和定位&#xff0c;可以参考博客的二维码识别和定位内容。本小节主要是通过获取拿到的二维码位置&#xff0c;控制无人机全向的移动和降落&#xff0c;本小节再V1版本的基础上增加了动…...

瑞萨IDE:CS+ for CC进行BootLoader升级时开发环境配置

瑞萨IDE:CS+ for CC进行BootLoader升级时开发环境配置 2023-06-17 726 发布于河北 版权 简介: BootLoader程序设计是常用的嵌入式升级方案之一,通过使用UART、SPI、IIC等接口实现对嵌入式节点的远程升级。本片博文并不是讲解如何实现BootLoader升级程序,而是讲解使用CS+…...

翻译: Streamlit从入门到精通 显示图表Graphs 地图Map 主题Themes 二

Streamlit从入门到精通 系列&#xff1a; 翻译: Streamlit从入门到精通 基础控件 一 1. 使用Streamlit显示图表Graphs 1.1 为什么我们需要可视化&#xff1f; 数据可视化通过将数据整理成更容易理解的格式来讲述故事&#xff0c;凸显趋势和异常点。好的可视化能够讲述一个故…...

Java 开源扫雷游戏 JMine 发布新版 3.0 及介绍视频

Java 开源扫雷游戏 JMine 发布新版 3.0 及介绍视频 Java 开源扫雷游戏 JMine 是笔者开发的基于 Swing 的 Java 扫雷游戏&#xff0c;现已发布新版 3.0 及其介绍视频。视频请见&#xff1a; https://www.bilibili.com/video/BV1RK4y1z7Qz/ 老版本 JMine 1.2.5 的介绍视频请见…...

Vue v-model 详解

✨ 专栏介绍 在当今Web开发领域中&#xff0c;构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架&#xff0c;正是为了满足这些需求而诞生。它采用了MVVM架构模式&#xff0c;并通过数据驱动和组件化的方式&#xff0c;使…...

一个超级牛逼的消息推送系统Gotify 使用Gotify来搭建你的消息推送系统

目录 先看效果 简介 1.1创建目录 3.访问服务端 3.1示例 3.2创建应用 4.安装apk 4.1下载apk 4.2安装 4.3配置服务器地址 5.推送消息测试 5.1服务器执行 5.2手机端查看 支持删除 6.源码地址 先看效果 打开应用 简介 gotify 支持的功能如下 可以通过 restapi 发送消…...

【架构设计】单体软件向微服务化演变

单体软件 假设单体软件的各模块如下&#xff0c;其中服务包含许多功能模块&#xff0c;如用户管理模块、商品模块、订单模块、仓库模块; #mermaid-svg-MzWKwMCwfo3PWMGH {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-…...

部署ATS(Apache Traffic Server)和Nginx正向代理服务性能对比

部署ATS&#xff08;Apache Traffic Server&#xff09;和Nginx正向代理服务&性能对比 1. 正向代理的用途2. ATS(Apache Traffic Server)正向代理服务器部署3. Nginx正向代理服务器部署4. 性能对比 1. 正向代理的用途 正向代理一般是用于内部网络出去&#xff0c;反向代理一…...

kafka入门(六):日志分段(LogSegment)

日志分段&#xff08;LogSegment&#xff09; Kafka的一个 主题可以分为多个分区。 一个分区可以有一至多个副本&#xff0c;每个副本对应一个日志文件。 每个日志文件对应一个至多个日志分段&#xff08;LogSegment&#xff09;。 每个日志分段还可以细分为索引文件、日志存储…...

Python 与 PySpark数据分析实战指南:解锁数据洞见

目录 前言 1. 数据准备 2. 数据探索 3. 数据可视化 4. 常见数据分析任务 ⭐️ 好书推荐 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站 数据分析是当今信息时代中至关重要的技…...

docker使用nginx部署vue刷新页面404

docker使用nginx部署vue刷新页面404 从docker内部复制出来的配置文件是这样的&#xff0c;但是刷新页面之后就显示404&#xff0c;关键是我两个前端项目都是用的这一个配置文件&#xff0c;但是只有一个项目出现刷新浏览器显示404的问题&#xff0c;这给我搞懵了&#xff01;&…...

openGauss学习笔记-198 openGauss 数据库运维-常见故障定位案例-分析查询效率异常降低的问题

文章目录 openGauss学习笔记-198 openGauss 数据库运维-常见故障定位案例-分析查询效率异常降低的问题198.1 分析查询效率异常降低的问题198.1.1 问题现象198.1.2 处理办法 openGauss学习笔记-198 openGauss 数据库运维-常见故障定位案例-分析查询效率异常降低的问题 198.1 分…...

使用Map.clear()、List.clear()方法,清空时注意!

对 Map、List 对象进行清空操作时&#xff0c;常常会使用 clear() 方法。 例如&#xff0c;清空 Map Map map new HashMap();map.put("key1","value1");map.put("key2","value2");System.out.println(map.size()); //2map.clear();Sy…...

如何配置Pycharm服务器并结合内网穿透工具实现远程开发

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;…...

c++中的以及链表的基础使用

c中的& 通俗的立减即为对一个变量起别名。&#xff08;是和指针有区别的&#xff09; 以下为两个示例程序&#xff1a; 通过&代替了以往对地址的传递。从而实现了对a和b的交换。 p为a的别名&#xff0c;对p操作即为对a操作。故最后输出a的值为10. 链表的基础应用 链…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...