rt-thread 是通過 I/O 設備模型來管理 soc 上的外設,從上到下分為三層:I/O 設備管理層、設備驅動框架層和設備驅動層。stm32 的 HAL 庫就屬于設備驅動層,比如熟知的 i2c、spi 的外設驅動在用 cubemx 生成代碼的時候就已經準備好。中科藍訊的 ab32vg1 的設備驅動已經在sdk 中由藍訊的工程師實現。而在設備驅動層之上的設備驅動框架層和設備 I/O 管理層要說明一下:設備驅動框架層提供了一些接口留給設備驅動開發者去實現,只在做驅動移植的時候需要,作為普通用戶,只需要關心 I/O 管理層即可,rt-thread 的 I/O 管理層提供了類似于 linux中文件 IO 的 ap,常用的有 rt_device_find、rt_device_open、rt_device_read、rt_device_close等。下面列舉了 hwtimer 的 api,結合示例去理解如何將這些 api 用起來實現定時器的功能。
//查找設備
/*
name:設備名稱
*/
rt_device_t rt_device_find(const char* name)
//打開定時器設備
/*
dev:定時器設備句柄
oflags:打開模式,一般取 RT_DEVICE_OFLAG_RDWR
*/
rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflags);
//設置超時回調
/*
dev:定時器設備句柄
rx_ind:超時回調函數
*/
rt_err_t rt_device_set_rx_indicate(rt_device_t dev, rt_err_t (*rx_ind)(rt_device_t dev,rt_size_t size))
//控制定時器
/*
dev:定時器設備句柄
cmd:控制命令,可取
HWTIMER_CTRL_FREQ_SET 設置計數頻率
HWTIMER_CTRL_STOP 停止定時器
HWTIMER_CTRL_INFO_GET 獲取定時器特征信息
HWTIMER_CTRL_MODE_SET 設置定時器模式
arg:控制命令參數
設置定時器模式時,可取
HWTIMER_MODE_ONESHOT 單 次 定 時
HWTIMER_MODE_PERIOD 周 期 性 定 時
*/
rt_err_t rt_device_control(rt_device_t dev, rt_uint8_t cmd, void* arg);
//設置定時器超時值
/*
dev:定時器設備句柄
pos:偏移值,未使用,可取 0 值
buffer:指向超時時間結構體
size:超時時間結構體大小
*/
rt_size_t rt_device_write(rt_device_t dev,
rt_off_t pos,
const void* buffer,
rt_size_t size);
//獲取定時器當前值
/*
dev:定時器句柄
pos:偏移值,未使用,可取 0 值
buffer:超時時間結構體
size:超時時間結構體大小
*/
rt_size_t rt_device_read(rt_device_t dev,
rt_off_t pos,
void* buffer,
rt_size_t size
);
//關閉定時器
/*
dev:定時器句柄
*/
rt_err_t rt_device_close(rt_device_t dev);
使用 rt-thread studio 進行 sdk 的開發是一件非常有效率的事情,新建 bsp 工程后只需要在rt-thread setting 配置需要的硬件功能就可以使用 rt-thread 提供的設備 I/O 管理接口對底層的 soc 的外設進行控制。從示例中可以定時器的流程:先用 rt_device_find 根據設備名稱查找到定時器句柄、使用定時器句柄打開定時器、接著設置定時器的回調函數、配置完定時器后設置定時器的定時值后定時器啟動,之后每當定時器的計數器溢出就會執行一次定時器的回調函數。
審核編輯:湯梓紅
-
操作系統
+關注
關注
37文章
6836瀏覽量
123361 -
定時器
+關注
關注
23文章
3250瀏覽量
114897 -
Timer
+關注
關注
1文章
64瀏覽量
12794 -
RT-Thread
+關注
關注
31文章
1291瀏覽量
40187
發布評論請先 登錄
相關推薦
評論