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是什么?二、FPIOA代码分析总结 前言 磨刀不误砍柴工,在正式开始学习之前,我们先来了解下K210自带的FPIOA,这个概念可能与我们之前学习STM32有很多不同,STM32每个引脚都有特定的功能,…...
FPGA开发设计
一、概述 FPGA是可编程逻辑器件的一种,本质上是一种高密度可编程逻辑器件。 FPGA的灵活性高、开发周期短、并行性高、具备可重构特性,是一种广泛应用的半定制电路。 FPGA的原理 采用基于SRAM工艺的查位表结构(LUT),…...
上海亚商投顾:沪指冲高回落 旅游板块全天强势
上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指昨日冲高回落,创业板指跌近1%,北证50指数跌超3%。旅游、零售板块全天强势…...
Linux网络--- SSH服务
一、ssh服务简介 1、什么是ssh SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程复制等功能。SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令,SSH 为建立在…...
2.1 数组
2.1 数组 (1) 概述 定义 在计算机科学中,数组是由一组元素(值或变量)组成的数据结构,每个元素有至少一个索引或键来标识 因为数组内的元素是连续存储的,所以数组中元素的地址,可以通过其索引…...
超维空间M1无人机使用说明书——53、ROS无人机二维码识别与降落——V2升级版本
引言:使用二维码引导无人机实现精准降落,首先需要实现对二维码的识别和定位,可以参考博客的二维码识别和定位内容。本小节主要是通过获取拿到的二维码位置,控制无人机全向的移动和降落,本小节再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从入门到精通 系列: 翻译: Streamlit从入门到精通 基础控件 一 1. 使用Streamlit显示图表Graphs 1.1 为什么我们需要可视化? 数据可视化通过将数据整理成更容易理解的格式来讲述故事,凸显趋势和异常点。好的可视化能够讲述一个故…...
Java 开源扫雷游戏 JMine 发布新版 3.0 及介绍视频
Java 开源扫雷游戏 JMine 发布新版 3.0 及介绍视频 Java 开源扫雷游戏 JMine 是笔者开发的基于 Swing 的 Java 扫雷游戏,现已发布新版 3.0 及其介绍视频。视频请见: https://www.bilibili.com/video/BV1RK4y1z7Qz/ 老版本 JMine 1.2.5 的介绍视频请见…...
Vue v-model 详解
✨ 专栏介绍 在当今Web开发领域中,构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架,正是为了满足这些需求而诞生。它采用了MVVM架构模式,并通过数据驱动和组件化的方式,使…...
一个超级牛逼的消息推送系统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 发送消…...
【架构设计】单体软件向微服务化演变
单体软件 假设单体软件的各模块如下,其中服务包含许多功能模块,如用户管理模块、商品模块、订单模块、仓库模块; #mermaid-svg-MzWKwMCwfo3PWMGH {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-…...
部署ATS(Apache Traffic Server)和Nginx正向代理服务性能对比
部署ATS(Apache Traffic Server)和Nginx正向代理服务&性能对比 1. 正向代理的用途2. ATS(Apache Traffic Server)正向代理服务器部署3. Nginx正向代理服务器部署4. 性能对比 1. 正向代理的用途 正向代理一般是用于内部网络出去,反向代理一…...
kafka入门(六):日志分段(LogSegment)
日志分段(LogSegment) Kafka的一个 主题可以分为多个分区。 一个分区可以有一至多个副本,每个副本对应一个日志文件。 每个日志文件对应一个至多个日志分段(LogSegment)。 每个日志分段还可以细分为索引文件、日志存储…...
Python 与 PySpark数据分析实战指南:解锁数据洞见
目录 前言 1. 数据准备 2. 数据探索 3. 数据可视化 4. 常见数据分析任务 ⭐️ 好书推荐 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。 点击跳转到网站 数据分析是当今信息时代中至关重要的技…...
docker使用nginx部署vue刷新页面404
docker使用nginx部署vue刷新页面404 从docker内部复制出来的配置文件是这样的,但是刷新页面之后就显示404,关键是我两个前端项目都是用的这一个配置文件,但是只有一个项目出现刷新浏览器显示404的问题,这给我搞懵了!&…...
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 对象进行清空操作时,常常会使用 clear() 方法。 例如,清空 Map Map map new HashMap();map.put("key1","value1");map.put("key2","value2");System.out.println(map.size()); //2map.clear();Sy…...
如何配置Pycharm服务器并结合内网穿透工具实现远程开发
🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,…...
c++中的以及链表的基础使用
c中的& 通俗的立减即为对一个变量起别名。(是和指针有区别的) 以下为两个示例程序: 通过&代替了以往对地址的传递。从而实现了对a和b的交换。 p为a的别名,对p操作即为对a操作。故最后输出a的值为10. 链表的基础应用 链…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
