在一个嵌入式系统中,可能存在许多输入或输出的io口,输入有霍尔传感器、红外对管等,输出有led、电源控制开关等。如果说硬件可以一次成型,那么随便一份代码都可以完成io的配置工作,但研发阶段的产品,硬件各种修改是难免的,每一次 io 的修改,对于底层开发人员来说,可能都是一次挑战。因为一旦有某一个 io 配置错误,或者原来的配置没有修改正确(比如一个 io 在原来的硬件适配中是输入,之后的硬件需要修改成输出),那么你很难查出来这是什么问题,因为这个时候不仅硬件修改了,软件也修改了,你需要先定位到底是软件问题还是硬件问题,所以一个好用的 io 的配置框架就显得很有必要了。 有道友会说,不如使用 cubemx 软件进行开发吧。
1、这个软件适用于 st 单片机,以前还能用,现在,除非你家里有矿,不然谁用的起stm32?基本上都国产化了(虽然有些单片机号称兼容,但到底还是有些差异的)。2、公司原本的代码就是使用标准库,只是因为io 的变化,你就需要把整个库换掉吗?时间上允许吗?你确定修改后不会出现大问题?3、国产化的芯片可没有所谓的标准库和hal库供你选择,每一家都有各自的库,如果你的产品临时换方案怎么办?4、hal 效率问题。今天鱼鹰介绍一个简单实用的框架,可用于快速增加或修改io配置,甚至修改底层库。假设有3个 led 作为输出、3 个霍尔传感器作为输入:输入配置代码:
#define gpiox_def gpio_typedef*#define gpiomode_def gpiomode_typedeftypedef struct{ gpiox_def gpio; uint16_t msk; gpiomode_def pull_up_down; } bsp_input_pin_def; #define _gpio_pin_input(id, pull, gpiox, pinx) [id].gpio = (gpiox_def)gpiox, [id].msk = (1
msk, info->pull_up_down); info++; } }// 最多支持 32 个 io 输入uint32_t bsp_input_all(void){ uint32_t temp = 0; bsp_pin_get_value(temp, pin_input_hall_0); bsp_pin_get_value(temp, pin_input_hall_1); bsp_pin_get_value(temp, pin_input_hall_2); return temp;}// 读取单个 io 状态uint32_t bsp_input_level(bsp_pin_input_id_def id){ return (bsp_pin_get_port(bsp_input_pin[id].gpio) & bsp_input_pin[id].msk) ? 1 : 0;}typedef enum{ hw_hal_level_active = 0, // 可直接修改为 0 或 1,另一个枚举值自动修改为相反值 hw_hal_level_no_active = !hw_hal_level_active,}hw_input_hal_status_def;typedef struct { hw_input_hal_status_def hal_level0; uint8_t hal_level1; uint8_t hal_level2;}bsp_input_status_def;bsp_input_status_def bsp_input_status;int main(void){ usrat_init(9600);//必须,进入调试模式后点击全速运行 gpio_input_init(); while(1) { uint32_t temp = bsp_input_all(); bsp_input_status.hal_level0 = (hw_input_hal_status_def)((temp >> pin_input_hall_0) & 1); bsp_input_status.hal_level1 = ((temp >> pin_input_hall_1) & 1); bsp_input_status.hal_level2 = ((temp >> pin_input_hall_2) & 1); } } 调试的时候,我们可以很方便的查看每个 io 的状态是怎样的,而不用管 0 或 1 到底代表什么意思:输出配置代码:
电磁兼容性(EMC)要求资料性附录
LG能源解决方案将为电动汽车制造商特斯拉供应NCMA电池
智能可穿戴设备面临的关键问题
从技术角度看LED驱动方案2013年的四个趋势
LGD | 投资约710亿元!计划到2020年将OLED比重提升至40%
简单实用的框架,可用于快速增加或修改IO配置
化合物半导体材料或成新一代半导体发展的重要关键
PEM010 60 GHz发射机(Tx)波导模块
chdc1485a 蓝牙芯片参数
ABB 的 Radjassamy 谈论下一代电力系统的趋势
LED灯箱广告制作步骤及注意事项
消费级和工业级闪存之间的巨大鸿沟
功率 MOSFET类别 N沟道增强型功率MOSFET结构
iPhone8什么时候是上市:iPhone或采用水滴设计,向第一代iPhone致敬
我们是如何提供安全的Linux操作系统解决方案的
中科院广州电子CASAIM同南京航空航天大学在飞机表面智能检测分析达成科研战略合作
JTAG接口如何转SWD接口_JTAG接口转SWD接口方法
超高性价比的云服务器-华为云耀云服务器
锂电池的寿命是几年?锂电池的保养方法
浅谈1000 双工器自动化测试系统