{"id":66611,"date":"2026-01-27T00:25:01","date_gmt":"2026-01-26T16:25:01","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/66611.html"},"modified":"2026-01-27T00:25:01","modified_gmt":"2026-01-26T16:25:01","slug":"%e5%85%b3%e4%ba%8e%e5%8d%95%e7%89%87%e6%9c%ba%e6%8c%89%e9%94%ae%e9%9d%9e%e9%98%bb%e5%a1%9e%e6%96%b9%e5%bc%8f%e8%a7%a6%e5%8f%91%e7%9a%84%e4%b8%80%e7%a7%8d%e6%96%b9%e6%b3%95","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/66611.html","title":{"rendered":"\u5173\u4e8e\u5355\u7247\u673a\u6309\u952e\u975e\u963b\u585e\u65b9\u5f0f\u89e6\u53d1\u7684\u4e00\u79cd\u65b9\u6cd5"},"content":{"rendered":"<h2>\u5173\u4e8e\u5355\u7247\u673a\u6309\u952e\u975e\u963b\u585e\u68c0\u6d4b\u7684\u4e00\u79cd\u65b9\u6cd5<\/h2>\n<p>\u6309\u952e\u4f5c\u4e3a\u4e00\u79cd\u5f00\u5173\u578b\u7684\u786c\u4ef6\u5916\u8bbe&#xff0c;\u5728\u5927\u90e8\u5206\u7684\u5d4c\u5165\u5f0f\u5355\u7247\u673a\u8f6f\u4ef6\u5f00\u53d1\u4e2d\u90fd\u4f1a\u4f7f\u7528\u5230\u3002\u4f46\u662f&#xff0c;\u5355\u7247\u673a\u7684\u5f00\u53d1\u5f88\u591a\u65f6\u5019\u90fd\u662f\u88f8\u673a\u5f00\u53d1&#xff0c;\u51e0\u4e4e\u7528\u4e0d\u5230RTOS&#xff0c;\u88f8\u673a\u5f00\u53d1\u8bf4\u660e\u5355\u7247\u673a\u662f\u6309\u987a\u5e8f\u6267\u884c\u7684&#xff0c;\u662f\u4e2a\u5355\u7ebf\u7a0b\u7cfb\u7edf&#xff0c;\u800c\u6309\u952e\u68c0\u6d4b\u9700\u8981\u8fdb\u884c\u6d88\u6296&#xff0c;\u6d88\u6296\u662f\u9700\u8981\u7b49\u5f85\u7684&#xff0c;\u5728\u88f8\u673a\u7cfb\u7edf\u4e2d&#xff0c;\u5c31\u4f1a\u9020\u6210\u963b\u585e&#xff0c;\u5bfc\u81f4\u7cfb\u7edf\u6027\u80fd\u4e0b\u964d\u3002<\/p>\n<p>\u4e0b\u9762&#xff0c;\u662f\u4e00\u4e2a\u5229\u7528\u72b6\u6001\u673a\u5b9e\u73b0\u6309\u952e\u7684\u975e\u963b\u585e\u68c0\u6d4b\u6548\u679c\u7684\u4ee3\u7801\u3002\u5206\u4e24\u4e2a\u5e73\u53f0\u5b9e\u73b0&#xff0c;\u4e00\u4e2a\u662f\u6770\u91cc\u7684AC791N\u7cfb\u5217\u82af\u7247&#xff0c;\u4e00\u4e2a\u662fSTM32F429IGT6\u82af\u7247&#xff0c;\u800cSTM\u7cfb\u5217\u6211\u662f\u57fa\u4e8e\u6b63\u70b9\u539f\u5b50\u7684\u963f\u6ce2\u7f57\u5f00\u53d1\u677f\u5b9e\u73b0\u7684\u3002<\/p>\n<h3>\u6770\u91ccAC791N\u5229\u7528\u72b6\u6001\u673a\u5b9e\u73b0\u6309\u952e\u7684\u975e\u963b\u585e\u68c0\u6d4b<\/h3>\n<p><font color=\"red\">\u63d0\u793a&#xff1a;\u4e0d\u662f\u7528AC791N\u7cfb\u5217\u82af\u7247\u7684\u53ef\u76f4\u63a5\u8df3\u8fc7&#xff01;&#xff01;&#xff01;<\/font><\/p>\n<p>key.h\u7684\u914d\u7f6e\u5982\u4e0b&#xff1a;<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifndef<\/span> <span class=\"token expression\">__KEY_H_<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">__KEY_H_<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">KEY_GPIO_EN<\/span>      <span class=\"token expression\"><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><\/span><span class=\"token comment\">\/* GPIO\u6309\u952e\u4f7f\u80fd 0:\u5173\u95ed 1:\u6253\u5f00 *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">CFG_HW_GPIOKEY_NUM<\/span> <span class=\"token expression\"><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><\/span><span class=\"token comment\">\/* GPIO\u6309\u952e\u6570\u91cf *\/<\/span><\/span><\/p>\n<p><span class=\"token keyword\">enum<\/span> <span class=\"token class-name\">APP_KEY_CODE_T<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    APP_KEY_CODE_FN1 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0x00<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    APP_KEY_CODE_FN2<span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6309\u952e\u4e8b\u4ef6\u679a\u4e3e<\/span><br \/>\n<span class=\"token keyword\">typedef<\/span> <span class=\"token keyword\">enum<\/span><span class=\"token punctuation\">{<\/span><br \/>\nAPP_KEY_DEFAULE_EVENT <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><br \/>\nAPP_KEY_LONGPRESS_EVENT<span class=\"token punctuation\">,<\/span><br \/>\nAPP_KEY_LONGLONGPRESS_EVENT<span class=\"token punctuation\">,<\/span><br \/>\nAPP_KEY_FACTORY_EVENT<span class=\"token punctuation\">,<\/span><br \/>\nAPP_KEY_UP_AFTER_LONGPRESS_EVENT<span class=\"token punctuation\">,<\/span><br \/>\nAPP_KEY_UP_AFTER_LONGLONGPRESS_EVENT<span class=\"token punctuation\">,<\/span><br \/>\nAPP_KEY_CLICK_EVENT<span class=\"token punctuation\">,<\/span><br \/>\nAPP_KEY_DOUBLECLICK_EVENT<span class=\"token punctuation\">,<\/span><br \/>\nAPP_KEY_TRIPLECLICK_EVENT<span class=\"token punctuation\">,<\/span><br \/>\nAPP_KEY_FOURTHCLICK_EVENT<span class=\"token punctuation\">,<\/span><br \/>\nAPP_KEY_FIFTHCLICK_EVENT<span class=\"token punctuation\">,<\/span><br \/>\nAPP_KEY_SIXTHCLICK_EVENT<span class=\"token punctuation\">,<\/span><br \/>\nAPP_KEY_EVENT_NUM <span class=\"token operator\">&#061;<\/span> APP_KEY_SIXTHCLICK_EVENT<span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">}<\/span>APP_KEY_EVENT_T<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6309\u952e\u72b6\u6001\u679a\u4e3e<\/span><br \/>\n<span class=\"token keyword\">typedef<\/span> <span class=\"token keyword\">enum<\/span><span class=\"token punctuation\">{<\/span><br \/>\nAPP_KEY_DEFAULE_STATUS <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><br \/>\nAPP_KEY_DITHER_STATUS<span class=\"token punctuation\">,<\/span><br \/>\nAPP_KEY_DOWN_STATUS<span class=\"token punctuation\">,<\/span><br \/>\nAPP_KEY_LONGPRESS_WAIT_RELEASE_STATUS<span class=\"token punctuation\">,<\/span><br \/>\nAPP_KEY_INTERVAL_DEAL_STATUS<span class=\"token punctuation\">,<\/span><br \/>\nAPP_KEY_STATE_NUM <span class=\"token operator\">&#061;<\/span> APP_KEY_INTERVAL_DEAL_STATUS<br \/>\n<span class=\"token punctuation\">}<\/span>APP_KEY_STATE_T<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<p>key.c\u5982\u4e0b\u4ee3\u7801&#xff1a;<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;system\/includes.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;asm\/gpio.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;app_config.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;storage_device.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;generic\/log.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;os\/os_api.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;event\/key_event.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;event\/device_event.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;event\/net_event.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;fs\/fs.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;asm\/pwm.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;device\/device.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;key.h&#034;<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">TIMER_PERIOD<\/span>     <span class=\"token expression\"><span class=\"token number\">10<\/span>  <\/span><span class=\"token comment\">\/\/ \u6309\u952e\u626b\u63cf\u65f6\u95f4<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">KEY_DEBOUNCE_INTERVAL_MS<\/span>            <span class=\"token expression\"><span class=\"token number\">20<\/span>  <\/span><span class=\"token comment\">\/\/ \u6d88\u6296\u65f6\u95f4 <\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">KEY_LONGPRESS_THRESHOLD_MS<\/span><span class=\"token expression\"><span class=\"token number\">3000<\/span> <\/span><span class=\"token comment\">\/\/ \u957f\u6309\u4e8b\u4ef6\u89e6\u53d1\u65f6\u95f4<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">KEY_LONGLONGPRESS_THRESHOLD_MS<\/span><span class=\"token expression\"><span class=\"token number\">6000<\/span> <\/span><span class=\"token comment\">\/\/ \u957f\u957f\u6309\u4e8b\u4ef6\u89e6\u53d1\u65f6\u95f4<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">KEY_CHECKER_INTERVAL_MS<\/span>  <span class=\"token expression\"><span class=\"token number\">400<\/span>  <\/span><span class=\"token comment\">\/\/ \u591a\u51fb\u89e6\u53d1\u65f6\u95f4\u95f4\u9694<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6309\u952e\u89e6\u53d1\u914d\u7f6e<\/span><br \/>\n<span class=\"token keyword\">typedef<\/span> <span class=\"token keyword\">enum<\/span><span class=\"token punctuation\">{<\/span><br \/>\nMX_KEY_PULLUP_CONFIG <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0X00<\/span><span class=\"token punctuation\">,<\/span><br \/>\nMX_KEY_PULLDOWN_CONFIG <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0X01<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">}<\/span>MX_KEY_CONFIG<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6309\u952e\u89e6\u53d1\u503c<\/span><br \/>\n<span class=\"token keyword\">enum<\/span> <span class=\"token class-name\">HAL_KEY_GPIOKEY_VAL_T<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    HAL_KEY_GPIOKEY_VAL_LOW <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    HAL_KEY_GPIOKEY_VAL_HIGH<span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6309\u952eIO\u53e3\u914d\u7f6e<\/span><br \/>\n<span class=\"token keyword\">typedef<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token class-name\">uint8_t<\/span> port<span class=\"token punctuation\">;<\/span><br \/>\nMX_KEY_CONFIG config<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span>MX_KEY_IO_CONFIG<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5355\u4e2a\u6309\u952e\u7684\u6240\u6709\u914d\u7f6e<\/span><br \/>\n<span class=\"token keyword\">typedef<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">HAL_KEY_GPIOKEY_CFG<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    MX_KEY_IO_CONFIG key_config<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">enum<\/span> <span class=\"token class-name\">HAL_KEY_GPIOKEY_VAL_T<\/span> key_down<span class=\"token punctuation\">;<\/span><br \/>\nAPP_KEY_STATE_T status<span class=\"token punctuation\">;<\/span><br \/>\nAPP_KEY_EVENT_T event<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">int<\/span> timer_count<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span>HAL_KEY_GPIOKEY_CFG_T<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6309\u952e\u914d\u7f6e\u521d\u59cb\u5316<\/span><br \/>\nHAL_KEY_GPIOKEY_CFG_T gpio_key_cfg<span class=\"token punctuation\">[<\/span>CFG_HW_GPIOKEY_NUM<span class=\"token punctuation\">]<\/span>  <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span>IO_PORTA_09<span class=\"token punctuation\">,<\/span>MX_KEY_PULLUP_CONFIG<span class=\"token punctuation\">,<\/span><span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>HAL_KEY_GPIOKEY_VAL_LOW<span class=\"token punctuation\">,<\/span>APP_KEY_DEFAULE_STATUS<span class=\"token punctuation\">,<\/span>APP_KEY_DEFAULE_EVENT<span class=\"token punctuation\">,<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span>IO_PORTA_00<span class=\"token punctuation\">,<\/span>MX_KEY_PULLUP_CONFIG<span class=\"token punctuation\">,<\/span><span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>HAL_KEY_GPIOKEY_VAL_LOW<span class=\"token punctuation\">,<\/span>APP_KEY_DEFAULE_STATUS<span class=\"token punctuation\">,<\/span>APP_KEY_DEFAULE_EVENT<span class=\"token punctuation\">,<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><\/p>\n<p><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5224\u65ad\u6309\u952e\u662f\u5426\u6309\u4e0b<\/span><br \/>\n<span class=\"token keyword\">static<\/span> bool <span class=\"token function\">hal_gpiokey_pressed<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint8_t<\/span> index<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">gpio_read<\/span><span class=\"token punctuation\">(<\/span>gpio_key_cfg<span class=\"token punctuation\">[<\/span>index<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_config<span class=\"token punctuation\">.<\/span>port<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> gpio_key_cfg<span class=\"token punctuation\">[<\/span>index<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_down<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6309\u952e\u626b\u63cf\u51fd\u6570<\/span><br \/>\n<span class=\"token keyword\">static<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">hal_key_debounce_handler<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span> <span class=\"token operator\">*<\/span>param<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">static<\/span> bool key_press <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">for<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> ii<span class=\"token operator\">&#061;<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span>ii<span class=\"token operator\">&lt;<\/span>CFG_HW_GPIOKEY_NUM<span class=\"token punctuation\">;<\/span>ii<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\nkey_press <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">hal_gpiokey_pressed<\/span><span class=\"token punctuation\">(<\/span>ii<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\ngpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>timer_count<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/\/printf(&#034;%s:%d&#034;,__func__,gpio_key_cfg[ii].status);<\/span><br \/>\n<span class=\"token keyword\">switch<\/span><span class=\"token punctuation\">(<\/span>gpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>status<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">case<\/span> APP_KEY_DEFAULE_STATUS<span class=\"token operator\">:<\/span><br \/>\n<span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>key_press<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u6309\u4e0b&#xff0c;\u8fdb\u6d88\u6296<\/span><br \/>\ngpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>timer_count <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\ngpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>status <span class=\"token operator\">&#061;<\/span> APP_KEY_DITHER_STATUS<span class=\"token punctuation\">;<\/span><br \/>\ngpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>event <span class=\"token operator\">&#061;<\/span> APP_KEY_DEFAULE_EVENT<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">else<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\ngpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>timer_count <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">case<\/span> APP_KEY_DITHER_STATUS<span class=\"token operator\">:<\/span><br \/>\n<span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>key_press<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>gpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>timer_count <span class=\"token operator\">*<\/span> TIMER_PERIOD <span class=\"token operator\">&gt;&#061;<\/span> KEY_DEBOUNCE_INTERVAL_MS<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u6d88\u6296\u6210\u529f<\/span><br \/>\ngpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>status <span class=\"token operator\">&#061;<\/span> APP_KEY_DOWN_STATUS<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">else<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u6d88\u6296\u5931\u8d25<\/span><br \/>\ngpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>status <span class=\"token operator\">&#061;<\/span> APP_KEY_DEFAULE_STATUS<span class=\"token punctuation\">;<\/span><br \/>\ngpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>timer_count <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">case<\/span> APP_KEY_DOWN_STATUS<span class=\"token operator\">:<\/span><br \/>\n<span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>key_press<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u5224\u65ad\u957f\u6309<\/span><br \/>\n<span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>gpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>timer_count <span class=\"token operator\">*<\/span> TIMER_PERIOD <span class=\"token operator\">&gt;&#061;<\/span> KEY_LONGLONGPRESS_THRESHOLD_MS<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u53d1\u9001\u957f\u957f\u6309\u4e8b\u4ef6<\/span><br \/>\n<span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>gpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>event <span class=\"token operator\">&#061;&#061;<\/span> APP_KEY_LONGPRESS_EVENT<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n                        <span class=\"token comment\">\/\/ \u957f\u957f\u6309\u89e6\u53d1<\/span><br \/>\ngpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>event <span class=\"token operator\">&#061;<\/span> APP_KEY_LONGLONGPRESS_EVENT<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/\/mx_send_msg(MX_KEY_HANDLE,ii,gpio_key_cfg[ii].event);<\/span><br \/>\n<span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>ii <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">mx_ui_task_post<\/span><span class=\"token punctuation\">(<\/span>MX_LVGL_TASK_KEY_ID<span class=\"token punctuation\">,<\/span>gpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>event<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>gpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>timer_count <span class=\"token operator\">*<\/span> TIMER_PERIOD <span class=\"token operator\">&gt;&#061;<\/span> KEY_LONGPRESS_THRESHOLD_MS<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>gpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>event <span class=\"token operator\">!&#061;<\/span> APP_KEY_LONGPRESS_EVENT<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n                        <span class=\"token comment\">\/\/ \u957f\u6309\u89e6\u53d1<\/span><br \/>\ngpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>event <span class=\"token operator\">&#061;<\/span> APP_KEY_LONGPRESS_EVENT<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/\/mx_send_msg(MX_KEY_HANDLE,ii,gpio_key_cfg[ii].event);<\/span><br \/>\n<span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>ii <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span> <span class=\"token comment\">\/\/ \u53d1\u9001\u4e8b\u4ef6<\/span><br \/>\n<span class=\"token function\">mx_ui_task_post<\/span><span class=\"token punctuation\">(<\/span>MX_LVGL_TASK_KEY_ID<span class=\"token punctuation\">,<\/span>gpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>event<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>ii <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">mx_ui_task_post<\/span><span class=\"token punctuation\">(<\/span>MX_LVGL_TASK_TOUCH_KEY_ID<span class=\"token punctuation\">,<\/span> gpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>event<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">else<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>gpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>event <span class=\"token operator\">&#061;&#061;<\/span> APP_KEY_DEFAULE_EVENT<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\ngpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>event <span class=\"token operator\">&#061;<\/span> APP_KEY_CLICK_EVENT<span class=\"token punctuation\">;<\/span><br \/>\ngpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>status <span class=\"token operator\">&#061;<\/span> APP_KEY_INTERVAL_DEAL_STATUS<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>gpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>event <span class=\"token operator\">&gt;&#061;<\/span> APP_KEY_CLICK_EVENT<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>gpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>event <span class=\"token operator\">&gt;&#061;<\/span> APP_KEY_EVENT_NUM<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\ngpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>event <span class=\"token operator\">&#061;<\/span> APP_KEY_EVENT_NUM<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">else<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\ngpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>event<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\ngpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>status <span class=\"token operator\">&#061;<\/span> APP_KEY_INTERVAL_DEAL_STATUS<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">else<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\ngpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>status <span class=\"token operator\">&#061;<\/span> APP_KEY_LONGPRESS_WAIT_RELEASE_STATUS<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\ngpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>timer_count <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">case<\/span> APP_KEY_INTERVAL_DEAL_STATUS<span class=\"token operator\">:<\/span><br \/>\n<span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>key_press<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u591a\u51fb\u5904\u7406<\/span><br \/>\ngpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>status <span class=\"token operator\">&#061;<\/span> APP_KEY_DOWN_STATUS<span class=\"token punctuation\">;<\/span><br \/>\ngpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>timer_count <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">else<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u591a\u51fb\u7b49\u5f85<\/span><br \/>\n<span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>gpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>timer_count <span class=\"token operator\">*<\/span> TIMER_PERIOD <span class=\"token operator\">&gt;&#061;<\/span> KEY_CHECKER_INTERVAL_MS<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u591a\u51fb\u7ed3\u675f<\/span><br \/>\ngpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>status <span class=\"token operator\">&#061;<\/span> APP_KEY_DEFAULE_EVENT<span class=\"token punctuation\">;<\/span><br \/>\ngpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>timer_count <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/mx_send_msg(MX_KEY_HANDLE,ii,gpio_key_cfg[ii].event);<\/span><br \/>\n<span class=\"token comment\">\/\/ \u591a\u51fb\u89e6\u53d1<\/span><br \/>\n<span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>ii <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">mx_ui_task_post<\/span><span class=\"token punctuation\">(<\/span>MX_LVGL_TASK_KEY_ID<span class=\"token punctuation\">,<\/span>gpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>event<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>ii <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">mx_ui_task_post<\/span><span class=\"token punctuation\">(<\/span>MX_LVGL_TASK_TOUCH_KEY_ID<span class=\"token punctuation\">,<\/span> gpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>event<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>gpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>event <span class=\"token operator\">&#061;<\/span> APP_KEY_DEFAULE_EVENT<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">case<\/span> APP_KEY_LONGPRESS_WAIT_RELEASE_STATUS<span class=\"token operator\">:<\/span><br \/>\n<span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>key_press<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\ngpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>status <span class=\"token operator\">&#061;<\/span> APP_KEY_DEFAULE_EVENT<span class=\"token punctuation\">;<\/span><br \/>\ngpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>timer_count <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>gpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>event <span class=\"token operator\">&#061;&#061;<\/span> APP_KEY_LONGLONGPRESS_EVENT<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>gpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>event <span class=\"token operator\">&#061;&#061;<\/span> APP_KEY_LONGPRESS_EVENT<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>gpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>event <span class=\"token operator\">&#061;<\/span> APP_KEY_DEFAULE_EVENT<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">default<\/span><span class=\"token operator\">:<\/span><br \/>\ngpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>status <span class=\"token operator\">&#061;<\/span> APP_KEY_DEFAULE_EVENT<span class=\"token punctuation\">;<\/span><br \/>\ngpio_key_cfg<span class=\"token punctuation\">[<\/span>ii<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>timer_count <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">static<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">mx_key_scan_init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/ \u521d\u59cb\u5316\u6309\u952e<\/span><br \/>\n<span class=\"token keyword\">for<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> CFG_HW_GPIOKEY_NUM<span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">gpio_direction_input<\/span><span class=\"token punctuation\">(<\/span>gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_config<span class=\"token punctuation\">.<\/span>port<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">gpio_set_pull_down<\/span><span class=\"token punctuation\">(<\/span>gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_config<span class=\"token punctuation\">.<\/span>port<span class=\"token punctuation\">,<\/span> gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_config<span class=\"token punctuation\">.<\/span>config<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">gpio_set_pull_up<\/span><span class=\"token punctuation\">(<\/span>gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_config<span class=\"token punctuation\">.<\/span>port<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">!<\/span>gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_config<span class=\"token punctuation\">.<\/span>config<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">gpio_set_die<\/span><span class=\"token punctuation\">(<\/span>gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_config<span class=\"token punctuation\">.<\/span>port<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5b9a\u671f\u626b\u63cf<\/span><br \/>\n    <span class=\"token function\">sys_timer_add_to_task<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;sys_timer&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span> hal_key_debounce_handler<span class=\"token punctuation\">,<\/span> TIMER_PERIOD<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">static<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">mx_key_init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">production_test_io_get<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token function\">sys_timeout_add_to_task<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;sys_timer&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span> mx_key_scan_init<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1000<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><span class=\"token comment\">\/\/1\u79d2\u540e\u518d\u68c0\u6d4b\u6309\u952e<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token function\">late_initcall<\/span><span class=\"token punctuation\">(<\/span>mx_key_init<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h3>STM32F429IGT6\u5229\u7528\u72b6\u6001\u673a\u5b9e\u73b0\u6309\u952e\u7684\u975e\u963b\u585e\u68c0\u6d4b<\/h3>\n<p>\u5176\u5b9e\u539f\u7406\u90fd\u4e00\u6837&#xff0c;\u8ddf\u6770\u91cc\u7684AC791N\u7684\u68c0\u6d4b\u662f\u5dee\u4e0d\u591a\u7684&#xff0c;\u53ea\u4e0d\u8fc7\u9700\u8981\u4e00\u4e9b\u914d\u7f6e\u800c\u5df2\u3002<\/p>\n<h4>sys_tick\u7cfb\u7edf\u65f6\u949f\u914d\u7f6e<\/h4>\n<p>sys_tick.h&#xff1a;<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifndef<\/span> <span class=\"token expression\">__SYS_TICK_H_<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">__SYS_TICK_H_<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;stm32f4xx.h&#034;<\/span>                  <span class=\"token comment\">\/\/ Device header<\/span><\/span><\/p>\n<p><span class=\"token keyword\">void<\/span> <span class=\"token function\">sys_tick_init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token class-name\">uint32_t<\/span> <span class=\"token function\">sys_tick_get_time_ms<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<p>sys_tick:<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;sys_tick.h&#034;<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/*\u5168\u5c40\u8ba1\u6570\u53d8\u91cf*\/<\/span><br \/>\n<span class=\"token keyword\">static<\/span> <span class=\"token keyword\">volatile<\/span> <span class=\"token class-name\">uint32_t<\/span> sys_tick_cnt <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n  * &#064;brief  \u6ef4\u7b54\u5b9a\u65f6\u5668\u914d\u7f6e<br \/>\n  * &#064;note   \u5b9a\u65f6\u65f6\u95f41ms, SystemCoreClock &#061; 180000000<br \/>\n  * &#064;param  None<br \/>\n  * &#064;retval None<br \/>\n  *\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">sys_tick_init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">SysTick_Config<\/span><span class=\"token punctuation\">(<\/span>SystemCoreClock <span class=\"token operator\">\/<\/span> <span class=\"token number\">1000<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">while<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/*\u914d\u7f6e\u9519\u8bef\u6b7b\u5faa\u73af*\/<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n  * &#064;brief  SysTick\u65f6\u949f\u6ea2\u51fa\u56de\u8c03&#xff0c;\u63d0\u4f9b\u7cfb\u7edf\u5fc3\u8df3\u8282\u62cd<br \/>\n  * &#064;note   \u9700\u8981\u6ce8\u91ca\u6389stm32f4xx_it.c\u4e2d\u539f\u672c\u7684\u56de\u8c03\u51fd\u6570<br \/>\n  * &#064;param  None<br \/>\n  * &#064;retval None<br \/>\n  *\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">SysTick_Handler<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\nsys_tick_cnt<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n  * &#064;brief  \u83b7\u53d6\u8ba1\u6570\u65f6\u95f4<br \/>\n  * &#064;note   None<br \/>\n  * &#064;param  None<br \/>\n  * &#064;retval \u5f53\u524d\u8ba1\u6570\u65f6\u95f4<br \/>\n  *\/<\/span><br \/>\n<span class=\"token class-name\">uint32_t<\/span> <span class=\"token function\">sys_tick_get_time_ms<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> sys_tick_cnt<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>**\u6ce8\u610f&#xff1a;**\u5728\u6211\u7684\u65f6\u949f\u6811\u914d\u7f6e\u4e2d&#xff0c;\u7cfb\u7edf\u65f6\u949f\u5c31\u662f180M&#xff0c;\u5982\u679c\u7cfb\u7edf\u65f6\u949f\u5e03\u7f6e180M\u7684&#xff0c;\u9700\u8981\u6839\u636e\u7cfb\u7edf\u914d\u7f6e\u8fdb\u884c\u4fee\u6539&#xff01;&#xff01;&#xff01;<\/p>\n<h4>\u6309\u952e\u914d\u7f6e<\/h4>\n<p>key.h:<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifndef<\/span> <span class=\"token expression\">__KEY_H_<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">__KEY_H_<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;stm32f4xx.h&#034;<\/span>                  <span class=\"token comment\">\/\/ Device header<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;gpio.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;sys_tick.h&#034;<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">KEY_NUM<\/span> <span class=\"token expression\"><span class=\"token punctuation\">(<\/span><span class=\"token number\">3<\/span><span class=\"token punctuation\">)<\/span> <\/span><span class=\"token comment\">\/*\u6309\u952e\u6570\u91cf*\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">KEY_SCANF_ENABLE<\/span> <span class=\"token expression\"><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <\/span><span class=\"token comment\">\/*\u6309\u952e\u626b\u63cf\u5f00\u5173*\/<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/*\u6309\u952e\u53c2\u6570\u914d\u7f6e*\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">KEY_DEBOUNCE_TIME_MS<\/span>     <span class=\"token expression\"><span class=\"token number\">20<\/span>      <\/span><span class=\"token comment\">\/* \u6309\u952e\u6d88\u6296\u65f6\u95f4(ms) *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">KEY_LONG_PRESS_TIME_MS<\/span>   <span class=\"token expression\"><span class=\"token number\">2000<\/span>    <\/span><span class=\"token comment\">\/* \u957f\u6309\u5224\u5b9a\u65f6\u95f4(ms) *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">KEY_DOUBLE_CLICK_GAP_MS<\/span>  <span class=\"token expression\"><span class=\"token number\">300<\/span>     <\/span><span class=\"token comment\">\/* \u53cc\u51fb\u95f4\u9694\u65f6\u95f4(ms) *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">KEY_CONTINUOUS_PRESS_MS<\/span>  <span class=\"token expression\"><span class=\"token number\">100<\/span>     <\/span><span class=\"token comment\">\/* \u8fde\u51fb\u95f4\u9694\u65f6\u95f4(ms) *\/<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/*\u89e6\u53d1\u7535\u5e73\u914d\u7f6e*\/<\/span><br \/>\n<span class=\"token keyword\">typedef<\/span> <span class=\"token keyword\">enum<\/span><span class=\"token punctuation\">{<\/span><br \/>\nGPIO_TRIGGER_LOW <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0X00<\/span><span class=\"token punctuation\">,<\/span><br \/>\nGPIO_TRIGGER_HIGH<span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> GPIO_TRIGGER_CFG<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/*\u6309\u952e\u72b6\u6001\u914d\u7f6e*\/<\/span><br \/>\n<span class=\"token keyword\">typedef<\/span> <span class=\"token keyword\">enum<\/span><span class=\"token punctuation\">{<\/span><br \/>\nKEY_STATUS_DEFAULT <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0X00<\/span><span class=\"token punctuation\">,<\/span><br \/>\nKEY_STATUS_PRESS<span class=\"token punctuation\">,<\/span><br \/>\nKEY_STATUS_DEBOUNCE<span class=\"token punctuation\">,<\/span><br \/>\nKEY_STATUS_WAIT<span class=\"token punctuation\">,<\/span> <span class=\"token comment\">\/\/ \u7b49\u5f85\u7b2c\u4e8c\u6b21\u6216\u8005\u591a\u6b21\u6309\u4e0b<\/span><br \/>\nKEY_STATUS_LONG_PRESS_WAIT_RELEASE<span class=\"token punctuation\">,<\/span> <span class=\"token comment\">\/\/ \u957f\u6309\u7b49\u5f85\u91ca\u653e\u72b6\u6001<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> KEY_STATUS_CFG<span class=\"token punctuation\">;<\/span> <\/p>\n<p><span class=\"token comment\">\/*\u6309\u952e\u4e8b\u4ef6\u914d\u7f6e*\/<\/span><br \/>\n<span class=\"token keyword\">typedef<\/span> <span class=\"token keyword\">enum<\/span><span class=\"token punctuation\">{<\/span><br \/>\nKEY_EVENT_DEFAULT <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0X00<\/span><span class=\"token punctuation\">,<\/span><br \/>\nKEY_EVENT_LONG_PRESS<span class=\"token punctuation\">,<\/span><br \/>\nKEY_EVENT_LONG_RELAX<span class=\"token punctuation\">,<\/span><br \/>\nKEY_EVENT_CLICKED<span class=\"token punctuation\">,<\/span><br \/>\nKEY_EVENT_DOUBLE_CLICKED<span class=\"token punctuation\">,<\/span><br \/>\nKEY_EVENT_THIRD_CLICKED<span class=\"token punctuation\">,<\/span><br \/>\nKEY_EVENT_FOUR_CLICKED<span class=\"token punctuation\">,<\/span><br \/>\nKEY_EVENT_MORE_CLICKED<span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> KEY_EVENT_CFG<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">typedef<\/span> <span class=\"token keyword\">struct<\/span><span class=\"token punctuation\">{<\/span><br \/>\nGPIO_TypeDef <span class=\"token operator\">*<\/span>key_port<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token class-name\">uint16_t<\/span> key_pin<span class=\"token punctuation\">;<\/span><br \/>\nGPIOPuPd_TypeDef set_input<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> KEY_CFG<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/*\u6309\u952e\u914d\u7f6e*\/<\/span><br \/>\n<span class=\"token keyword\">typedef<\/span> <span class=\"token keyword\">struct<\/span><span class=\"token punctuation\">{<\/span><br \/>\nKEY_CFG key_cofig<span class=\"token punctuation\">;<\/span><br \/>\nGPIO_TRIGGER_CFG key_trigger<span class=\"token punctuation\">;<\/span><br \/>\nKEY_STATUS_CFG key_status<span class=\"token punctuation\">;<\/span><br \/>\nKEY_EVENT_CFG key_event<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token class-name\">uint32_t<\/span> key_clicked_cnt<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/*\u6309\u952e\u6309\u4e0b\u6b21\u6570*\/<\/span><br \/>\n<span class=\"token class-name\">uint32_t<\/span> key_press_time<span class=\"token punctuation\">;<\/span>         <span class=\"token comment\">\/* \u6309\u952e\u6309\u4e0b\u65f6\u523b *\/<\/span><br \/>\n    <span class=\"token class-name\">uint32_t<\/span> key_last_click_time<span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/* \u4e0a\u4e00\u6b21\u5355\u51fb\u65f6\u523b *\/<\/span><br \/>\n    <span class=\"token class-name\">uint8_t<\/span> key_valid<span class=\"token punctuation\">;<\/span>               <span class=\"token comment\">\/* \u6309\u952e\u662f\u5426\u6709\u6548 *\/<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> KEY_CONFIG_T<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">void<\/span> <span class=\"token function\">key_gpio_init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">key_scanf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u83b7\u53d6\u6309\u952e\u4e8b\u4ef6<\/span><br \/>\nKEY_EVENT_CFG <span class=\"token function\">key_get_event<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint8_t<\/span> key_index<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<p>key.c:<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;key.h&#034;<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">if<\/span> <span class=\"token expression\">KEY_SCANF_ENABLE<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/*\u6309\u952e\u914d\u7f6e\u521d\u59cb\u5316*\/<\/span><br \/>\nKEY_CONFIG_T gpio_key_cfg<span class=\"token punctuation\">[<\/span>KEY_NUM<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span>GPIOH<span class=\"token punctuation\">,<\/span> GPIO_Pin_3<span class=\"token punctuation\">,<\/span> GPIO_PuPd_UP<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> GPIO_TRIGGER_LOW<span class=\"token punctuation\">,<\/span> KEY_STATUS_DEFAULT<span class=\"token punctuation\">,<\/span> KEY_EVENT_DEFAULT<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span>GPIOH<span class=\"token punctuation\">,<\/span> GPIO_Pin_2<span class=\"token punctuation\">,<\/span> GPIO_PuPd_UP<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> GPIO_TRIGGER_LOW<span class=\"token punctuation\">,<\/span> KEY_STATUS_DEFAULT<span class=\"token punctuation\">,<\/span> KEY_EVENT_DEFAULT<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span>GPIOC<span class=\"token punctuation\">,<\/span> GPIO_Pin_13<span class=\"token punctuation\">,<\/span> GPIO_PuPd_UP<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> GPIO_TRIGGER_LOW<span class=\"token punctuation\">,<\/span> KEY_STATUS_DEFAULT<span class=\"token punctuation\">,<\/span> KEY_EVENT_DEFAULT<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/*\u6309\u952e\u521d\u59cb\u5316*\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">key_gpio_init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">for<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint8_t<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> KEY_NUM<span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">gpio_config_begin<\/span><span class=\"token punctuation\">(<\/span>gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_cofig<span class=\"token punctuation\">.<\/span>key_port<span class=\"token punctuation\">,<\/span> gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_cofig<span class=\"token punctuation\">.<\/span>key_pin<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">gpio_set_mode<\/span><span class=\"token punctuation\">(<\/span>GPIO_Mode_IN<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">gpio_set_pupd<\/span><span class=\"token punctuation\">(<\/span>gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_cofig<span class=\"token punctuation\">.<\/span>set_input<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">gpio_config_apply<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">static<\/span> <span class=\"token class-name\">uint8_t<\/span> <span class=\"token function\">key_gpio_read<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint8_t<\/span> num<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">GPIO_ReadInputDataBit<\/span><span class=\"token punctuation\">(<\/span>gpio_key_cfg<span class=\"token punctuation\">[<\/span>num<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_cofig<span class=\"token punctuation\">.<\/span>key_port<span class=\"token punctuation\">,<\/span> gpio_key_cfg<span class=\"token punctuation\">[<\/span>num<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_cofig<span class=\"token punctuation\">.<\/span>key_pin<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> GPIO_TRIGGER_LOW<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">static<\/span> <span class=\"token class-name\">uint32_t<\/span> <span class=\"token function\">get_tick_ms<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> <span class=\"token function\">sys_tick_get_time_ms<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">void<\/span> <span class=\"token function\">key_scanf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token class-name\">uint8_t<\/span> key_press<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">uint32_t<\/span> wait_time<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">static<\/span> <span class=\"token class-name\">uint32_t<\/span> last_scan_time <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">uint32_t<\/span> current_time <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">get_tick_ms<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/* \u6309\u952e\u626b\u63cf\u95f4\u9694\u63a7\u5236&#xff08;10ms\u626b\u63cf\u4e00\u6b21&#xff09; *\/<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>current_time <span class=\"token operator\">&#8211;<\/span> last_scan_time <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">10<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    last_scan_time <span class=\"token operator\">&#061;<\/span> current_time<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">for<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint8_t<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> KEY_NUM<span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_valid<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">continue<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        key_press <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">key_gpio_read<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/* \u5982\u679c\u5df2\u7ecf\u6709\u4e8b\u4ef6\u5f85\u5904\u7406&#xff0c;\u8df3\u8fc7\u672c\u6b21\u626b\u63cf *\/<\/span><br \/>\n        <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_event <span class=\"token operator\">!&#061;<\/span> KEY_EVENT_DEFAULT<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">continue<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">switch<\/span><span class=\"token punctuation\">(<\/span>gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_status<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">case<\/span> KEY_STATUS_DEFAULT<span class=\"token operator\">:<\/span><br \/>\n                <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>key_press<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span>  <span class=\"token comment\">\/* \u68c0\u6d4b\u5230\u6309\u952e\u6309\u4e0b *\/<\/span><br \/>\n                    gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_status <span class=\"token operator\">&#061;<\/span> KEY_STATUS_DEBOUNCE<span class=\"token punctuation\">;<\/span><br \/>\n                    gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_press_time <span class=\"token operator\">&#061;<\/span> current_time<span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token keyword\">case<\/span> KEY_STATUS_DEBOUNCE<span class=\"token operator\">:<\/span><br \/>\n                <span class=\"token comment\">\/* \u6d88\u6296\u5904\u7406 *\/<\/span><br \/>\n                <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>current_time <span class=\"token operator\">&#8211;<\/span> gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_press_time <span class=\"token operator\">&gt;&#061;<\/span> KEY_DEBOUNCE_TIME_MS<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">key_gpio_read<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span>  <span class=\"token comment\">\/* \u786e\u8ba4\u6309\u952e\u6309\u4e0b *\/<\/span><br \/>\n                        gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_status <span class=\"token operator\">&#061;<\/span> KEY_STATUS_PRESS<span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><span class=\"token keyword\">else<\/span><span class=\"token punctuation\">{<\/span>  <span class=\"token comment\">\/* \u6296\u52a8&#xff0c;\u56de\u5230\u9ed8\u8ba4\u72b6\u6001 *\/<\/span><br \/>\n                        gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_status <span class=\"token operator\">&#061;<\/span> KEY_STATUS_DEFAULT<span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token keyword\">case<\/span> KEY_STATUS_PRESS<span class=\"token operator\">:<\/span><br \/>\n                <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>current_time <span class=\"token operator\">&#8211;<\/span> gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_press_time <span class=\"token operator\">&gt;&#061;<\/span> KEY_LONG_PRESS_TIME_MS<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                    gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_event <span class=\"token operator\">&#061;<\/span> KEY_EVENT_LONG_PRESS<span class=\"token punctuation\">;<\/span><br \/>\n                    gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_status <span class=\"token operator\">&#061;<\/span> KEY_STATUS_LONG_PRESS_WAIT_RELEASE<span class=\"token punctuation\">;<\/span><br \/>\n                    gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_clicked_cnt <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/* \u957f\u6309\u540e\u91cd\u7f6e\u8ba1\u6570 *\/<\/span><br \/>\n                    <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/* \u8df3\u51fa\u5f53\u524d\u6309\u952e\u7684\u72b6\u6001\u5904\u7406 *\/<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><\/p>\n<p>                <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span><span class=\"token function\">key_gpio_read<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span>  <span class=\"token comment\">\/* \u6309\u952e\u91ca\u653e *\/<\/span><br \/>\n                    <span class=\"token comment\">\/* \u77ed\u6309\u91ca\u653e&#xff0c;\u8bb0\u5f55\u91ca\u653e\u65f6\u95f4\u5e76\u8fdb\u5165\u7b49\u5f85\u72b6\u6001 *\/<\/span><br \/>\n                    gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_clicked_cnt<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/* \u589e\u52a0\u70b9\u51fb\u8ba1\u6570 *\/<\/span><br \/>\n                    gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_last_click_time <span class=\"token operator\">&#061;<\/span> current_time<span class=\"token punctuation\">;<\/span><br \/>\n                    gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_status <span class=\"token operator\">&#061;<\/span> KEY_STATUS_WAIT<span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token keyword\">case<\/span> KEY_STATUS_WAIT<span class=\"token operator\">:<\/span><br \/>\n                <span class=\"token comment\">\/* \u7b49\u5f85\u7b2c\u4e8c\u6b21\u6216\u8005\u591a\u6b21\u6309\u4e0b *\/<\/span><br \/>\n                wait_time <span class=\"token operator\">&#061;<\/span> current_time <span class=\"token operator\">&#8211;<\/span> gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_last_click_time<span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>wait_time <span class=\"token operator\">&gt;<\/span> KEY_DOUBLE_CLICK_GAP_MS<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span>  <span class=\"token comment\">\/* \u7b49\u5f85\u8d85\u65f6 *\/<\/span><br \/>\n                    <span class=\"token class-name\">uint32_t<\/span> click_count <span class=\"token operator\">&#061;<\/span> gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_clicked_cnt<span class=\"token punctuation\">;<\/span><\/p>\n<p>                    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>click_count <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_event <span class=\"token operator\">&#061;<\/span> KEY_EVENT_CLICKED<span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>click_count <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_event <span class=\"token operator\">&#061;<\/span> KEY_EVENT_DOUBLE_CLICKED<span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>click_count <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">3<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_event <span class=\"token operator\">&#061;<\/span> KEY_EVENT_THIRD_CLICKED<span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>click_count <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">4<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_event <span class=\"token operator\">&#061;<\/span> KEY_EVENT_FOUR_CLICKED<span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>click_count <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">4<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                        gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_event <span class=\"token operator\">&#061;<\/span> KEY_EVENT_MORE_CLICKED<span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><\/p>\n<p>                    <span class=\"token comment\">\/* \u89e6\u53d1\u4e8b\u4ef6\u540e&#xff0c;\u91cd\u7f6e\u72b6\u6001 *\/<\/span><br \/>\n                    gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_status <span class=\"token operator\">&#061;<\/span> KEY_STATUS_DEFAULT<span class=\"token punctuation\">;<\/span><br \/>\n                    gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_clicked_cnt <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">key_gpio_read<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span>  <span class=\"token comment\">\/* \u5728\u7b49\u5f85\u65f6\u95f4\u5185\u518d\u6b21\u6309\u4e0b *\/<\/span><br \/>\n                    gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_status <span class=\"token operator\">&#061;<\/span> KEY_STATUS_DEBOUNCE<span class=\"token punctuation\">;<\/span><br \/>\n                    gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_press_time <span class=\"token operator\">&#061;<\/span> current_time<span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token keyword\">case<\/span> KEY_STATUS_LONG_PRESS_WAIT_RELEASE<span class=\"token operator\">:<\/span><br \/>\n                <span class=\"token comment\">\/* \u957f\u6309\u7b49\u5f85\u91ca\u653e\u72b6\u6001&#xff0c;\u68c0\u6d4b\u6309\u952e\u662f\u5426\u91ca\u653e *\/<\/span><br \/>\n                <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span><span class=\"token function\">key_gpio_read<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token comment\">\/* \u89e6\u53d1\u957f\u6309\u91ca\u653e\u4e8b\u4ef6 *\/<\/span><br \/>\n                    gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_event <span class=\"token operator\">&#061;<\/span> KEY_EVENT_LONG_RELAX<span class=\"token punctuation\">;<\/span><br \/>\n                    gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_status <span class=\"token operator\">&#061;<\/span> KEY_STATUS_DEFAULT<span class=\"token punctuation\">;<\/span><br \/>\n                    gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_clicked_cnt <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token keyword\">default<\/span><span class=\"token operator\">:<\/span><br \/>\n                gpio_key_cfg<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_status <span class=\"token operator\">&#061;<\/span> KEY_STATUS_DEFAULT<span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n  * &#064;brief  \u83b7\u53d6\u6309\u952e\u4e8b\u4ef6<br \/>\n  * &#064;note   \u5728\u8c03\u7528\u8be5\u51fd\u6570\u4e4b\u524d\u5fc5\u987b\u5bf9\u6309\u952eIO\u53e3\u8fdb\u884c\u521d\u59cb\u5316&#xff0c;\u5e76\u4e14\u8fdb\u884c\u6309\u952e\u626b\u63cf<br \/>\n  * &#064;param  key_index&#xff1a;\u9700\u8981\u83b7\u53d6\u4e8b\u4ef6\u7684\u6309\u952e\u7684IO\u53e3<br \/>\n  * &#064;retval \u8fd4\u56de\u8be5IO\u53e3\u89e6\u53d1\u7684\u6309\u952e\u4e8b\u4ef6<br \/>\n  *\/<\/span><br \/>\nKEY_EVENT_CFG <span class=\"token function\">key_get_event<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">uint8_t<\/span> key_index<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>key_index <span class=\"token operator\">&gt;&#061;<\/span> KEY_NUM <span class=\"token operator\">||<\/span> <span class=\"token operator\">!<\/span>gpio_key_cfg<span class=\"token punctuation\">[<\/span>key_index<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_valid<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> KEY_EVENT_DEFAULT<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    KEY_EVENT_CFG event <span class=\"token operator\">&#061;<\/span> gpio_key_cfg<span class=\"token punctuation\">[<\/span>key_index<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_event<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u89e6\u53d1\u5b8c\u6210\u540e\u6e05\u7a7a\u6309\u952e\u4e8b\u4ef6<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>event <span class=\"token operator\">!&#061;<\/span> KEY_EVENT_DEFAULT<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        gpio_key_cfg<span class=\"token punctuation\">[<\/span>key_index<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>key_event <span class=\"token operator\">&#061;<\/span> KEY_EVENT_DEFAULT<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> event<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<p>\u4e0b\u9762\u662f\u5728main.c\u4e2d\u8fd0\u884c&#xff1a;<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;stm32f4xx.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;gpio.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;sys_tick.h&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;key.h&#034;<\/span><\/span><\/p>\n<p><span class=\"token keyword\">void<\/span> <span class=\"token function\">sys_init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u4e24\u4e2aled\u706f\u7684\u521d\u59cb\u5316<\/span><br \/>\n<span class=\"token function\">gpio_config_begin<\/span><span class=\"token punctuation\">(<\/span>GPIOB<span class=\"token punctuation\">,<\/span> GPIO_Pin_0<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">gpio_config_apply<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">gpio_config_begin<\/span><span class=\"token punctuation\">(<\/span>GPIOB<span class=\"token punctuation\">,<\/span> GPIO_Pin_1<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">gpio_config_apply<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token function\">sys_tick_init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">key_gpio_init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">sys_init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>KEY_EVENT_CFG event0<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">for<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">;<\/span><span class=\"token punctuation\">;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">key_scanf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">sys_tick_get_time_ms<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">1000<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">%<\/span> <span class=\"token number\">2<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span> <span class=\"token comment\">\/\/ led0, 1s\u4eae\u706d\u4e00\u6b21<\/span><br \/>\n<span class=\"token function\">GPIO_ResetBits<\/span><span class=\"token punctuation\">(<\/span>GPIOB<span class=\"token punctuation\">,<\/span> GPIO_Pin_0<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span><span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">GPIO_SetBits<\/span><span class=\"token punctuation\">(<\/span>GPIOB<span class=\"token punctuation\">,<\/span> GPIO_Pin_0<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>event0 <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">key_get_event<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>event0 <span class=\"token operator\">&#061;&#061;<\/span> KEY_EVENT_LONG_PRESS<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span> <span class=\"token comment\">\/\/ led1\u7531\u6309\u952e\u63a7\u5236\u4eae\u706d<\/span><br \/>\n<span class=\"token function\">GPIO_SetBits<\/span><span class=\"token punctuation\">(<\/span>GPIOB<span class=\"token punctuation\">,<\/span> GPIO_Pin_1<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>event0 <span class=\"token operator\">&#061;&#061;<\/span> KEY_EVENT_LONG_RELAX<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">GPIO_ResetBits<\/span><span class=\"token punctuation\">(<\/span>GPIOB<span class=\"token punctuation\">,<\/span> GPIO_Pin_1<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h4>\u9644\u4e0a&#xff1a;\u4e0a\u9762\u4ee3\u7801\u4e2d\u7684led\u706fgpio\u7684\u914d\u7f6e<\/h4>\n<p>gpio\u505a\u4e86\u666e\u9002\u6027\u9002\u914d&#xff0c;\u53ef\u901a\u8fc7\u63a5\u53e3\u4fee\u6539\u914d\u7f6e&#xff0c;\u4e5f\u53ef\u4ee5\u4f7f\u7528\u9ed8\u8ba4\u914d\u7f6e\u3002<\/p>\n<p>gpio.h:<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifndef<\/span> <span class=\"token expression\">__GPIO_H_<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">__GPIO_H_<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;stm32f4xx.h&#034;<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/*\u7a7a\u6307\u9488\u5b9a\u4e49*\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifndef<\/span> <span class=\"token expression\"><span class=\"token constant\">NULL<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifdef<\/span> <span class=\"token expression\">__cplusplus<\/span><\/span><br \/>\n    <span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NULL<\/span> <span class=\"token expression\"><span class=\"token number\">0<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">else<\/span><\/span><br \/>\n    <span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NULL<\/span> <span class=\"token expression\"><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * &#064;brief \u83b7\u53d6GPIO\u7aef\u53e3\u5bf9\u5e94\u7684\u65f6\u949f\u4f7f\u80fd\u4f4d<br \/>\n * &#064;param GPIOx: GPIO\u7aef\u53e3&#xff0c;\u53ef\u4ee5\u662fGPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH, GPIOI<br \/>\n * &#064;return \u5bf9\u5e94\u7684RCC\u65f6\u949f\u4f7f\u80fd\u4f4d<br \/>\n *\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">GET_GPIO_CLOCK_ENABLE<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span>GPIOx<span class=\"token punctuation\">)<\/span>                                        <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token expression\"><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>GPIOx<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> GPIOA <span class=\"token operator\">?<\/span> RCC_AHB1Periph_GPIOA <span class=\"token operator\">:<\/span>                              <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n     <span class=\"token expression\"><span class=\"token punctuation\">(<\/span>GPIOx<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> GPIOB <span class=\"token operator\">?<\/span> RCC_AHB1Periph_GPIOB <span class=\"token operator\">:<\/span>                              <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n     <span class=\"token expression\"><span class=\"token punctuation\">(<\/span>GPIOx<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> GPIOC <span class=\"token operator\">?<\/span> RCC_AHB1Periph_GPIOC <span class=\"token operator\">:<\/span>                              <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n     <span class=\"token expression\"><span class=\"token punctuation\">(<\/span>GPIOx<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> GPIOD <span class=\"token operator\">?<\/span> RCC_AHB1Periph_GPIOD <span class=\"token operator\">:<\/span>                              <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n     <span class=\"token expression\"><span class=\"token punctuation\">(<\/span>GPIOx<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> GPIOE <span class=\"token operator\">?<\/span> RCC_AHB1Periph_GPIOE <span class=\"token operator\">:<\/span>                              <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n     <span class=\"token expression\"><span class=\"token punctuation\">(<\/span>GPIOx<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> GPIOF <span class=\"token operator\">?<\/span> RCC_AHB1Periph_GPIOF <span class=\"token operator\">:<\/span>                              <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n     <span class=\"token expression\"><span class=\"token punctuation\">(<\/span>GPIOx<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> GPIOG <span class=\"token operator\">?<\/span> RCC_AHB1Periph_GPIOG <span class=\"token operator\">:<\/span>                              <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n     <span class=\"token expression\"><span class=\"token punctuation\">(<\/span>GPIOx<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> GPIOH <span class=\"token operator\">?<\/span> RCC_AHB1Periph_GPIOH <span class=\"token operator\">:<\/span>                              <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n     <span class=\"token expression\"><span class=\"token punctuation\">(<\/span>GPIOx<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> GPIOI <span class=\"token operator\">?<\/span> RCC_AHB1Periph_GPIOI <span class=\"token operator\">:<\/span><\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n <span class=\"token expression\"><span class=\"token punctuation\">(<\/span>GPIOx<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> GPIOJ <span class=\"token operator\">?<\/span> RCC_AHB1Periph_GPIOJ <span class=\"token operator\">:<\/span>                              <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n     <span class=\"token expression\"><span class=\"token punctuation\">(<\/span>GPIOx<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> GPIOK <span class=\"token operator\">?<\/span> RCC_AHB1Periph_GPIOK <span class=\"token operator\">:<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * &#064;brief \u5224\u65adGPIO\u7aef\u53e3\u6302\u8f7d\u7684\u603b\u7ebf\u7c7b\u578b<br \/>\n * &#064;param GPIOx: GPIO\u7aef\u53e3<br \/>\n * &#064;return \u603b\u7ebf\u7c7b\u578b&#xff1a;RCC_APB2Periph_GPIOx, RCC_APB1Periph_GPIOx, RCC_AHB1Periph_GPIOx\u7b49<br \/>\n * &#064;note \u5bf9\u4e8eSTM32F429IGT6&#xff0c;\u6240\u6709GPIO\u90fd\u6302\u5728AHB1\u603b\u7ebf\u4e0a<br \/>\n *\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">GET_GPIO_BUS_TYPE<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span>GPIOx<span class=\"token punctuation\">)<\/span> RCC_AHB1Periph_GPIOx<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * &#064;brief \u4f7f\u80fdGPIO\u7aef\u53e3\u65f6\u949f<br \/>\n * &#064;param GPIOx: GPIO\u7aef\u53e3<br \/>\n * &#064;note \u6839\u636eGPIO\u7aef\u53e3\u81ea\u52a8\u9009\u62e9\u5bf9\u5e94\u7684\u65f6\u949f\u4f7f\u80fd\u4f4d&#xff0c;\u5e76\u5f00\u542fAHB1\u603b\u7ebf\u65f6\u949f<br \/>\n *\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">GPIO_CLOCK_ENABLE<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span>GPIOx<span class=\"token punctuation\">)<\/span>                                            <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token expression\"><span class=\"token keyword\">do<\/span> <span class=\"token punctuation\">{<\/span>                                                                    <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n        <span class=\"token expression\"><span class=\"token class-name\">uint32_t<\/span> rcc_periph <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">GET_GPIO_CLOCK_ENABLE<\/span><span class=\"token punctuation\">(<\/span>GPIOx<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>                 <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n        <span class=\"token expression\"><span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>rcc_periph <span class=\"token operator\">!&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>                                              <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n            <span class=\"token expression\"><span class=\"token function\">RCC_AHB1PeriphClockCmd<\/span><span class=\"token punctuation\">(<\/span>rcc_periph<span class=\"token punctuation\">,<\/span> ENABLE<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>                     <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n        <span class=\"token expression\"><span class=\"token punctuation\">}<\/span>                                                                   <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token expression\"><span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">while<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * &#064;brief \u5173\u95edGPIO\u7aef\u53e3\u65f6\u949f<br \/>\n * &#064;param GPIOx: GPIO\u7aef\u53e3<br \/>\n *\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">GPIO_CLOCK_DISABLE<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span>GPIOx<span class=\"token punctuation\">)<\/span>                                           <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token expression\"><span class=\"token keyword\">do<\/span> <span class=\"token punctuation\">{<\/span>                                                                    <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n        <span class=\"token expression\"><span class=\"token class-name\">uint32_t<\/span> rcc_periph <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">GET_GPIO_CLOCK_ENABLE<\/span><span class=\"token punctuation\">(<\/span>GPIOx<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>                 <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n        <span class=\"token expression\"><span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>rcc_periph <span class=\"token operator\">!&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>                                              <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n            <span class=\"token expression\"><span class=\"token function\">RCC_AHB1PeriphClockCmd<\/span><span class=\"token punctuation\">(<\/span>rcc_periph<span class=\"token punctuation\">,<\/span> DISABLE<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>                    <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n        <span class=\"token expression\"><span class=\"token punctuation\">}<\/span>                                                                   <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token expression\"><span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">while<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * &#064;brief  \u5f00\u59cb\u914d\u7f6e\u4e00\u4e2a\u65b0\u7684GPIO\u5f15\u811a&#xff08;\u81ea\u52a8\u91cd\u7f6e\u4e3a\u9ed8\u8ba4\u914d\u7f6e&#xff09;<br \/>\n * &#064;note   \u6bcf\u6b21\u5f00\u59cb\u914d\u7f6e\u5f15\u811a\u524d\u90fd\u8981\u5148\u8c03\u7528\u8be5\u63a5\u53e3<br \/>\n * &#064;param  GPIOx: GPIO\u7aef\u53e3<br \/>\n * &#064;param  GPIO_Pin_x: GPIO\u5f15\u811a<br \/>\n * &#064;note   \u81ea\u52a8\u91cd\u7f6e\u4e3a\u9ed8\u8ba4\u914d\u7f6e&#xff0c;\u5e76\u8bb0\u5f55\u5f15\u811a\u4fe1\u606f<br \/>\n *\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">gpio_config_begin<\/span><span class=\"token punctuation\">(<\/span>GPIO_TypeDef <span class=\"token operator\">*<\/span>GPIOx<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint16_t<\/span> GPIO_Pin_x<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * &#064;brief  \u8bbe\u7f6eGPIO\u6a21\u5f0f<br \/>\n * &#064;param  mode: GPIO\u6a21\u5f0f<br \/>\n *\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">gpio_set_mode<\/span><span class=\"token punctuation\">(<\/span>GPIOMode_TypeDef mode<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * &#064;brief  \u8bbe\u7f6eGPIO\u8f93\u51fa\u7c7b\u578b&#xff08;\u4ec5\u5bf9\u8f93\u51fa\u548c\u590d\u7528\u6a21\u5f0f\u6709\u6548&#xff09;<br \/>\n * &#064;param  type: GPIO\u8f93\u51fa\u7c7b\u578b<br \/>\n *\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">gpio_set_output_type<\/span><span class=\"token punctuation\">(<\/span>GPIOOType_TypeDef type<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * &#064;brief  \u8bbe\u7f6eGPIO\u4e0a\u4e0b\u62c9\u7535\u963b<br \/>\n * &#064;param  pupd: GPIO\u4e0a\u4e0b\u62c9\u914d\u7f6e<br \/>\n *\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">gpio_set_pupd<\/span><span class=\"token punctuation\">(<\/span>GPIOPuPd_TypeDef pupd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * &#064;brief  \u8bbe\u7f6eGPIO\u901f\u5ea6<br \/>\n * &#064;param  speed: GPIO\u901f\u5ea6<br \/>\n *\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">gpio_set_speed<\/span><span class=\"token punctuation\">(<\/span>GPIOSpeed_TypeDef speed<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * &#064;brief  \u5e94\u7528\u914d\u7f6e\u5230\u786c\u4ef6&#xff08;\u6267\u884cGPIO_Init&#xff09;<br \/>\n * &#064;note   \u4f7f\u80fd\u65f6\u949f&#xff0c;\u6267\u884cGPIO\u521d\u59cb\u5316&#xff0c;\u7136\u540e\u81ea\u52a8\u91cd\u7f6e\u5185\u90e8\u72b6\u6001,\u5f15\u811a\u914d\u7f6e\u5b8c\u6210\u540e\u5fc5\u987b\u8c03\u7528<br \/>\n *\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">gpio_config_apply<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>gpio.c:<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;gpio.h&#034;<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/*\u9759\u6001\u5168\u5c40\u53d8\u91cf\u5b9a\u4e49*\/<\/span><br \/>\nGPIO_InitTypeDef  GPIO_InitStructure<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/* \u9ed8\u8ba4\u914d\u7f6e\u7ed3\u6784\u4f53 *\/<\/span><br \/>\n<span class=\"token keyword\">typedef<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    GPIOMode_TypeDef mode<span class=\"token punctuation\">;<\/span><br \/>\n    GPIOOType_TypeDef type<span class=\"token punctuation\">;<\/span><br \/>\n    GPIOPuPd_TypeDef pupd<span class=\"token punctuation\">;<\/span><br \/>\n    GPIOSpeed_TypeDef speed<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> GPIO_Config<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/* \u9ed8\u8ba4\u914d\u7f6e\u5b9a\u4e49 *\/<\/span><br \/>\nGPIO_Config gpio_default_config <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span>mode <span class=\"token operator\">&#061;<\/span> GPIO_Mode_OUT<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span>type <span class=\"token operator\">&#061;<\/span> GPIO_OType_PP<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span>pupd <span class=\"token operator\">&#061;<\/span> GPIO_PuPd_NOPULL<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span>speed <span class=\"token operator\">&#061;<\/span> GPIO_Speed_100MHz<br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/* \u5f53\u524d\u914d\u7f6e*\/<\/span><br \/>\n<span class=\"token keyword\">static<\/span> GPIO_Config <span class=\"token operator\">*<\/span>current_config <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&amp;<\/span>gpio_default_config<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/* \u5f53\u524d\u5f15\u811a\u4fe1\u606f*\/<\/span><br \/>\n<span class=\"token keyword\">static<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    GPIO_TypeDef<span class=\"token operator\">*<\/span> GPIOx<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">uint16_t<\/span> GPIO_Pin_x<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">uint8_t<\/span> clock_enabled<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/* \u65f6\u949f\u662f\u5426\u5df2\u4f7f\u80fd *\/<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> current_pin_info <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * &#064;brief  \u5f00\u59cb\u914d\u7f6e\u4e00\u4e2a\u65b0\u7684GPIO\u5f15\u811a&#xff08;\u81ea\u52a8\u91cd\u7f6e\u4e3a\u9ed8\u8ba4\u914d\u7f6e&#xff09;<br \/>\n * &#064;param  GPIOx: GPIO\u7aef\u53e3<br \/>\n * &#064;param  GPIO_Pin_x: GPIO\u5f15\u811a<br \/>\n * &#064;note   \u81ea\u52a8\u91cd\u7f6e\u4e3a\u9ed8\u8ba4\u914d\u7f6e&#xff0c;\u5e76\u8bb0\u5f55\u5f15\u811a\u4fe1\u606f<br \/>\n *\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">gpio_config_begin<\/span><span class=\"token punctuation\">(<\/span>GPIO_TypeDef <span class=\"token operator\">*<\/span>GPIOx<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">uint16_t<\/span> GPIO_Pin_x<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/* \u91cd\u7f6e\u4e3a\u9ed8\u8ba4\u914d\u7f6e *\/<\/span><br \/>\n    current_config <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&amp;<\/span>gpio_default_config<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/* \u8bb0\u5f55\u5f15\u811a\u4fe1\u606f *\/<\/span><br \/>\n    current_pin_info<span class=\"token punctuation\">.<\/span>GPIOx <span class=\"token operator\">&#061;<\/span> GPIOx<span class=\"token punctuation\">;<\/span><br \/>\n    current_pin_info<span class=\"token punctuation\">.<\/span>GPIO_Pin_x <span class=\"token operator\">&#061;<\/span> GPIO_Pin_x<span class=\"token punctuation\">;<\/span><br \/>\n    current_pin_info<span class=\"token punctuation\">.<\/span>clock_enabled <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * &#064;brief  \u8bbe\u7f6eGPIO\u6a21\u5f0f<br \/>\n * &#064;param  mode: GPIO\u6a21\u5f0f<br \/>\n *\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">gpio_set_mode<\/span><span class=\"token punctuation\">(<\/span>GPIOMode_TypeDef mode<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    current_config<span class=\"token operator\">-&gt;<\/span>mode <span class=\"token operator\">&#061;<\/span> mode<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * &#064;brief  \u8bbe\u7f6eGPIO\u8f93\u51fa\u7c7b\u578b&#xff08;\u4ec5\u5bf9\u8f93\u51fa\u548c\u590d\u7528\u6a21\u5f0f\u6709\u6548&#xff09;<br \/>\n * &#064;param  type: GPIO\u8f93\u51fa\u7c7b\u578b<br \/>\n *\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">gpio_set_output_type<\/span><span class=\"token punctuation\">(<\/span>GPIOOType_TypeDef type<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    current_config<span class=\"token operator\">-&gt;<\/span>type <span class=\"token operator\">&#061;<\/span> type<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * &#064;brief  \u8bbe\u7f6eGPIO\u4e0a\u4e0b\u62c9\u7535\u963b<br \/>\n * &#064;param  pupd: GPIO\u4e0a\u4e0b\u62c9\u914d\u7f6e<br \/>\n *\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">gpio_set_pupd<\/span><span class=\"token punctuation\">(<\/span>GPIOPuPd_TypeDef pupd<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    current_config<span class=\"token operator\">-&gt;<\/span>pupd <span class=\"token operator\">&#061;<\/span> pupd<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * &#064;brief  \u8bbe\u7f6eGPIO\u901f\u5ea6<br \/>\n * &#064;param  speed: GPIO\u901f\u5ea6<br \/>\n *\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">gpio_set_speed<\/span><span class=\"token punctuation\">(<\/span>GPIOSpeed_TypeDef speed<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    current_config<span class=\"token operator\">-&gt;<\/span>speed <span class=\"token operator\">&#061;<\/span> speed<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * &#064;brief  \u5e94\u7528\u914d\u7f6e\u5230\u786c\u4ef6&#xff08;\u6267\u884cGPIO_Init&#xff09;<br \/>\n * &#064;note   \u4f7f\u80fd\u65f6\u949f&#xff0c;\u6267\u884cGPIO\u521d\u59cb\u5316&#xff0c;\u7136\u540e\u81ea\u52a8\u91cd\u7f6e\u5185\u90e8\u72b6\u6001<br \/>\n *\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">gpio_config_apply<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>current_pin_info<span class=\"token punctuation\">.<\/span>GPIOx <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/* \u5f15\u811a\u4fe1\u606f\u65e0\u6548&#xff0c;\u672a\u8c03\u7528gpio_config_begin *\/<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/* \u4f7f\u80fdGPIO\u65f6\u949f *\/<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>current_pin_info<span class=\"token punctuation\">.<\/span>clock_enabled<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">GPIO_CLOCK_ENABLE<\/span><span class=\"token punctuation\">(<\/span>current_pin_info<span class=\"token punctuation\">.<\/span>GPIOx<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        current_pin_info<span class=\"token punctuation\">.<\/span>clock_enabled <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/* \u914d\u7f6eGPIO\u521d\u59cb\u5316\u7ed3\u6784\u4f53 *\/<\/span><br \/>\n    GPIO_InitTypeDef GPIO_InitStructure<span class=\"token punctuation\">;<\/span><\/p>\n<p>    GPIO_InitStructure<span class=\"token punctuation\">.<\/span>GPIO_Mode <span class=\"token operator\">&#061;<\/span> current_config<span class=\"token operator\">-&gt;<\/span>mode<span class=\"token punctuation\">;<\/span><br \/>\n    GPIO_InitStructure<span class=\"token punctuation\">.<\/span>GPIO_Pin <span class=\"token operator\">&#061;<\/span> current_pin_info<span class=\"token punctuation\">.<\/span>GPIO_Pin_x<span class=\"token punctuation\">;<\/span><br \/>\n    GPIO_InitStructure<span class=\"token punctuation\">.<\/span>GPIO_PuPd <span class=\"token operator\">&#061;<\/span> current_config<span class=\"token operator\">-&gt;<\/span>pupd<span class=\"token punctuation\">;<\/span><br \/>\n    GPIO_InitStructure<span class=\"token punctuation\">.<\/span>GPIO_Speed <span class=\"token operator\">&#061;<\/span> current_config<span class=\"token operator\">-&gt;<\/span>speed<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/* \u4ec5\u5bf9\u8f93\u51fa\u6a21\u5f0f\u548c\u590d\u7528\u6a21\u5f0f\u8bbe\u7f6e\u8f93\u51fa\u7c7b\u578b *\/<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>current_config<span class=\"token operator\">-&gt;<\/span>mode <span class=\"token operator\">&#061;&#061;<\/span> GPIO_Mode_OUT <span class=\"token operator\">||<\/span><br \/>\n        current_config<span class=\"token operator\">-&gt;<\/span>mode <span class=\"token operator\">&#061;&#061;<\/span> GPIO_Mode_AF<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        GPIO_InitStructure<span class=\"token punctuation\">.<\/span>GPIO_OType <span class=\"token operator\">&#061;<\/span> current_config<span class=\"token operator\">-&gt;<\/span>type<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/* \u6267\u884c\u521d\u59cb\u5316 *\/<\/span><br \/>\n    <span class=\"token function\">GPIO_Init<\/span><span class=\"token punctuation\">(<\/span>current_pin_info<span class=\"token punctuation\">.<\/span>GPIOx<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>GPIO_InitStructure<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/* \u91cd\u7f6e\u5185\u90e8\u72b6\u6001*\/<\/span><br \/>\n    current_pin_info<span class=\"token punctuation\">.<\/span>GPIOx <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    current_pin_info<span class=\"token punctuation\">.<\/span>GPIO_Pin_x <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    current_pin_info<span class=\"token punctuation\">.<\/span>clock_enabled <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>**\u6ce8\u610f&#xff1a;**\u5728\u4f7f\u7528\u4e0a\u9762\u7684gpio\u914d\u7f6e\u4f7f&#xff0c;\u5fc5\u987b\u4ee5gpio_config_begin\u8fd9\u4e2a\u51fd\u6570\u5f00\u59cb&#xff0c;\u5fc5\u987b\u4ee5gpio_config_apply\u8fd9\u4e2a\u51fd\u6570\u7ed3\u675f&#xff0c;\u624d\u80fd\u5b8c\u6210\u5bf9\u4e00\u4e2agpio\u7684\u914d\u7f6e&#xff01;&#xff01;&#xff01;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5173\u4e8e\u5355\u7247\u673a\u6309\u952e\u975e\u963b\u585e\u68c0\u6d4b\u7684\u4e00\u79cd\u65b9\u6cd5<br \/>\n\u6309\u952e\u4f5c\u4e3a\u4e00\u79cd\u5f00\u5173\u578b\u7684\u786c\u4ef6\u5916\u8bbe&#xff0c;\u5728\u5927\u90e8\u5206\u7684\u5d4c\u5165\u5f0f\u5355\u7247\u673a\u8f6f\u4ef6\u5f00\u53d1\u4e2d\u90fd\u4f1a\u4f7f\u7528\u5230\u3002\u4f46\u662f&#xff0c;\u5355\u7247\u673a\u7684\u5f00\u53d1\u5f88\u591a\u65f6\u5019\u90fd\u662f\u88f8\u673a\u5f00\u53d1&#xff0c;\u51e0\u4e4e\u7528\u4e0d\u5230RTOS&#xff0c;\u88f8\u673a\u5f00\u53d1\u8bf4\u660e\u5355\u7247\u673a\u662f\u6309\u987a\u5e8f\u6267\u884c\u7684&#xff0c;\u662f\u4e2a\u5355\u7ebf\u7a0b\u7cfb\u7edf&#xff0c;\u800c\u6309\u952e\u68c0\u6d4b\u9700\u8981\u8fdb\u884c\u6d88\u6296&#xff0c;\u6d88\u6296\u662f\u9700\u8981\u7b49\u5f85\u7684&#xff0c;\u5728\u88f8\u673a\u7cfb\u7edf\u4e2d&#xff0c;\u5c31\u4f1a\u9020\u6210\u963b\u585e&#xff0c;\u5bfc\u81f4\u7cfb\u7edf\u6027\u80fd\u4e0b\u964d\u3002<br \/>\n\u4e0b\u9762&#xff0c;\u662f\u4e00\u4e2a<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[822,270],"topic":[],"class_list":["post-66611","post","type-post","status-publish","format-standard","hentry","category-server","tag-mcu","tag-270"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u5173\u4e8e\u5355\u7247\u673a\u6309\u952e\u975e\u963b\u585e\u65b9\u5f0f\u89e6\u53d1\u7684\u4e00\u79cd\u65b9\u6cd5 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/66611.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u5173\u4e8e\u5355\u7247\u673a\u6309\u952e\u975e\u963b\u585e\u65b9\u5f0f\u89e6\u53d1\u7684\u4e00\u79cd\u65b9\u6cd5 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\u5173\u4e8e\u5355\u7247\u673a\u6309\u952e\u975e\u963b\u585e\u68c0\u6d4b\u7684\u4e00\u79cd\u65b9\u6cd5 \u6309\u952e\u4f5c\u4e3a\u4e00\u79cd\u5f00\u5173\u578b\u7684\u786c\u4ef6\u5916\u8bbe&#xff0c;\u5728\u5927\u90e8\u5206\u7684\u5d4c\u5165\u5f0f\u5355\u7247\u673a\u8f6f\u4ef6\u5f00\u53d1\u4e2d\u90fd\u4f1a\u4f7f\u7528\u5230\u3002\u4f46\u662f&#xff0c;\u5355\u7247\u673a\u7684\u5f00\u53d1\u5f88\u591a\u65f6\u5019\u90fd\u662f\u88f8\u673a\u5f00\u53d1&#xff0c;\u51e0\u4e4e\u7528\u4e0d\u5230RTOS&#xff0c;\u88f8\u673a\u5f00\u53d1\u8bf4\u660e\u5355\u7247\u673a\u662f\u6309\u987a\u5e8f\u6267\u884c\u7684&#xff0c;\u662f\u4e2a\u5355\u7ebf\u7a0b\u7cfb\u7edf&#xff0c;\u800c\u6309\u952e\u68c0\u6d4b\u9700\u8981\u8fdb\u884c\u6d88\u6296&#xff0c;\u6d88\u6296\u662f\u9700\u8981\u7b49\u5f85\u7684&#xff0c;\u5728\u88f8\u673a\u7cfb\u7edf\u4e2d&#xff0c;\u5c31\u4f1a\u9020\u6210\u963b\u585e&#xff0c;\u5bfc\u81f4\u7cfb\u7edf\u6027\u80fd\u4e0b\u964d\u3002 \u4e0b\u9762&#xff0c;\u662f\u4e00\u4e2a\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/66611.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-26T16:25:01+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/66611.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/66611.html\",\"name\":\"\u5173\u4e8e\u5355\u7247\u673a\u6309\u952e\u975e\u963b\u585e\u65b9\u5f0f\u89e6\u53d1\u7684\u4e00\u79cd\u65b9\u6cd5 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-01-26T16:25:01+00:00\",\"dateModified\":\"2026-01-26T16:25:01+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/66611.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/66611.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/66611.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u5173\u4e8e\u5355\u7247\u673a\u6309\u952e\u975e\u963b\u585e\u65b9\u5f0f\u89e6\u53d1\u7684\u4e00\u79cd\u65b9\u6cd5\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u5173\u4e8e\u5355\u7247\u673a\u6309\u952e\u975e\u963b\u585e\u65b9\u5f0f\u89e6\u53d1\u7684\u4e00\u79cd\u65b9\u6cd5 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/66611.html","og_locale":"zh_CN","og_type":"article","og_title":"\u5173\u4e8e\u5355\u7247\u673a\u6309\u952e\u975e\u963b\u585e\u65b9\u5f0f\u89e6\u53d1\u7684\u4e00\u79cd\u65b9\u6cd5 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\u5173\u4e8e\u5355\u7247\u673a\u6309\u952e\u975e\u963b\u585e\u68c0\u6d4b\u7684\u4e00\u79cd\u65b9\u6cd5 \u6309\u952e\u4f5c\u4e3a\u4e00\u79cd\u5f00\u5173\u578b\u7684\u786c\u4ef6\u5916\u8bbe&#xff0c;\u5728\u5927\u90e8\u5206\u7684\u5d4c\u5165\u5f0f\u5355\u7247\u673a\u8f6f\u4ef6\u5f00\u53d1\u4e2d\u90fd\u4f1a\u4f7f\u7528\u5230\u3002\u4f46\u662f&#xff0c;\u5355\u7247\u673a\u7684\u5f00\u53d1\u5f88\u591a\u65f6\u5019\u90fd\u662f\u88f8\u673a\u5f00\u53d1&#xff0c;\u51e0\u4e4e\u7528\u4e0d\u5230RTOS&#xff0c;\u88f8\u673a\u5f00\u53d1\u8bf4\u660e\u5355\u7247\u673a\u662f\u6309\u987a\u5e8f\u6267\u884c\u7684&#xff0c;\u662f\u4e2a\u5355\u7ebf\u7a0b\u7cfb\u7edf&#xff0c;\u800c\u6309\u952e\u68c0\u6d4b\u9700\u8981\u8fdb\u884c\u6d88\u6296&#xff0c;\u6d88\u6296\u662f\u9700\u8981\u7b49\u5f85\u7684&#xff0c;\u5728\u88f8\u673a\u7cfb\u7edf\u4e2d&#xff0c;\u5c31\u4f1a\u9020\u6210\u963b\u585e&#xff0c;\u5bfc\u81f4\u7cfb\u7edf\u6027\u80fd\u4e0b\u964d\u3002 \u4e0b\u9762&#xff0c;\u662f\u4e00\u4e2a","og_url":"https:\/\/www.wsisp.com\/helps\/66611.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-01-26T16:25:01+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"14 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/66611.html","url":"https:\/\/www.wsisp.com\/helps\/66611.html","name":"\u5173\u4e8e\u5355\u7247\u673a\u6309\u952e\u975e\u963b\u585e\u65b9\u5f0f\u89e6\u53d1\u7684\u4e00\u79cd\u65b9\u6cd5 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-01-26T16:25:01+00:00","dateModified":"2026-01-26T16:25:01+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/66611.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/66611.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/66611.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"\u5173\u4e8e\u5355\u7247\u673a\u6309\u952e\u975e\u963b\u585e\u65b9\u5f0f\u89e6\u53d1\u7684\u4e00\u79cd\u65b9\u6cd5"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/66611","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=66611"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/66611\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=66611"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=66611"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=66611"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=66611"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}