99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

程序小白
認證:優質創作者
所在專題目錄 查看專題
RT-Thread驅動之路:stm32設備驅動開發之uart操作方法③
RT-Thread驅動之路:stm32設備驅動開發之uart中斷處理④
RT-Thread驅動之路:stm32設備驅動開發之淺析注冊機制⑤
RT-Thread驅動之路:stm32設備驅動開發之SPI原理①
RT-Thread驅動之路:stm32設備驅動開發之SPI對象創建②
RT-Thread驅動之路:stm32設備驅動開發之SPI總線操作方法③
作者動態 更多
基于stm32采用PWM驅動伺服控制器學習筆記
05-13 15:25
基于STM32驅動TM1638學習筆記——軟件篇
04-19 12:42
基于TM1638驅動8位數碼管設計分享
02-24 11:26
RT-Thread驅動之路: Studio創建FAL分區⑤
01-02 08:30
RT-Thread驅動之路: Studio 掛載通用SPI flash④
2024-12-23 13:41

RT-Thread驅動之路:stm32設備驅動開發之SPI對象創建②


開篇分割線,再研究驅動程序之前我們先看下RTT 關于SPI應用的代碼層級結構:

      應用層:只做應用層開發的小伙伴是有福的,你不需要了解整個驅動是怎樣構架的,只需要了解驅動構架層提供的API接口函數直接調用,即可操作SPI設備。 

      設備驅動框架層:由RTT系統提供的一個重要的中間層,用于驅動層和應用層之間聯系的建立,對應用層開放API調用接口,對驅動層開放注冊函數和操作函數,將驅動層的操作注冊到系統中,實現應用與驅動之間的軟連接。 

      總線設備驅動層:該層是驅動開發工程師的主攻戰場,后面展開詳細講。 

      硬件SPI控制器層:一般情況下就是MCU自帶的控制外設,這里當然就是SPI控制器,玩過單片機的小伙伴最熟悉的部分。 

      外掛模塊層:最后一層就是SPI類型總線通信設備的模塊,常用的flash芯片、網絡控制模塊等都生活在這一層,實際電路中通過SPI通信線與MCU連接。 

       接下來就是看下基于STM32開發SPI的設備模型(模型即結構體定義)了,代碼如下:

/* 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;
};

      這里需要注意的是,模型的最后一個成員spi_bus,它是由RTT系統提供,有了它這個模型就與系統之間產生了聯系,spi_bus是系統的一個SPI類型硬件設備模型。  有了模型以后,我們就是針對這個模型進行設備的實例化,一般來講MCU會有多個SPI控制器,所以針對這一情況,我們就定義了另一個模型專門用于實例化SPI對象模型:

struct stm32_spi_config
{
    SPI_TypeDef *Instance;  /*SPI外設*/
    char *bus_name;         /*SPI總線設備名稱*/
    struct dma_config *dma_rx, *dma_tx; /*DMA發送及接收配置參數*/
};

      接下來需要采用預處理命令宏定義硬件外設所有的SPI設備配置項,至于是否開啟我們可以通過rt_config.h文件是否定義該宏來決定:

#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 */

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

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

#ifdef BSP_USING_SPI2
    SPI2_BUS_CONFIG,
#endif
};

      有了設備類型模型,也有了配置模型數組,就需要定義通過模型來定義真實的設備實例,定義完并沒有進行初始化:

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

      到這里,關于SPI總線對象的創建就完了,但是關于SPI總線對象還是一個空空如也的數組,我想你也應該知道如何基于配置對象給總線對象進行初始化,當然這個我們下篇接著講。

聲明:本內容為作者獨立觀點,不代表電子星球立場。未經允許不得轉載。授權事宜與稿件投訴,請聯系:editor@netbroad.com
覺得內容不錯的朋友,別忘了一鍵三連哦!
贊 4
收藏 5
關注 151
成為作者 賺取收益
全部留言
0/200
成為第一個和作者交流的人吧
主站蜘蛛池模板: 性爱无码视频在线看 | 国产精品久久久久久久婷婷 | 伊人春色精品 | 日韩人妻无码AV一区二区三区 | 国产精品青青青高清在线 | 99精品一级欧美片免费播放资讯 | 91成人精品一区在线播放69 | 国产精品久久久久久AV福利 | 狠狠躁天天躁夜夜躁婷婷 | 成年站免费网站看V片在线 成人亚洲免费视频 | 给我免费观看片在线观看 | 国产黄大片在线观看画质优化 | 鲁一鲁啪一啪 | 亚洲精品18 | 国产极品99热在线播放69 | 10000拍拍18勿入免费看动漫 | 欧美GAY猛男GAYA片18禁 | 18禁止进入1000部高潮网站 | 成人网在线观看视频 | 橘梨纱av一区二区三区在线观看 | 欧美成人精品高清在线观看 | 老司机亚洲精品影院 | 国产亚洲综合一区柠檬导航 | 国产色婷婷综合影一区二区三区 | 欧美精品无码久久久潘金莲 | 国产一及毛片 | 字幕专区码中文欧美在线 | 久久久网| 天天看天天摸天天操 | 日本熟妇另类视频在线播放 | 91一级| 日本黄色录像视频 | 亚洲欧美日韩综合俺去了 | 美女把尿口扒开让男人桶爽 | www.av在线免费观看 | 国产乱AⅤ一区二区三区 | 中国国语毛片免费观看视频 | 最新国产の精品合集bt伙计 | 欧美美女性视频 | 日日噜噜大屁股熟妇 | 久久免费在线观看视频 |