裕华建设集团网站,云推广,郑州网络营销哪个好,网站功能简介文章目录 前言一、FPIOA是什么#xff1f;二、FPIOA代码分析总结 前言
磨刀不误砍柴工#xff0c;在正式开始学习之前#xff0c;我们先来了解下K210自带的FPIOA#xff0c;这个概念可能与我们之前学习STM32有很多不同#xff0c;STM32每个引脚都有特定的功能#xff0c… 文章目录 前言一、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解析了其实现过程。