日韩在线不卡免费视频一区,日韩欧美精品一区二区三区经典,日产精品码2码三码四码区,人妻无码一区二区三区免费,日本feerbbwdh少妇丰满

程序小白
認(rèn)證:優(yōu)質(zhì)創(chuàng)作者
所在專(zhuān)題目錄 查看專(zhuān)題
RT-Thread驅(qū)動(dòng)之路:stm32設(shè)備驅(qū)動(dòng)開(kāi)發(fā)之uart操作方法③
RT-Thread驅(qū)動(dòng)之路:stm32設(shè)備驅(qū)動(dòng)開(kāi)發(fā)之uart中斷處理④
RT-Thread驅(qū)動(dòng)之路:stm32設(shè)備驅(qū)動(dòng)開(kāi)發(fā)之淺析注冊(cè)機(jī)制⑤
RT-Thread驅(qū)動(dòng)之路:stm32設(shè)備驅(qū)動(dòng)開(kāi)發(fā)之SPI原理①
RT-Thread驅(qū)動(dòng)之路:stm32設(shè)備驅(qū)動(dòng)開(kāi)發(fā)之SPI對(duì)象創(chuàng)建②
RT-Thread驅(qū)動(dòng)之路:stm32設(shè)備驅(qū)動(dòng)開(kāi)發(fā)之SPI總線(xiàn)操作方法③
作者動(dòng)態(tài) 更多
基于stm32采用PWM驅(qū)動(dòng)伺服控制器學(xué)習(xí)筆記
05-13 15:25
基于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)開(kāi)發(fā)之SPI對(duì)象創(chuàng)建②


開(kāi)篇分割線(xiàn),再研究驅(qū)動(dòng)程序之前我們先看下RTT 關(guān)于SPI應(yīng)用的代碼層級(jí)結(jié)構(gòu):

      應(yīng)用層:只做應(yīng)用層開(kāi)發(fā)的小伙伴是有福的,你不需要了解整個(gè)驅(qū)動(dòng)是怎樣構(gòu)架的,只需要了解驅(qū)動(dòng)構(gòu)架層提供的API接口函數(shù)直接調(diào)用,即可操作SPI設(shè)備。 

      設(shè)備驅(qū)動(dòng)框架層:由RTT系統(tǒng)提供的一個(gè)重要的中間層,用于驅(qū)動(dòng)層和應(yīng)用層之間聯(lián)系的建立,對(duì)應(yīng)用層開(kāi)放API調(diào)用接口,對(duì)驅(qū)動(dòng)層開(kāi)放注冊(cè)函數(shù)和操作函數(shù),將驅(qū)動(dòng)層的操作注冊(cè)到系統(tǒng)中,實(shí)現(xiàn)應(yīng)用與驅(qū)動(dòng)之間的軟連接。 

      總線(xiàn)設(shè)備驅(qū)動(dòng)層:該層是驅(qū)動(dòng)開(kāi)發(fā)工程師的主攻戰(zhàn)場(chǎng),后面展開(kāi)詳細(xì)講。 

      硬件SPI控制器層:一般情況下就是MCU自帶的控制外設(shè),這里當(dāng)然就是SPI控制器,玩過(guò)單片機(jī)的小伙伴最熟悉的部分。 

      外掛模塊層:最后一層就是SPI類(lèi)型總線(xiàn)通信設(shè)備的模塊,常用的flash芯片、網(wǎng)絡(luò)控制模塊等都生活在這一層,實(shí)際電路中通過(guò)SPI通信線(xiàn)與MCU連接。 

       接下來(lái)就是看下基于STM32開(kāi)發(fā)SPI的設(shè)備模型(模型即結(jié)構(gòu)體定義)了,代碼如下:

/* stm32 spi dirver class */
struct stm32_spi
{
    SPI_HandleTypeDef handle;
    struct stm32_spi_config *config;
    struct rt_spi_configuration *cfg;

    struct
    {
        DMA_HandleTypeDef handle_rx;
        DMA_HandleTypeDef handle_tx;
    } dma;

    rt_uint8_t spi_dma_flag;
    struct rt_spi_bus spi_bus;
};

      這里需要注意的是,模型的最后一個(gè)成員spi_bus,它是由RTT系統(tǒng)提供,有了它這個(gè)模型就與系統(tǒng)之間產(chǎn)生了聯(lián)系,spi_bus是系統(tǒng)的一個(gè)SPI類(lèi)型硬件設(shè)備模型。  有了模型以后,我們就是針對(duì)這個(gè)模型進(jìn)行設(shè)備的實(shí)例化,一般來(lái)講MCU會(huì)有多個(gè)SPI控制器,所以針對(duì)這一情況,我們就定義了另一個(gè)模型專(zhuān)門(mén)用于實(shí)例化SPI對(duì)象模型:

struct stm32_spi_config
{
    SPI_TypeDef *Instance;  /*SPI外設(shè)*/
    char *bus_name;         /*SPI總線(xiàn)設(shè)備名稱(chēng)*/
    struct dma_config *dma_rx, *dma_tx; /*DMA發(fā)送及接收配置參數(shù)*/
};

      接下來(lái)需要采用預(yù)處理命令宏定義硬件外設(shè)所有的SPI設(shè)備配置項(xiàng),至于是否開(kāi)啟我們可以通過(guò)rt_config.h文件是否定義該宏來(lái)決定:

#ifdef BSP_USING_SPI1
#ifndef SPI1_BUS_CONFIG
#define SPI1_BUS_CONFIG                             \
    {                                               \
        .Instance = SPI1,                           \
        .bus_name = "spi1",                         \
    }
#endif /* SPI1_BUS_CONFIG */
#endif /* BSP_USING_SPI1 */

#ifdef BSP_USING_SPI2
#ifndef SPI2_BUS_CONFIG
#define SPI2_BUS_CONFIG                             \
    {                                               \
        .Instance = SPI2,                           \
        .bus_name = "spi2",                         \
    }
#endif /* SPI2_BUS_CONFIG */
#endif /* BSP_USING_SPI2 */

      有了設(shè)備配置模型,就需要定義一個(gè)真實(shí)的需要配置的設(shè)備模型數(shù)據(jù),用于實(shí)例化多個(gè)SPI控制器,實(shí)際上就一個(gè)數(shù)組搞定:

static struct stm32_spi_config spi_config[] =
{
#ifdef BSP_USING_SPI1
    SPI1_BUS_CONFIG,
#endif

#ifdef BSP_USING_SPI2
    SPI2_BUS_CONFIG,
#endif
};

      有了設(shè)備類(lèi)型模型,也有了配置模型數(shù)組,就需要定義通過(guò)模型來(lái)定義真實(shí)的設(shè)備實(shí)例,定義完并沒(méi)有進(jìn)行初始化:

/*定義SPI總線(xiàn)對(duì)象*/
static struct stm32_spi spi_bus_obj[sizeof(spi_config) / sizeof(spi_config[0])] = {0};

      到這里,關(guān)于SPI總線(xiàn)對(duì)象的創(chuàng)建就完了,但是關(guān)于SPI總線(xiàn)對(duì)象還是一個(gè)空空如也的數(shù)組,我想你也應(yīng)該知道如何基于配置對(duì)象給總線(xiàn)對(duì)象進(jìn)行初始化,當(dāng)然這個(gè)我們下篇接著講。

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