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_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,解析了其实现过程。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring基于AOP(面向切面编程)开发

概述 AOP为Aspect Oriented Programming的缩写&#xff0c;意为&#xff1a;面向切面编程&#xff0c;通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续&#xff0c;是软件开发中的一个热点&#xff0c;也是Spring框架中的一个重要内容&…

通过旋转机械臂,将机械臂上相机拍摄图像的任意点移动至图像中心的方法

计算原理 角度计算 相机CCD大小固定&#xff0c;即相机成像平面大小固定&#xff0c;相机视场角(FOV)仅由相机焦距F决定&#xff1b; 因此&#xff0c;定焦相机的FOV大小固定&#xff0c;通过上图可以看出相机视场角的计算公式为&#xff1a; FOV 2*atan&#xff08;w/2f&…

Windows 下 使用 VSCode 和 arm-none-eabi 编译Linux代码时 mkdir 命令出错

编译环境&#xff1a; IDE: VSCode 交叉编译器&#xff1a;arm-none-eabi make 命令&#xff1a;Mingw-w64 GCC for Windows 64 源代码管理&#xff1a;git 交叉编译器版本和安装目录: E:\work_soft\gcc-arm-none-eabi-10.3-2021.10 Mingw 版本和目录&#xff1a;E:\work_…

C++ 设计模式之外观模式

【声明】本题目来源于卡码网&#xff08;题目页面 (kamacoder.com)&#xff09; 【提示&#xff1a;如果不想看文字介绍&#xff0c;可以直接跳转到C编码部分】 【简介】什么是外观模式 外观模式Facade Pattern , 也被称为“⻔⾯模式”&#xff0c;是⼀种结构型设计模式&#…

2011 年考研数二真题解析

一、选择题 【01】【02】【03】【04】【05】【06】【07】【08】 二、填空题 【09】【10】【11】【12】【13】【14】 三、解答题 【15】【16】【17】【18】【19】【20】【21】【22】【23】

Vue高级(二)

3.搭建vuex环境 创建文件&#xff1a;src/store/index.js //引入Vue核心库import Vue from vue//引入Vueximport Vuex from vuex//应用Vuex插件Vue.use(Vuex)//准备actions对象——响应组件中用户的动作const actions {}//准备mutations对象——修改state中的数据const mutat…

mac idea 配置docker 插件

mac默认配置 会报错 mac Can’t connect: com.intellij.docker.agent.Api TaskException: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? (Details: [2] No such file or directory) 终端执行 sudo ln -s "$HO…

中学生英语杂志中学生英语杂志社中学生英语编辑部2023年第46期目录

“《中学生英语》教育教改与考试研究中心”课题组课题成果交流 高中英语学习动机因素与其对学习成效的影响研究 仇丽; 3-4 主位推进程序在高中英语读后续写中的应用 陈媛媛; 5-6《中学生英语》投稿&#xff1a;cn7kantougao163.com 小学英语教学:互动式英语词汇记忆…

Spring AOP 源码分析

【阅读前提】&#xff1a; 需了解AOP注解开发流程&#xff1a;链接 一、注解 EnableAspectJAutoProxy 在配置类中添加注解EnableAspectJAutoProxy&#xff0c;便开启了AOP&#xff08;面向切面编程&#xff09; 功能。此注解也是了解AOP源码的入口。 EnableAspectJAutoProxy…

外贸建站服务器如何选?海洋建站主机推荐?

外贸建站用哪个服务器比较好&#xff1f;独立网站怎么选择主机&#xff1f; 随着全球化的趋势&#xff0c;外贸网站的建设越来越受到企业的重视。然而&#xff0c;要想让外贸网站稳定、安全、可靠地运行&#xff0c;选择合适的外贸建站服务器是关键。海洋建站将详细介绍如何选…

Git 实操

文章目录 安装本地操作工作流程 Git 初始化以及仓库的创建、操作基本信息初始化一个Git 仓库 Git 管理远程仓库Git 克隆给远程仓库设置别名pull 拉取并合并分支Push推送到远程实战 git 是免费的管理github 的一个软件 安装 Git 官网下载&#xff1a;https://git-scm.com/downlo…

前端(二)VUE功能集锦

一、引言 作者开发工具平台的时候&#xff0c;用到了vue和element-ui&#xff0c;这里写一下各种功能使用&#xff0c;有的是绕点弯路&#xff0c;有的是需要结合实现需要自己改写一下。 二、功能 先看看环境&#xff0c;作者后端是SpringBoot&#xff0c;前端是VUEElementUI&a…

揭秘高生产力设计工具!15款原型设计软件推荐大公开!

1、Proto.io Proto.io是一个特殊的手机原型开发平台——可以构建和部署全交互式移动程序的原型&#xff0c;并可以模拟类似的成品。它可以在大多数浏览器中运行&#xff0c;并提供三个重要的界面&#xff1a;dashboard、编辑器和播放器。 dashboard可以用来管理项目。编辑器是…

spring常见漏洞(3)

CVE-2017-8046 Spring-Data-REST-RCE(CVE-2017-8046)&#xff0c;Spring Data REST对PATCH方法处理不当&#xff0c;导致攻击者能够利用JSON数据造成RCE。本质还是因为spring的SPEL解析导致的RCE 影响版本 Spring Data REST versions < 2.5.12, 2.6.7, 3.0 RC3 Spring Bo…

亚信安慧AntDB数据库自主研发技术再获国际认可

亚信安慧AntDB数据库最新宣布喜讯&#xff1a;成功通过了GB 18030-2022《信息技术 中文编码字符集》的最高级别认证&#xff0c;从而荣幸地成为首批获得此认证的数据库产品之一。这一认证的取得不仅是AntDB在技术上的重要里程碑&#xff0c;更是对其一贯积极践行国家政策和标准…

护眼台灯哪个品牌更好?汇总好用的护眼台灯前五名

随着对健康生活的追求不断增长&#xff0c;越来越多的人开始关注眼睛健康问题。在日常生活和工作中&#xff0c;台灯作为常用的照明设备之一备受关注&#xff0c;尤其是护眼台灯的问世引起了广泛关注。尤其是对于那些经常长时间用眼的人群&#xff0c;比如面临较重课业负担的学…

转载 | 深耕数据安全 创新“智”高点-天空卫士获评金智奖“年度最具影响力企业奖”

近日&#xff0c;以“并肩聚力&#xff0c;协同创新&#xff0c;共谋网络安全产业新发展”为主题的2022-2023年度中国网络安全与信息产业“金智奖”颁奖盛典在上海隆重举行。北京天空卫士网络安全技术有限公司&#xff08;以下简称“天空卫士”&#xff09;凭借其高速成长能力、…

【书生·浦语】大模型实战营——第五次课程作业

基础作业——使用LMDeploy 以本地对话、网页Gradio、API服务中的一种方式部署InternLM-Chat-7B模型&#xff0c;生成300字的小故事 环境准备 除了安装所需依赖之后&#xff0c;重要的是进行模型转化&#xff08;转换成TurboMind格式&#xff09;&#xff0c;这里需要注意转化命…

Android项目架构怎么做

项目架构指南 本指南包含一些最佳做法和推荐架构&#xff0c;有助于构建强大而优质的应用。 注意&#xff1a; 本页假定您对 Android 框架有基本的了解。 移动应用用户体验 典型的 Android 应用包含多个应用组件&#xff0c;包括 Activity、Fragment、Service、内容提供程序…

计算机毕业设计----SSH滑雪场场地租赁管理系统

项目介绍 该项目主要包括三个角色&#xff1a;管理员、收银员、用户&#xff1b; 用户角色包含以下功能&#xff1a; 用户登录,修改个人信息,查看我的订单等功能。 管理员角色包含以下功能&#xff1a; 管理员登录,滑雪场管理,订单管理,教练管理,器材管理,会员管理,收银员管…