2024-9-30 14:38
93 次阅读|
0 个评论
01 概述 IO输入检测是嵌入式开发场景中,经常会遇到的情况,按键检测,外部IC中断检测,都需要输入检测。 输入信号的检测的前提条件,那就是需要在读取信号前,将输入信号的IO端口进行置1,然后就可以读取该端口上的状态,由于我们的单片机是带上拉电阻的,所以当我们把端口置1后,端口上如果什么也不接,就是处于悬空状态,那么我们读到的就是1,也就是说,单片机的常态是1,要想检测到外界的信号变化,就需要对端口置0,我们的外电路的输入信号应该是接地的才会有效。 02 按键的消抖问题 按键是机械的, 在按下和松手的瞬间会伴随有一定时间的抖动,按键开关不会马上稳定接通或一下断开,使用按键时会产生图中所示波浪信号,我们写程序的时候需要用软件消抖处理滤波。 当然也可以设计硬件进行消抖,如果有硬件消抖,软件就不用再设计消抖处理。硬件消抖一般是利用RC电路的电容充放电特性来对抖动产生的电压毛刺进行滤波,简单示意图如图 03 检测IC消抖 大多数IC的输出INT接口,不需要消抖。具体可以使用示波器,查看当外部IC的INT信号发生时,是否会产生抖动。 如果需要去抖,可以参考按键去抖电路,硬件消抖,或者世界在软件上消抖。但如果外部IC产生的INT的信号频率很高,注意软件消抖的延时问题。 04 组件的使用 1 Gitee链接地址 Demo位于amaziot_bloom_os_sdk\sample\3rd\3.2_MUL_MENU-SSD1315 Gitee源码地址:https://gitee.com/ning./hongdou Github源码地址:https://github.com/ayumid/hongdou 编译指令:.\build.bat -l .\amaziot_bloom_os_sdk\sample\3rd\3.2_MUL_MENU-SSD1315 2 组件功能介绍 INPUT组件适用于所有需要数据检测的场景,例如按键,中断等。组件中实现了4路输出检测,如需增加更多,可以参考组件中的代码增加。 该组件配合MENU组件使用,实现了按键多级菜单。客户可以根据自己的场景进行微改。 3 代码讲解 4路代码重复性较高,所以这里只列出第X路的API 1 input_keyX_irq_hadler 功能:该函数用于,中断回调函数。 参数:无 返回值:无 示例: C config.isr = input_key0_irq_hadler; 2 input_keyX_hadler 功能:该函数用于,回调函数。 参数:无 返回值:无 示例: C Os_Create_HISR(&input_key0_hisr, "Gpio_Hisr", input_key0_hadler, 2); 3 input_keyX_callback 功能:该函数用于,去抖定时器回调函数。 参数:无 返回值:无 示例: C OSATimerStart(input_key0_timer_ref, 2, 0, input_key0_callback, 0); 4 input_key_init 功能:该函数用于,初始化菜单按键使用的gpio。 参数:无 返回值:无 示例: C //初始化按键 input_key_init(); 返回值:无 4 Demo实战 该组件需要和MENU配合实验,实战内容和MENU中一样,不重复增加Demo。 4.1 创建一个Demo 复制3.1_SSD1315示例工程,到同一个文件夹下,修改文件名为3.2_MUL_MENU-SSD1315,如图: 4.2 修改makefile 增加文件组件所在目录头文件路径,和源文件路径,如图: 4.3 增加头文件 使用代码编辑器,将新建的工程文件加入代码编辑器中,打开main.c,修改main.c,加入am.h等头文件,如图: 4.4 修改代码 在Phase2Inits_exit 创建一个任务,如图: 4.5 宏定义介绍 sample_ssd1315_uart_printf 输出日志到DEBUG 串口,日志比较少,可以输出到这个串口,如果日志比较多,需要输出到usb口,以免不必要的问题出现 sample_ssd1315_catstudio_printf 输出日志到USB 串口,使用catstudio查看,catstudio查看日志需要更新对应版本mdb.txt文件,软件打开filtter过滤日志,只查看用户输出的日志 SAMPLE_SSD1315_STACK_SIZE 栈空间宏定义 4.6 全局变量介绍 sample_ssd1315_stack_ptr 任务栈空间,本例使用数组实现,用户在做项目时,可以预先估算下当先任务需要的大致栈空间,OS没有提供可以查看栈空间使用情况的API sample_ssd1315_task_ref 任务指针 4.7 函数介绍 Phase1Inits_enter 底层初始化,本例空 Phase1Inits_exit 底层初始化,本例空 Phase2Inits_enter 底层初始化,本例空 Phase2Inits_exit 创建主任务,初始化消息队列,定时器,任务等。 代码片段: C int ret = 0; GPIOConfiguration config = {0}; //创建定时�? OSATimerCreate(&sample_xl9535_int_detect_timer_ref); //创建中断处理任务 OSATaskCreate(&sample_ssd1315_task_ref, sample_ssd1315_stack_ptr, SAMPLE_SSD1315_STACK_SIZE, 100, "ssd1315_task", sample_ssd1315_task, NULL); input_run_main_menu 显示主界面,用户任务中调用这个函数。 代码片段: C static input_OPTION_TYPE_T input_OptionList = { {"TOOLS1", NULL}, {"TOOLS2", NULL}, {"TOOLS3", NULL}, {"TOOLS4", NULL}, {"TOOLS5", NULL}, {".."}}; static input_HANDLE_TYPE_T MENU = {.OptionList = input_OptionList}; input_run_menu(&MENU); input_run_tools_menu 根据按键选择运行工具界面。 代码片段: C static input_OPTION_TYPE_T input_OptionList SDK_CUST_SKU : SDK_PS_MODE : SDK_CHIP_VER : SDK_OS_TYPE : Platform Convertion Tools v4.01 with PS option extension Convertion done! |INPUT |out\bin\cp_1606L.bin |MARK |NAME |EXEADDR .LOADADDR.LENGTH .CPZLADDR|COMPRESS STASTIC | |--------|--------|--------.--------.--------.--------|------------------------------| |This Is LteOnly 4M| 00003000 |This Is LteOnly 4M| 00001000 |This Is LteOnly 4M| 0000a000 |This Is LteOnly 4M| 0001e000 |This Is LteOnly 4M| 0001b000 |This Is LteOnly 4M| 0001b000 |This Is LteOnly 4M| 0001a000 |This Is LteOnly 4M| 0001a000 |This Is LteOnly 4M| 00011000 |This Is LteOnly 4M| 0001e000 |This Is LteOnly 4M| 00021000 |This Is LteOnly 4M| 00012000 |--------|--------|--------.--------.--------.--------|------------------------------| 0x0014a000| 1.289(MB)| |------------------------------------------------------------------------------------| cp_1606L.axf cp_1606L.bin cp_1606L.map gnumake: Leaving directory `F:/3.asr-b/cat.1-asr1606/1.software/BlOOM_OS_1606_OPENCPU_1191_A09_WIHT_NEWRF/amaziot_bloom_os_sdk/sample/3rd/3.2_MUL_MENU-SSD1315' "copy NEZHAC_CP_CNR_MIFI_TX.bin to ./ " 已复制 1 个文件。 4.9 生成固件 参考入门中开发工具,生成工具。 4.10 测试 测试步骤: 参考编译教程,和文档开头的编译指令,进行编译 按照编译教程选择对应的选项 烧录 4.11 固件 上电后,屏幕会显示主菜单,通过4个按键:选择,返回,上,下。可以选择不同的菜单; 点击下载 OLED 多级菜单 Demo固件 5 生态组件链接 注:本文部分内容来源于网络,如有侵权,请及时联系我们。 本文章源自奇迹物联开源的物联网应用知识库Cellular IoT Wiki,更多技术干货欢迎关注收藏Wiki: Cellular IoT Wiki 知识库(https://rckrv97mzx.feishu.cn/wiki/wikcnBvAC9WOkEYG5CLqGwm6PHf)