在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 光電顯示 > 設計應用 > 瑞薩RA0單片機連載之基于面向對象的LED燈

            瑞薩RA0單片機連載之基于面向對象的LED燈

            作者:lulugl 時間:2024-10-16 來源:EEPW 收藏

            在我試用了好幾十種后,發(fā)現(xiàn),每個都需要重復造輪子,感覺非常的累,比如OLED屏,每次都需要去重寫他的驅動,這樣非常耗時耗精力,在看到《百問網(wǎng)》的編程中,我學習到了面向編程的思想,感覺非常有必要打造自己的一套風格的代碼,同樣的功能,只需要修改BSP 驅動就可以使用。因此,借此次E1 系列的,希望能第一次搭建自己的的編程。

            本文引用地址:http://www.biyoush.com/article/202410/463707.htm

            1   創(chuàng)建工程

            此次創(chuàng)建工程,我采用RASC+MDK 來開發(fā)。

            1.打開FSP for RASC,創(chuàng)建基礎的工程:

            1729068778664662.png

            2.選擇生成MDK5 的工程,芯片選擇對象的型號:

            1729070225308753.png

            3.選擇非RTOS

            1729070276359260.png

            4.選擇生成最小系統(tǒng)的工程:

            1729070341225632.png

            5.打開原理圖,查看開發(fā)板給用戶可以使用的,有兩個LED 是可以提供給我們用戶的,分別為P103、P104:

            1729070375313301.png

            6.配置這兩個IO 為輸出模式:

            1729070405340716.png

            7.配置好后,生成工程,并打用MDK 打開工程:

            1729070499943195.png

            8.在工程中,我添加applications、devices、include、libs、drivers。這四個文件夾是學習百問網(wǎng)的的工程文件夾

            1729070545719927.png

            其中他的功能如下:

            1)應用程序位于applications 目錄下,用于存放業(yè)務相關的代碼,它們可能是多個模塊對象的聯(lián)調,也可能是數(shù)據(jù)的處理。比如“根據(jù)按鍵操作LED”,這就屬于應用層的代碼。按鍵和LED 的操作函數(shù),不屬于應用層,而是屬于底下的設備層。這一層需要和底層驅動完全解耦合:這一層的代碼移植到其它平臺時,無需修改代碼。

            2)頭文件位于include 目錄下,主要存放error.h 和confi g.h,前者用于統(tǒng)一錯誤代碼,后者用于配置整個工程。

            3)設備層位于devices目錄。簡單設備的文件直接放在devices目錄里;對于模塊,在devices 目錄下根據(jù)模塊名字創(chuàng)建一個子目錄,用來存放模塊的文件。在dev_xxx.h 中根據(jù)設備的特性定義一些結構體,在dev_xxx.c 里實現(xiàn)了這些結構體,并使用鏈表來管理同類設備。上層代碼獲取這些結構體后,就可以直接調用結構的函數(shù)指針來操作設備。

            4)驅動層位于drivers目錄,存放的平臺相關的驅動源代碼。drivers.h:根據(jù)confi g.h 中的宏開關,包含drv_xxx.h。drv_xxx.h:接口,供外部代碼調用。drv_xxx.h:驅動代碼,一般用來實現(xiàn)并注冊dev_xxx.h 中聲明的結構體,會調用平臺提供的HAL 庫。

            【注】以上4 點說明引用《百問網(wǎng)》的內容,如有侵權請聯(lián)系刪除。

            在devices 文件夾中添加一個LED 文件夾,創(chuàng)建led.h/c。

            1729070619591089.png

            led.h 中定義結構體來定義LED 的init、on、off 方法。

            view plaincopy to clipboardprint?

            1. #ifndef __LED_H__

            2. #defi ne __LED_H__

            3.

            4. typedef struct LedDev{

            5. int (*Init)(struct LedDev *ptdev);

            6. void (*On)(void);

            7. void (*Off )(void);

            8. }LedDevice;

            9.

            10. struct LedDev *LedGetDevice(void);

            11.

            12. #endif

            Led.c 中實例化LED 對象代碼如下:

            view plaincopy to clipboardprint?

            1. #include “devices.h”

            2. #include “hal_data.h”

            3. #include <libs.h>

            4. #include <errno.h>

            5. #include <stdio.h>

            6. #include “l(fā)ed.h”

            7.

            8. static void LedON(void);

            9. static void LedOFF(void);

            10. static int LedDevInit(struct LedDev *ptdev);

            11.

            12. static struct LedDev gDevice = {

            13. .Init = LedDevInit,

            14. .On = LedON,

            15. .Off = LedOFF,

            16. };

            17.

            18. static IODevice *gLedDevice;

            19.

            20. struct LedDev *LedGetDevice(void)

            21. {

            22. return &gDevice;

            23. }

            24.

            25.

            26. static int LedDevInit(struct LedDev *ptdev)

            27. {

            28. if(NULL == ptdev) return -EINVAL;

            29. gLedDevice = IODeviceFind(“LED”);

            30. if(NULL == gLedDevice)

            31. {

            32. printf(“Failed to fi nd LED!rn”);

            33. return -ENXIO;

            34. }

            35. if(ESUCCESS != gLedDevice->Init(gLedDevice))

            36. {

            37. printf(“Failed to init GPIO!rn”);

            38. return -EIO;

            39.

            40. }

            41. return ESUCCESS;

            42.

            43. }

            44.

            45. static void LedON(void)

            46. {

            47. gLedDevice->Write(gLedDevice,1);

            48. }

            49.

            50. static void LedOFF(void)

            51. {

            52. gLedDevice->Write(gLedDevice,0);

            53. }

            在app.c 中初始化LED 并添加測試函數(shù):

            view plaincopy to clipboardprint?

            1. void led_blink(void)

            2. {

            3. UartDevicesRegister();

            4. IODevicesRegister();

            5. LedDevice *pDevice = LedGetDevice();

            6. if(NULL == pDevice)

            7. {

            8. printf(“Error. There is no LED device!rn”);

            9. return;

            10. }

            11. pDevice->Init(pDevice);

            12. printf(“startrn”);

            13. while(1)

            14. {

            15. printf(“startrn”);

            16. pDevice->On();

            17. R_BSP_SoftwareDelay(1,BSP_DELAY_UNITS_

            SECONDS);

            18. pDevice->Off();

            19. R_BSP_SoftwareDelay(1,BSP_DELAY_UNITS_

            SECONDS);

            20. }

            21. }

            至此面向對象的LED 就完成了,初始化多個LED只需要需要添加實例化的LED 就行了,移植到其他芯片,只需要重新定義一下dev_gpio 中的IO 就行了。

            (本文來源于《EEPW》



            評論


            相關推薦

            技術專區(qū)

            關閉