上一次講了ESP8266這塊芯片的深度開發(fā)的準(zhǔn)備工作和有關(guān)編譯指導(dǎo)文件makefile的一些要點(diǎn)肥荔,那么這一次就來(lái)講講關(guān)于SDK的正式開發(fā)吧。
程序入口
首先谒拴,在工程文件夾下找到app文件夾串结,再打開user文件夾蒿柳,如上圖所示阵难,從user文件夾中找到user_main.c這個(gè)文件岳枷,這就是我們程序的主程序了。打開文件呜叫,找到user_init()空繁,這就是我們程序的入口函數(shù)了(SDK1.5版本以上的還有user_rf_pre_init()這個(gè)函數(shù),不過(guò)我們的主程序還是在user_init()里面編輯就好朱庆,user_rf_pre_init()這個(gè)函數(shù)可以留空函數(shù))盛泡。
串口設(shè)置
串口調(diào)試可以說(shuō)是SDK開發(fā)的一個(gè)必要環(huán)節(jié),只有通過(guò)串口通訊環(huán)節(jié)娱颊,我們才有了和芯片溝通的能力傲诵,所以串口設(shè)置是我比較推薦在user_init()里面最先編寫的部分。下面是幾個(gè)常用函數(shù):
- void uart_init(UartBautRate uart0_br, UartBautRate uart1_br)
功能:雙 uart 模式维蒙,兩個(gè) uart 波特率初始化掰吕;
ESP8266有兩個(gè)串口通道果覆,第一個(gè)參數(shù)是uart0的波特率颅痊,第一個(gè)參數(shù)是uart1的波特率,芯片默認(rèn)的波特率是78840局待,我建議是改成115200或者9600這兩個(gè)使用率比較高的波特率斑响,當(dāng)然你用其他的波特率也可以菱属,只要你所設(shè)置的和你的串口調(diào)試工具中的設(shè)置能對(duì)應(yīng)起來(lái)就行。 - void uart0_sendStr(const char *str)
功能:通過(guò) UART0 發(fā)送用戶自定義數(shù)據(jù)舰罚;
由于我用的是ESP8266-01的板纽门,它默認(rèn)引出來(lái)的串口就是uart0,所以我的串口打印數(shù)據(jù)就用這個(gè)函數(shù)营罢,參數(shù)可以直接輸入字符串赏陵,十分方便。
IO口設(shè)置
- void gpio_output_set(uint32 set_mask, uint32 clear_mask, uint32 enable_mask,
uint32 disable_mask)
功能:設(shè)置 gpio 口屬性
例子:
設(shè)置 GPIO12 輸出高電平饲漾,則:gpio_output_set(BIT12, 0, BIT12, 0);
設(shè)置 GPIO12 輸出低電平蝙搔,則:gpio_output_set(0, BIT12, BIT12, 0);
設(shè)置 GPIO12 輸出高電平,GPIO13 輸出低電平考传,則:gpio_output_set(BIT12,BIT13, BIT12|BIT13, 0);
設(shè)置 GPIO12 為輸入吃型,則 gpio_output_set(0, 0, 0, BIT12); - void gpio_pin_intr_state_set(uint32 i, GPIO_INT_TYPE intr_state)
功能:設(shè)置 gpio 腳中斷觸發(fā)狀態(tài)
輸入?yún)?shù):
uint32 i——GPIO 管腳 ID,如需設(shè)置 GPIO14僚楞,則為 GPIO_ID_PIN(14)勤晚;
GPIO_INT_TYPE intr_state——中斷觸發(fā)狀態(tài)
其中:
typedef enum{
GPIO_PIN_INTR_DISABLE = 0, (不觸發(fā)中斷)
GPIO_PIN_INTR_POSEDGE= 1,(上升沿觸發(fā))
GPIO_PIN_INTR_NEGEDGE= 2,(下降沿觸發(fā))
GPIO_PIN_INTR_ANYEGDE=3,
GPIO_PIN_INTR_LOLEVEL= 4, (低電平觸發(fā))
GPIO_PIN_INTR_HILEVEL = 5,(高電平觸發(fā))
}GPIO_INT_TYPE; - GPIO_OUTPUT_SET(gpio_no, bit_value)
設(shè)置 gpio_no 管腳輸出 bit_value,同上述例子中輸出高低電平的功能泉褐。 - GPIO_DIS_OUTPUT(gpio_no)
設(shè)置 gpio_no 管腳為輸入赐写,同上述例子中輸入。 - GPIO_INPUT_GET(gpio_no)
獲取 gpio_no 管腳的電平狀態(tài)膜赃。
例子
如果我們要使用GPIO12這個(gè)IO口血淌,只需要配置以下幾步
// Use MTDI pin as GPIO12.
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);
//輸出高電平
GPIO_OUTPUT_SET(FUNC_GPIO12, 1);
//配置輸入
GPIO_DIS_OUTPUT(FUNC_GPIO12);
//獲得GPIO電平
uin16 status=GPIO_INPUT_GET(FUNC_GPIO12);
//配置GPIO中斷處理函數(shù):
ETS_GPIO_INTR_ATTACH(func, arg)
使用方法:先定義一個(gè)GPIO中斷處理函數(shù)财剖,arg如果沒有參數(shù)直接輸入NULL
void GPIO_INTER(void)
{
......//這一部分可以加入自己想要響應(yīng)中斷的函數(shù)悠夯;
在 GPIO 中斷處理函數(shù)內(nèi),需要做如下操作來(lái)清除響應(yīng)位的中斷狀態(tài):
uint32 gpio_status;
gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
//clear interrupt status
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status);
}
ETS_GPIO_INTR_ATTACH(GPIO_INTER, NULL); //注冊(cè) GPIO 中斷處理函數(shù)
WIFI設(shè)置
由于ESP8266是一塊wifi芯片躺坟,所以wifi的配置是少不了的沦补。
芯片的wifi工作模式有以下三種:
- STATION_MODE(客戶端模式,也就是主動(dòng)去連接路由器)
- SOFTAP_MODE(服務(wù)器模式咪橙,也就是可以充當(dāng)路由器夕膀,等其他設(shè)備連接)
- STATIONAP_MODE(主從一體模式,也就是俗稱的wifi中繼功能)
常用的函數(shù)是下列幾個(gè):
- wifi_get_opmode(void)
功能:獲取 wifi 工作模式美侦;
wifi 工作模式产舞,其中 0x01 時(shí)為 STATION_MODE,0x02 時(shí)為 SOFTAP_MODE菠剩,
0x03 時(shí)為 STATIONAP_MODE易猫。 - wifi_set_opmode(uint8 opmode)
功能:設(shè)置 wifi 工作模式為 STATION、SOFTAP具壮、STATION+SOFTAP
其中 STATION_MODE 為 0x01准颓,SOFTAP_MODE 為 0x02哈蝇,STATIONAP_MODE 為0x03。 - wifi_station_set_config(struct station_config *config)
功能:設(shè)置 wifi 的 station 接口參數(shù)攘已。
其中炮赦,參數(shù)中結(jié)構(gòu)體定義如下:
struct station_config {
uint8 ssid[32];
uint8 password[64];
};
以下為wifi配置的例子,只需修改SSID和PASSWORD即可工作:
<pre><code>user_set_station_config(void)
{
// Wifi configuration
char ssid[32] = SSID; //SSID為輸入的你的路由名稱
char password[64] = PASSWORD; //PASSWORD為輸入的wifi密碼
struct station_config stationConf;
//need not mac address
stationConf.bssid_set = 0;
//Set ap settings
os_memcpy(&stationConf.ssid, ssid, 32);
os_memcpy(&stationConf.password, password, 64);
wifi_station_set_config(&stationConf);
//set a timer to check whether got ip from router succeed or not.
os_timer_disarm(&client_timer);
os_timer_setfn(&client_timer, (os_timer_func_t *)user_check_ip, NULL);
os_timer_arm(&client_timer, 100, 0);
}</pre></code>
在user_init()中:
<pre><code>void user_init(void)
{
//Set uart port
uart_init(115200,9600);
os_printf("SDK version:%s\n", system_get_sdk_version());
//Set station mode
wifi_set_opmode(STATION_MODE);
//ESP8266 connect to router
user_set_station_config();
}</pre></code>
總結(jié)
通過(guò)今天的介紹样勃,大家應(yīng)該已經(jīng)了解了SDK的基礎(chǔ)工作函數(shù)了吠勘,而我們的ESP8266已經(jīng)可以順利地連上路由器了,當(dāng)然連上路由器僅僅是基礎(chǔ)峡眶,關(guān)于后續(xù)的網(wǎng)絡(luò)通訊開發(fā)我們下次再敘看幼。