<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 業(yè)界動(dòng)態(tài) > 瑞薩RA0單片機連載之基于面向對象的LED燈

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

作者:lulugl 時(shí)間:2024-10-16 來(lái)源:EEPW 收藏

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

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

1   創(chuàng )建工程

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

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

1729068778664662.png

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

1729070225308753.png

3.選擇非RTOS

1729070276359260.png

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

1729070341225632.png

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

1729070375313301.png

6.配置這兩個(gè)IO 為輸出模式:

1729070405340716.png

7.配置好后,生成工程,并打用MDK 打開(kāi)工程:

1729070499943195.png

8.在工程中,我添加applications、devices、include、libs、drivers。這四個(gè)文件夾是學(xué)習百問(wèn)網(wǎng)的面向對象的工程文件夾

1729070545719927.png

其中他的功能如下:

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

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

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

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

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

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

1729070619591089.png

led.h 中定義結構體來(lái)定義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 中實(shí)例化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 并添加測試函數:

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 就完成了,初始化多個(gè)LED只需要需要添加實(shí)例化的LED 就行了,移植到其他芯片,只需要重新定義一下dev_gpio 中的IO 就行了。

(本文來(lái)源于《EEPW》



關(guān)鍵詞: 202410

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>