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

news2024/11/18 6:26:11

文章目录

  • 前言
  • 一、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_RESV0
    for(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,解析了其实现过程。

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

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

相关文章

Web前端 ---- 【Vue3】computed计算属性和watch侦听属性(侦听被ref和reactive包裹的数据)

目录 前言 computed watch watch侦听ref数据 ref简单数据类型 ref复杂数据类型 watch侦听reactive数据 前言 本文介绍在vue3中的computed计算属性和watch侦听属性。介绍watch如何侦听被ref和reactive包裹的数据 computed 在vue3中&#xff0c;计算属性computed也是组合式…

Redis分布式锁--java实现

文章目录 Redis分布式锁方案&#xff1a;SETNX EXPIRE基本原理比较好的实现会产生四个问题 几种解决原子性的方案方案&#xff1a;SETNX value值是&#xff08;系统时间过期时间&#xff09;方案&#xff1a;使用Lua脚本(包含SETNX EXPIRE两条指令)方案&#xff1a;SET的扩展…

pod控制器的作用

pod控制器的作用 1、动态pv和pvc deployment是控制器 pod空气器:工作负载&#xff0c;workload用于管理pod的中间层&#xff0c;确保podi资源符合预期的状态 预期状态 1、副本数 2、容器重启策略 3、镜像拉取策略 pod、出现故障时重启等等 pod的控制器类型 1、replic…

Vue3组件库开发 之Button(1)

需求分析&#xff1a; Button 组件大部分关注样式&#xff0c;没有交互 根本分析可以得到具体的属性列表&#xff1a; type:不同的样式(Default,Primary,Danger,Info,Success,Warning) plain:样式的不同展现模式boolean round:圆角boolean circle:圆形按钮&#xff0c;适合图标…

【目标跟踪】跨相机如何匹配像素

文章目录 前言一、计算思路二、代码三、结果 前言 本本篇博客介绍一种非常简单粗暴的方法&#xff0c;做到跨相机像素匹配。已知各相机内外参&#xff0c;计算共视区域像素投影&#xff08;不需要计算图像特征&#xff09;。废话不多说&#xff0c;直接来&#xff0c;见下图。…

前端安全专题

xss (Cross Site Scripting) 跨站脚本攻击 原理 通常指黑客通过"HTML注入"篡改了网页&#xff0c;插入了恶意的脚本&#xff0c;从而在用户浏览网页时&#xff0c;控制用户浏览器的一种攻击。 常见攻击类型 存储型XSS 攻击者将恶意的 JavaScript 脚本存储在网站…

【网络工程师】NAT与动态路由

一、NAT网络地址转换 1、NAT&#xff1a;Network Address Translations 网络地址转换 2、ip地址问题&#xff1a;ipv4地址严重不够用了&#xff08;A、B、C类可以使用 D组播 E科研&#xff09; 3、解决&#xff1a;把IP地址分为了公网IP和私网IP 公网IP只能在公网上使用 私网…

手把手教你SWOT分析!建议收藏

最近&#xff0c;我一直为一件事情感到困扰。那家位于市中心的西点店生意越来越好&#xff0c;甚至已经开了两家分店&#xff0c;但是挣来的钱还不足够买房子。于是最近&#xff0c;我被这如火如荼的奶茶市场所吸引&#xff0c;想要利用已有的资源开一家奶茶店。但是我不确定这…

使用 Python 数据写入 Excel 工作表

在数据处理和报告生成等工作中&#xff0c;Excel 表格是一种常见且广泛使用的工具。然而&#xff0c;手动将大量数据输入到 Excel 表格中既费时又容易出错。为了提高效率并减少错误&#xff0c;使用 Python 编程语言来自动化数据写入 Excel 表格是一个明智的选择。Python 作为一…

linux GDB and GDB Sever

概念&#xff1a; GDB&#xff08;GNU Debugger&#xff09;是一个用于调试程序的强大工具。它是GNU项目的一部分&#xff0c;支持多种编程语言&#xff0c;包括C、C等。GDB 提供了一组命令和功能&#xff0c;允许跟踪检查程序的内部状态&#xff0c;跟踪代码的执行过程&#…

7.5 MySQL对数据的基本操作(❤❤❤)

7.5 MySQL对数据的基本操作 1. 提要2. 数据添加2.1 insert语法2.2 insert 子查询2.3 ignore关键字 3. 数据修改3.1 update语句3.2 update表连接 4. 数据删除4.1 delete语句4.2 delete表连接4.3 快速删除数据表全部数据 1. 提要 2. 数据添加 2.1 insert语法 2.2 insert 子查询 …

vivado 添加现有IP文件、生成IP

添加现有IP文件 作为从AMD IP目录添加和自定义IP的替代方案&#xff0c;您可以直接添加XCI或XCIX文件。此过程不同于从按以下方式编目&#xff1a; •XCI或XCIX文件可能是早期版本&#xff0c;也可能是相同或完全自定义的版本AMD IP目录中发现的类似IP。 •XCI或XCIX文件可能…

【linux】systemctl控制系统服务启动与关闭

systemctl简介 systemctl是一个在linux系统中&#xff0c;管理系统服务的命令。它通常是启动与关闭像防火墙&#xff0c;网络&#xff0c;数据库这类不是直接的软件&#xff0c;而是给软件提供支持的服务。 但是值得注意的是&#xff0c;并不是所有服务都可以用它管理&#x…

Vue学习笔记3--全局事件总线

Vue学习笔记3—全局事件总线 1.全局事件总线可以实现任意组件间通信 X需具备的条件&#xff1a; 所有的组件都要能看见X可以调用$on $off $emitVue.prototype.x {a:1, b:2} 可以被所有组件看见VueComponent.protoype.proto Vue.prototype组件实例对象(vc)可以访问到Vue原型上…

【.NET Core】C#预处理器指令

【.NET Core】C#预处理器指令 文章目录 【.NET Core】C#预处理器指令一、概述二、可为空上下文&#xff08;#nullable&#xff09;三、条件编译2.1 定义DEBUG是编译代码2.2 未定义MYTEST时&#xff0c;将编译以下代码 四、定义符号五、定义区域六、错误和警告信息 一、概述 预…

关于 ant-design-vue resetFields 失效

关于 ant-design-vue resetFields 失效 背景&#xff1a; 遇到这样的问题使用ant-design-vue useForm来制作表单的时候&#xff0c;resetFields()失效 场景&#xff1a; 编辑 -赋值 新增-初始值&#xff08;问题点&#xff1a;新增的时候他就不初始化&#xff09; 方案&…

【STM32】STM32学习笔记-USART串口收发HEX和文本数据包(29)

00. 目录 文章目录 00. 目录01. 串口简介02. 串口收发HEX数据包接线图03. 串口收发HEX数据包示例104. 串口收发HEX数据包示例205. 串口收发文本数据包接线图06. 串口收发文本数据包示例07. 程序示例下载08. 附录 01. 串口简介 串口通讯(Serial Communication)是一种设备间非常…

智能搬运机器人作为一种新型的物流技术

随着物流行业的快速发展&#xff0c;货物转运的效率和准确性成为了企业竞争的关键因素之一。智能搬运机器人作为一种新型的物流技术&#xff0c;已经在许多企业中得到了广泛应用。本文将介绍富唯智能智能搬运机器人在物流行业的应用和优势。 在实际应用中&#xff0c;智能搬运机…

在visual studio中调试时无法查看std::wstring

1.问题 在调试的时候发现std::wstring类型的变量查看不了&#xff0c;会显示(error)|0&#xff0c;百思不得其解。 2.解决方法 参考的&#xff1a;vs2015调试时无法显示QString变量的值&#xff0c;只显示地址_vs调试qstring的时候如何查看字符串-CSDN博客 在工具/选项/调试…

transfomer中Multi-Head Attention的源码实现

简介 Multi-Head Attention是一种注意力机制,是transfomer的核心机制,就是图中黄色框内的部分. Multi-Head Attention的原理是通过将模型分为多个头&#xff0c;形成多个子空间&#xff0c;让模型关注不同方面的信息。每个头独立进行注意力运算&#xff0c;得到一个注意力权…