單片機(jī)開發(fā)中最熟悉的就是定時(shí)器開發(fā)了,定時(shí)器有軟件和硬件之分,這里我們主要以硬件定時(shí)器為主來(lái)進(jìn)行介紹,一般的MCU都有3~15個(gè)不等的硬件定時(shí)器,HWTIMER(Hardware Timer)設(shè)備驅(qū)動(dòng)開發(fā)主要是講硬件定時(shí)器外設(shè)功能對(duì)街道設(shè)備框架上。先來(lái)看下HWTIMER設(shè)備驅(qū)動(dòng) 框架的層級(jí)結(jié)構(gòu):
這里最主要是要理解兩層的概念,HWTIMER設(shè)備驅(qū)動(dòng)框架層,這是一層通用的軟件抽象層,與具體的硬件無(wú)關(guān),框架代碼為hwtimer.c,提供以下功能:
- 向I/O設(shè)備管理層提供統(tǒng)一的接口供其調(diào)用。
- 向設(shè)備驅(qū)動(dòng)層提供具體的設(shè)備操作方法入口(函數(shù)指針)由其進(jìn)行實(shí)現(xiàn)。
- 提供注冊(cè)接口管理API,讓驅(qū)動(dòng)層與框架層產(chǎn)生聯(lián)系。 我們具體要實(shí)現(xiàn)的事HWTIMER設(shè)備驅(qū)動(dòng)層,一般命名為drv_hwtimer.c,也就是構(gòu)架中紅線的部分。
接下來(lái)創(chuàng)建一個(gè)HWTIMER設(shè)備,這個(gè)設(shè)備對(duì)象要與構(gòu)架產(chǎn)生了聯(lián)系,所以必須由rt_hwtimer_device結(jié)構(gòu)中派生出新的對(duì)象:
struct stm32_hwtimer
{
rt_hwtimer_t time_device; /*HWTIMER設(shè)備基類*/
TIM_HandleTypeDef tim_handle; /*STM32定時(shí)器控制句柄*/
IRQn_Type tim_irqn; /*STM32定時(shí)器中斷類型*/
char *name; /*STM32定時(shí)器名稱*/
};
MCU一般不會(huì)只開一個(gè)定時(shí)器,以最常用的需要開多個(gè)定時(shí)器為例,所以我們實(shí)現(xiàn)上要建立的也是一個(gè)定時(shí)器列表:
#ifdef BSP_USING_TIM1
#ifndef TIM1_CONFIG
#define TIM1_CONFIG \
{ \
.tim_handle.Instance = TIM1, \
.tim_irqn = TIM1_IRQn, \
.name = "timer1", \
}
#endif /* TIM1_CONFIG */
#endif /* BSP_USING_TIM1 */
static struct stm32_hwtimer stm32_hwtimer_obj[] =
{
#ifdef BSP_USING_TIM1
TIM1_CONFIG,
#endif
#ifdef BSP_USING_TIM2
TIM2_CONFIG,
#endif
#ifdef BSP_USING_TIM3
TIM3_CONFIG,
#endif
#ifdef BSP_USING_TIM4
TIM4_CONFIG,
#endif
......
}
這里并沒有初始化stm32_hwtimer_obj對(duì)象的所有字段,它并不完整,需要再后續(xù)的開發(fā)中進(jìn)行賦值比如調(diào)用ops中相應(yīng)函數(shù)進(jìn)行進(jìn)一步的初始化:
struct rt_hwtimer_ops
{
void (*init)(struct rt_hwtimer_device *timer, rt_uint32_t state);
rt_err_t (*start)(struct rt_hwtimer_device *timer, rt_uint32_t cnt, rt_hwtimer_mode_t mode);
void (*stop)(struct rt_hwtimer_device *timer);
rt_uint32_t (*count_get)(struct rt_hwtimer_device *timer);
rt_err_t (*control)(struct rt_hwtimer_device *timer, rt_uint32_t cmd, void *args);
};
真正的驅(qū)動(dòng)開始需要實(shí)例化這些ops,下篇詳細(xì)講解關(guān)于ops如何實(shí)現(xiàn)的,感謝閱讀~!