瑞萨RA0单片机连载之基于面向对象的LED灯

瑞萨RA0单片机连载之基于面向对象的LED灯
2024年10月17日 09:21 电子产品世界

在我试用了好几十种单片机后,发现,每个单片机都需要重复造轮子,感觉非常的累,比如OLED屏,每次都需要去重写他的驱动,这样非常耗时耗精力,在看到《百问网》的面向对象编程中,我学习到了面向编程的思想,感觉非常有必要打造自己的一套风格的代码,同样的功能,只需要修改BSP 驱动就可以使用。因此,借此次RA0E1 系列的单片机,希望能第一次搭建自己的面向对象的编程。

本文引用地址:

1   创建工程

此次创建工程,我采用RASC+MDK 来开发。

1.打开FSP for RASC,创建基础的工程:

2.选择生成MDK5 的工程,芯片选择对象的型号:

3.选择非RTOS

4.选择生成最小系统的工程:

5.打开原理图,查看开发板给用户可以使用的LED灯,有两个LED 是可以提供给我们用户的,分别为P103、P104:

6.配置这两个IO 为输出模式:

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

8.在工程中,我添加applications、devices、include、libs、drivers。这四个文件夹是学习百问网的面向对象的工程文件夹

其中他的功能如下:

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。

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

4. #include

5. #include

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 就行了。

新浪科技公众号
新浪科技公众号

“掌”握科技鲜闻 (微信搜索techsina或扫描左侧二维码关注)

创事记

科学探索

科学大家

苹果汇

众测

专题

官方微博

新浪科技 新浪数码 新浪手机 科学探索 苹果汇 新浪众测

公众号

新浪科技

新浪科技为你带来最新鲜的科技资讯

苹果汇

苹果汇为你带来最新鲜的苹果产品新闻

新浪众测

新酷产品第一时间免费试玩

新浪探索

提供最新的科学家新闻,精彩的震撼图片