在一个嵌入式系统中,可能存在许多输入或输出的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 到底代表什么意思:输出配置代码:
#define gpiox_def gpio_typedef*#define gpiomode_def gpiomode_typedeftypedef struct{ gpiox_def gpio; uint32_t msk; uint32_t init_value; } bsp_output_pin_def; #define _gpio_pin_out(id, gpiox, pinx, init) [id].gpio = gpiox, [id].msk = (1 brr = pin#define bsp_pin_output_clr(gpiox, pin) _bsp_pin_output_clr(gpiox, pin)typedef enum{ pin_output_led_g, pin_output_led_r, pin_output_led_b, pin_output_max}bsp_pin_output_id_def;static const bsp_output_pin_def bsp_output_pin [pin_output_max] = { gpio_pin_out(pin_output_led_g, gpioa, 0, 0), gpio_pin_out(pin_output_led_r, gpiof, 15, 0), gpio_pin_out(pin_output_led_b, gpiod, 10, 0),};void bsp_pin_init_output(gpiox_def gpiox, uint32_t msk, uint32_t init){ uint32_t temp; assert_param((msk & 0xffff0000) == 0 && gpiox != 0); temp = ((uint32_t) gpiox - (uint32_t) gpioa) / ( (uint32_t) gpiob - (uint32_t) gpioa); /* enable the led clock */ rcc_apb2periphclockcmd(rcc_apb2periph_gpioa << temp, enable); gpio_inittypedef gpio_initstruct; gpio_initstruct.gpio_mode = (gpiomode_def)gpio_mode_out_pp; gpio_initstruct.gpio_pin = msk; gpio_initstruct.gpio_speed = gpio_speed_2mhz; gpio_init((gpio_typedef*)gpiox, &gpio_initstruct); if(init == 0) { bsp_pin_output_clr(gpiox, msk); } else { bsp_pin_output_set(gpiox, msk); }}void bsp_output_init(){ bsp_output_pin_def *info; info = (bsp_output_pin_def *)&bsp_output_pin; for(int i = 0; i gpio, info->msk, info->init_value); info++; }}void bsp_output(bsp_pin_output_id_def id, uint32_t value){ assert_param(id < pin_output_max); if(value == 0) { bsp_pin_output_clr(bsp_output_pin[id].gpio, bsp_output_pin[id].msk); } else { bsp_pin_output_set(bsp_output_pin[id].gpio, bsp_output_pin[id].msk); }}int main(void){ usrat_init(9600);//必须,进入调试模式后点击全速运行 bsp_output_init(); while(1) { bsp_output(pin_output_led_g, 1); bsp_output(pin_output_led_b, 0); bsp_output(pin_output_led_r, 1); } } 这个框架有啥好处呢?
三星Galaxy S10 Lite曝光 规格与Galaxy A91相同
光电倍增管参数_光电倍增管的应用
聚飞光电热固性树脂(EMC、SMC、UP)封装国际专利获得授权
车载屏幕和手机屏幕有什么差异
探析行业首款28GHz GaN前端模块
简单实用的IO输入输出框架
分离事实与虚构 规避云计算商业智能误区
如何将5G落地并赋能垂直领域将是中国信息通信产业面临的重大课题
韩国汽车零部件、电子公司进军美国 引发产业空心化担忧
华为Mate40系列设计大改,爆料渲染图都不对
超高频2882M电力测温读写模块的应用领域有哪些
LM1875应用于实验和电流反馈BTL电路的方法
摩托罗拉即将在印度地区推出一系列顶级智能家用?
空调行业迎“洗牌”,格力掉出前三名
自动驾驶汽车也需要即时决策能力 激光雷达感知系统也可被欺骗
对中国制造2025的认识_中国制造2025战略规划
电源管理芯片是什么_电源管理芯片介绍
2016已经过去,年底旗舰小米5C和小米平板3还会有吗?
小米6什么时候上市:小米6双版本配置信息曝光,小米6配置详细介绍
适用于锅炉汽包液位测量的液位传感器