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

程序小白
認(rèn)證:優(yōu)質(zhì)創(chuàng)作者
所在專題目錄 查看專題
單片機(jī)應(yīng)用與驅(qū)動(dòng)開發(fā)之路:這時(shí)的你只需要扣動(dòng)扳機(jī)。
RT-Thread驅(qū)動(dòng)之路:stm32設(shè)備驅(qū)動(dòng)開發(fā)之uart注冊(cè)①
RT-Thread驅(qū)動(dòng)之路:stm32設(shè)備驅(qū)動(dòng)開發(fā)之uart設(shè)備創(chuàng)建②
RT-Thread驅(qū)動(dòng)之路:stm32設(shè)備驅(qū)動(dòng)開發(fā)之uart操作方法③
RT-Thread驅(qū)動(dòng)之路:stm32設(shè)備驅(qū)動(dòng)開發(fā)之uart中斷處理④
RT-Thread驅(qū)動(dòng)之路:stm32設(shè)備驅(qū)動(dòng)開發(fā)之淺析注冊(cè)機(jī)制⑤
作者動(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ā)之uart設(shè)備創(chuàng)建②


      開篇分割線:我們?cè)賹戲?qū)動(dòng)程序的目的是能夠注冊(cè)到系統(tǒng)的框架之中,那么就在創(chuàng)建設(shè)備之初你的設(shè)備結(jié)構(gòu)體(C++中叫類)必須從系統(tǒng)提供的結(jié)構(gòu)中進(jìn)行派生出新的結(jié)構(gòu)體,根據(jù)自己的設(shè)備類型定義私有數(shù)據(jù)域,

      MCU一般會(huì)有多個(gè)串口,所以串口驅(qū)動(dòng)也需要支持多個(gè)串口的配置,設(shè)備結(jié)構(gòu)體更應(yīng)該以數(shù)組的形式出現(xiàn),config信息就代表了真實(shí)的硬件有多少個(gè)固定的串口,并通過(guò)數(shù)組一次性默認(rèn)配置好,至于是不是要啟用,可以通過(guò)預(yù)定義宏的方式進(jìn)行開關(guān):


      有了uart設(shè)備對(duì)象以后,我們還有需要能夠操作對(duì)象的方法(C++中的類就集成了這一部分),C語(yǔ)言中可以通過(guò)函數(shù)指針的方式來(lái)實(shí)現(xiàn)操作方法的結(jié)構(gòu)體存儲(chǔ):

/**
 * uart operators
 */
struct rt_uart_ops
{
    rt_err_t (*configure)(struct rt_serial_device *serial, struct serial_configure *cfg);
    rt_err_t (*control)(struct rt_serial_device *serial, int cmd, void *arg);

    int (*putc)(struct rt_serial_device *serial, char c);
    int (*getc)(struct rt_serial_device *serial);

    rt_size_t (*dma_transmit)(struct rt_serial_device *serial, rt_uint8_t *buf, rt_size_t size, int direction);
};

      上面定義的是函數(shù)原型的指針:后續(xù)需要我們根據(jù)stm32實(shí)現(xiàn)具體的方法來(lái)賦值給對(duì)應(yīng)的原形,這里先說(shuō)下每個(gè)函數(shù)的作用該實(shí)現(xiàn)怎樣的功能,后續(xù)你才好去寫這部分功能。

configure方法:用于配置串口的波特率、數(shù)據(jù)位、校驗(yàn)位、停止位等參數(shù)。

control方法:用于控制串口。

putc方法:用于串口向外發(fā)送字符數(shù)據(jù)。

getc方法:用于串口獲取接收外部的字符數(shù)據(jù)。

transmit方法:用于數(shù)據(jù)發(fā)送側(cè)重于多個(gè)字節(jié)的數(shù)據(jù)發(fā)送。

      你是否發(fā)現(xiàn)了一個(gè)很奇怪的參數(shù),就是這些操作方法的第一個(gè)輸入?yún)?shù)是系統(tǒng)提供的serial的結(jié)構(gòu)體,按理說(shuō)這里的ops需要進(jìn)行最底層的硬件操作及數(shù)據(jù)收發(fā),那為什么會(huì)是serial,而不是uart呢,其實(shí)這源于這些操作函數(shù)的調(diào)用方,假如應(yīng)用和驅(qū)動(dòng)不是分離的,那么應(yīng)用可以很簡(jiǎn)單的知道底層的驅(qū)動(dòng)是哪個(gè)uart,但實(shí)際上應(yīng)用和驅(qū)動(dòng)是隔離開的,應(yīng)用需要通過(guò)一個(gè)名稱來(lái)獲取串口的句柄,而串口的句柄只能來(lái)自于系統(tǒng)的定義,也就是serial對(duì)象,但是我們實(shí)際上需要的是uart,那么這里提前引入一個(gè)轉(zhuǎn)換,由成員對(duì)象找到派生對(duì)象的操作,不得不說(shuō)C語(yǔ)言的強(qiáng)大,詳細(xì)的分析會(huì)放到configure函數(shù)的實(shí)現(xiàn)上來(lái)講:

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