新聞中心

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

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

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

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

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

        1   創建工程

        此次創建工程,我采用RASC+MDK 來開發。

        1.打開FSP for RASC,創建基礎的工程:

        1729068778664662.png

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

        1729070225308753.png

        3.選擇非RTOS

        1729070276359260.png

        4.選擇生成最小系統的工程:

        1729070341225632.png

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

        1729070375313301.png

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

        1729070405340716.png

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

        1729070499943195.png

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

        1729070545719927.png

        其中他的功能如下:

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

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

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

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

        【注】以上4 點說明引用《百問網》的內容,如有侵權請聯系刪除。

        在devices 文件夾中添加一個LED 文件夾,創建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 “led.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 并添加測試函數:

        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》



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 钟祥市| 宁晋县| 贡嘎县| 张北县| 许昌县| 平定县| 临湘市| 达尔| 秦皇岛市| 大英县| 湘潭县| 广安市| 登封市| 湛江市| 醴陵市| 万年县| 文水县| 工布江达县| 博湖县| 新郑市| 青浦区| 丹凤县| 江门市| 临漳县| 尼玛县| 绥棱县| 德阳市| 锡林郭勒盟| 五家渠市| 颍上县| 镇安县| 肥东县| 公安县| 古蔺县| 同江市| 云和县| 青阳县| 克山县| 呼和浩特市| 磐安县| 锡林郭勒盟|