esp8266 GPIO模拟串口

来源:互联网 发布:广电网络高清机顶盒 编辑:程序博客网 时间:2024/06/06 14:04
/* *       程序移植 *备注信息详情以sdk编程手册为准。 *如有问题请加ESP8266技术支持(1533579290)进行反馈 *                                  */#include "driver/uart.h"#include "osapi.h"#include "smartconfig.h"#include "user_interface.h"#include "osapi.h"#include "ip_addr.h"#include"syp_server.h"#include "sntp.h"#include "gpio.h"void ICACHE_FLASH_ATTR to_scan(void);void ICACHE_FLASH_ATTR syp_smartconfig_done_cb(void);ETSTimer gpio_timer;//=================================================================/** 开关输入相关 宏定义 */#define SWITCH_Pin_NUM         5#define SWITCH_Pin_FUNC        FUNC_GPIO5#define SWITCH_Pin_MUX         PERIPHS_IO_MUX_GPIO5_U#define SWITCH_Pin_Rd_Init()   GPIO_DIS_OUTPUT(SWITCH_Pin_NUM)#define SWITCH_Pin_Wr_Init()   GPIO_OUTPUT_SET(SWITCH_Pin_NUM,0)#define SWITCH_Pin_Set_High()  GPIO_OUTPUT_SET(SWITCH_Pin_NUM,1)#define SWITCH_Pin_Set_Low()   GPIO_OUTPUT_SET(SWITCH_Pin_NUM,0)#define SWITCH_Pin_State       ( GPIO_INPUT_GET(SWITCH_Pin_NUM) != 0 )//=================================================================#define  bond 52unsigned int hw_test_timer_num = 0;char send_flag = 0;char send_char_date;char recive_flag = 0;char recive_char_date;void hw_test_timer_cb(void){static char num = 0;static char recive_num = 0;char flag;if(send_flag){num++;if(num < 2){// tougpio_output_set(0, BIT4, BIT4, 0); //0}else if (num == 19){gpio_output_set(BIT4, 0, BIT4, 0); //1}else if (num == 20){send_flag = 0;}else if((num % 2) == 1){flag = (send_char_date >> (num / 2 - 1)) & 0x01;if (flag) {gpio_output_set(BIT4, 0, BIT4, 0); //1//uart0_sendStr("0");} else {gpio_output_set(0, BIT4, BIT4, 0); //0//uart0_sendStr("1");}}}else{num = 0;}//====================================================if(recive_flag){recive_num++;if(recive_num < 3){recive_char_date = 0;}else if (19 == recive_num){ //接收完成recive_flag = 0; /** 读取GPIO中断状态 */    u32 pin_status = GPIO_REG_READ( GPIO_STATUS_ADDRESS );    /** 清除GPIO中断标志 */    GPIO_REG_WRITE( GPIO_STATUS_W1TC_ADDRESS, pin_status );    ETS_GPIO_INTR_ENABLE();//uart0_sendStr("0");uart_tx_one_char(UART0, recive_char_date);}else if((recive_num % 2) == 1){//接收数据if(SWITCH_Pin_State){//recive_char_date = recive_char_date | (1 << ( recive_num / 2 - 2));recive_char_date = recive_char_date | (1 << ( (recive_num+1) / 2 - 2));}}}else{recive_num = 0;}}void ICACHE_FLASH_ATTR gpio_send_char(char c){send_flag = 1;send_char_date = c;}void ICACHE_FLASH_ATTR gpio_read(void *arg){char i;//uart0_sendStr("gpio_read\r\n");gpio_send_char(0x38);}//========================================================================static void GPIO_ISR_Handler( void ){    /** 读取GPIO中断状态 */    u32 pin_status = GPIO_REG_READ( GPIO_STATUS_ADDRESS );    /** 关闭GPIO中断 */    ETS_GPIO_INTR_DISABLE();    /** 清除GPIO中断标志 */    GPIO_REG_WRITE( GPIO_STATUS_W1TC_ADDRESS, pin_status );    /** 检测是否已开关输入引脚中断 */    if ( pin_status & BIT( SWITCH_Pin_NUM ) )    {    recive_flag = 1;    }    //uart0_sendStr("I");    /** 开启GPIO中断 */    //ETS_GPIO_INTR_ENABLE();}static void drv_Input_Init( void ){    PIN_FUNC_SELECT( SWITCH_Pin_MUX, SWITCH_Pin_FUNC );    SWITCH_Pin_Rd_Init();    ETS_GPIO_INTR_DISABLE();    ETS_GPIO_INTR_ATTACH( &GPIO_ISR_Handler, NULL );    gpio_pin_intr_state_set( GPIO_ID_PIN( SWITCH_Pin_NUM ),    GPIO_PIN_INTR_NEGEDGE );    /** 清除该引脚的GPIO中断标志 */    GPIO_REG_WRITE( GPIO_STATUS_W1TC_ADDRESS, BIT(SWITCH_Pin_NUM) );    ETS_GPIO_INTR_ENABLE();}//=================================================================void user_init()          //程序入口{struct station_config config;//syp_system_init();//wifi_station_get_config(&config);uart_init(115200, 115200);uart0_sendStr("\r\n ===uart0===  \r\n");os_printf("\r\n ===uart1=== \r\n");hw_timer_init (0,1);hw_timer_set_func(hw_test_timer_cb);hw_timer_arm (bond);PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4);PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U,FUNC_GPIO14);gpio_output_set(0, BIT14, BIT14, 0); //0gpio_output_set(BIT4, 0, BIT4, 0); //1drv_Input_Init();os_timer_disarm(&gpio_timer); //关闭定时器,connect_timer使能定时器os_timer_setfn(&gpio_timer, gpio_read, NULL);          //定时器回调函数os_timer_arm(&gpio_timer, 200, 1); //定时器2s扫描一次}void user_rf_pre_init() {}

原创粉丝点击