陳拓 [email protected] 2020/06/19-2020/06/22
1. 概述
在實際工作中我們經常用到較爲精確的延時,比如在讀取溫度傳感器DS18B20時。
ESP8266 Non-OS SDK的延時函數os_delay_us的最大值是65535us,我們可以通過循環來增加延時。
我們用來測量的樣品是ESP8266-01S,測試儀器是廣州致遠的LA1016邏輯分析儀。
2. 毫秒級延時
- 測試代碼
#include "gpio.h"
LOCAL void ICACHE_FLASH_ATTR delay_ms(u32 x)
{
for(;x>0;x--) {
os_delay_us(1000);
}
}
void user_init(void)
{
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U,FUNC_GPIO2);
while(1) {
GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 1);
delay_ms(1);
GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 0);
delay_ms(1);
}
}
代碼寫在文件user_main.c的void user_init(void)函數中。
- 邏輯分析儀設置
- 測試
ESP8266先上電,在邏輯分析儀界面上點擊“啓動(單次)”按鈕
查看波形,測量時間。
高電平延時:
一個週期延時:
可以看到1ms的延時很準確。
3. 微秒級延時
- 1us測試代碼
while(1) {
GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 1);
os_delay_us(1);
GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 0);
os_delay_us(1);
}
- 邏輯分析儀設置
- 波形和時間測量
高電平延時:
低電平延時:
可以看到1us延時實測超過2us,而且高低電平延時有差異。
一個週期的測量:
- 10us測試代碼
while(1) {
GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 1);
os_delay_us(10);
GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 0);
os_delay_us(10);
}
- 10us波形和測量
高電平延時:
一個週期延時:
由此可以看出微秒延時誤差大約是+1us~+2us。時間越短誤差越大。