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

esp8266 GPIO模擬串列埠


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

}


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); //0
	gpio_output_set(BIT4, 0, BIT4, 0); //1

	drv_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() {

}



















相關推薦

esp8266 GPIO模擬串列

#include "driver/uart.h" #include "osapi.h" #include "smartconfig.h" #include "user_interface.h" #include "osapi.h" #include "ip_addr.h"

通用GPIO模擬串列,提供原始碼,本人經過測試OK。(第一版)

--------------------------serial.h------------------------------------------ #ifndef _SERIAL_H_ #define _SERIAL_H_ #define my_board #ifde

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(

教你如何在51微控制器上模擬串列通訊!!!

我們可以不使用微控制器本身帶有的串列埠,而自己用程式去模擬一個串列埠並達到和本身的串列埠具有同樣的功能, 首先,我們需要用到CH340串列埠模組,大家可以上某寶自行購買。 正面: 反面:   然後我們需要了解一下這串列埠模組上的引腳: 5V  :與VCC短路為5V TL

定時器IO模擬串列傳輸

@far @interrupt void TIM2_isr(void) { TIM2->SR1 &= 0x7E; TIM2->CNTRH = 0; TIM2->CNTRL = 0; if(mBT.status == BT_STATE_TX) // 傳輸 {

模擬串列UART的實現

我所禱告的,就是要你們的愛心,在知識和見識上,多而又多,使你們能分辨是非,做誠實無過的人,直到基督的日子。——腓立比書【1:9~10】 最近在調的MCU的型號為STM32F030,配置晶片相較之前的MCU都比較簡單,功能配置很順利。但是在寫串列埠程式的時候,發現串列埠一直不通,使用示波器也沒有波形。因為基本

在210上做io口模擬串列

核心版本:linux3.0.8 CPU:s5pv210 在driver/char/ 目錄下新增驅動IO_URAT.c /************************************* NAME:IO-UART.c *******************

esp8266-SDK的串列傳送和中斷接收

其實用esp8266編寫串列埠程式非常簡單,因為它都給我們寫好了,只要呼叫 uart_init(115200,115200);這個函式就可以。 1、傳送 呼叫uart_init(115200,115200);初始化串列埠,波特率設定為115200.前面一個是設定uart0

STM32模擬串列輸出偶有亂碼

因為晶片串列埠不夠用,只好用IO口模擬串列埠,在網上下載了個模擬串列埠的程式,可執行,但發現串列埠輸出隔幾個字元就會出現亂碼,主要部分程式碼如下: #define OI_TXD PAout(12) #define OI_RXD PAin(11) #define Buad

用STM32F103RCT6的普通IO口模擬串列的實驗

使用了STM32CubeMX及Keil (HAL庫)材料:stm32開發板、USB轉TTL?CH340模組、杜邦線、st-link實驗原理:模擬了非同步半雙工通訊波特率可變起始位:1資料位:8停止位:1(1個數據10位)無校驗位傳輸一個字元的時候先發送1位起始位,然後是8位資

STM32HAL----USB模擬串列(VCP)

      想要實現的功能是,USB模擬串列埠收發資料。串列埠助手傳送資料至MCU,MCU接收後返回給串列埠助手。       當初是想用標準庫做這個功能的。但是因為後來瞭解到STM32CubeMX這個軟體,在嘗試之後實在是感覺,太方便了。所以,並沒有使用標準庫,而是直接用

stc15f104w模擬串列使用

       stc15f104w微控制器體積小,全8個引腳完全夠一般的控制使用,最小系統也就是個電路濾波----加上一個47uf電容和一個103電容即可,但因為其是一個5V微控制器,供電需要使用5V左右電源。          該款微控制器視乎沒

Linux 虛擬串列(可用於在本機上模擬串列進行除錯)

http://blog.sina.com.cn/s/blog_6cb543ef0100x90j.html Python語言: #! /usr/bin/env python#coding=utf-8importptyimportosimportselectdefmkpty

使用微控制器普通IO口模擬串列的三種方法

隨著微控制器的使用日益頻繁,用其作前置機進行採集和通訊也常見於各種應用,一般是利用前置 機採集各種終端資料後進行處理、儲存,再主動或被動上報給管理站。這種情況下下,採集會需 要一個串列埠,上報又需要另一個串列埠,這就要求微控制器具有雙串列埠的功能,但我們知道一般的51 系列只提供一個串列埠,那麼另一

STM8 I口模擬串列通訊

使用普通的IO口,模擬串列埠協議, 和PC端串列埠除錯軟體實現通訊。 網上找了很多資料,有很多網友有些程式,但是感覺都不是很完整,無意間看到ST官方居然有實現,直接下載程式碼開始用。 針對官方的IO口模擬串列埠軟體,簡單介紹下用到資源。 由於模擬的串列埠RX腳,對於電平的

AliOS-Things--ESP8266-linkkitapp-串列(二)

/* * Copyright (C) 2015-2017 Alibaba Group Holding Limited * * * this is a uart sample from hal uart for esp8266, and the same as other

ALIENTEK 的 ESP8266 WiFi Module 刷入韌體後出現don’t use rtc mem data錯誤或者ESP8266開啟串列不停出現亂碼的解決方案

ESP8266 WiFi Module 刷入韌體後出現don’t use rtc mem data 出現問題: 重新整理新的韌體後,出現錯誤提示:don’t use rtc mem data 或各種讀寫地址錯誤。 1、A fatal error occurred

FPGA Verilog 串列無限多位元組收發+流水燈程式+ModelSim模擬

工作環境(藍色粗體字為特別注意內容) 1,軟體環境:Windows 7、Quartus II、ModelSim SE、串列埠除錯助手 2,硬體環境:開發板:EP2C5T144C8N核心板、USB Blaster下載器 發現網上的FPGA學習資料多如牛毛,質量參差不齊,最近正好比較閒,於是花了三天

esp8266網路自動對時 串列字元連線 病顯示 12864i2c u8g2庫

給別人定做的 做的 集成了 煙霧感測器 dht11 u8g2 網路 自動對時 #include <dht11.h>//程式中呼叫了dht11的庫 #include <Arduino.h> #include <U8g2lib.h> #ifdef

esp8266 探測MAC地址,串列輸出.環境 Aruduino1.85

esp8266混雜模式下的接收資料回撥函式 promisc_cb 解析資料 串列埠輸出。 #include <ESP8266WiFi.h> #include "./sniffer.h" #define disable 0 #define CHANNEL 1