1. 程式人生 > >ESP8266模擬串列埠

ESP8266模擬串列埠

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;
	}

}