性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

程序小白
認(rèn)證:優(yōu)質(zhì)創(chuàng)作者
所在專題目錄 查看專題
RT-Thread驅(qū)動(dòng)之路:stm32設(shè)備驅(qū)動(dòng)開發(fā)之淺析注冊(cè)機(jī)制⑤
RT-Thread驅(qū)動(dòng)之路:stm32設(shè)備驅(qū)動(dòng)開發(fā)之SPI原理①
RT-Thread驅(qū)動(dòng)之路:stm32設(shè)備驅(qū)動(dòng)開發(fā)之SPI對(duì)象創(chuàng)建②
RT-Thread驅(qū)動(dòng)之路:stm32設(shè)備驅(qū)動(dòng)開發(fā)之SPI總線操作方法③
RT-Thread驅(qū)動(dòng)之路:stm32設(shè)備驅(qū)動(dòng)開發(fā)之HWTIMER開發(fā)①
RT-Thread驅(qū)動(dòng)之路: Studio硬件移植篇①
作者動(dòng)態(tài) 更多
基于stm32采用PWM驅(qū)動(dòng)伺服控制器學(xué)習(xí)筆記
5天前
基于STM32驅(qū)動(dòng)TM1638學(xué)習(xí)筆記——軟件篇
04-19 12:42
基于TM1638驅(qū)動(dòng)8位數(shù)碼管設(shè)計(jì)分享
02-24 11:26
RT-Thread驅(qū)動(dòng)之路: Studio創(chuàng)建FAL分區(qū)⑤
01-02 08:30
RT-Thread驅(qū)動(dòng)之路: Studio 掛載通用SPI flash④
2024-12-23 13:41

RT-Thread驅(qū)動(dòng)之路:stm32設(shè)備驅(qū)動(dòng)開發(fā)之HWTIMER開發(fā)①


      單片機(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)的,感謝閱讀~!

聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場(chǎng)。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請(qǐng)聯(lián)系:editor@netbroad.com
覺得內(nèi)容不錯(cuò)的朋友,別忘了一鍵三連哦!
贊 4
收藏 5
關(guān)注 150
成為作者 賺取收益
全部留言
0/200
成為第一個(gè)和作者交流的人吧