ESP8266模擬串列埠
阿新 • • 發佈:2019-02-13
GPIO初始化
void ICACHE_FLASH_ATTR bluetooth_uart_init() { 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); //0 gpio_output_set(BIT4, 0, BIT4, 0); //1 drv_Input_Init(); }
輸入中斷配置
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 中斷處理函式 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(); }
硬體定時器回撥函式
#define bond 52 unsigned 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){// tou gpio_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; } }