搜索
ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU

[应用相关] 分享一套基于ST MCU做的开源代码

[复制链接]
881|17
 楼主 | 2020-2-26 16:10 | 显示全部楼层 |阅读模式

          一直想着为裸机开发的工程师做点奉献,借着业余时间开始了这套代码的编写:
          定位:MCU裸机开发项目
          目标:
                     1.以搭积木的方式挑选功能模块和驱动来加快开发速度  
                     2.工程师开发过的功能模块存放到代码中以备下个项目使用

          STM32CUBEMX是开发中的神器,MCU驱动部分省时省力,所以这份开源代码也基于ST的芯片来做(理论上是可以适配多款MCU的,只是其他MCU没有CUBEMX,所以暂时没花时间用其他MCU测试)

          目前已有的功能模块(在b_config.h中配置),下面这个配置界面,只有使用MDK开发的童鞋才能看到:
          1.jpg
          目前的驱动部分比较,还有待网友的力量继续添加。

          这份代码也吸收其他比较实用的开源代码,目前为止加入了两个,放在了thirdparty目录。

          如果这份代码能在项目中发挥大的作用就需要有足够的功能模块以及驱动代码,这就要依靠网络的力量了。下面上源码链接,有兴趣的点进去瞧一瞧。
           
         码云:https://gitee.com/notrynohigh/BabyOS
​          github:https://github.com/notrynohigh/BabyOS

使用特权

评论回复
| 2020-2-26 16:25 | 显示全部楼层
BabyOs,名字不错。。支持楼主。

使用特权

评论回复
| 2020-2-26 18:04 | 显示全部楼层
可以自己集成第三方的驱动,这个有意思。

使用特权

评论回复
| 2020-2-26 20:42 | 显示全部楼层
厉害!请问一下这个界面是什么代码做的吗?还是调用的 cube 的内核文件?

使用特权

评论回复
 楼主 | 2020-2-26 21:21 | 显示全部楼层
王紫豪 发表于 2020-2-26 16:25
BabyOs,名字不错。。支持楼主。

多谢支持啦

使用特权

评论回复
 楼主 | 2020-2-26 21:22 | 显示全部楼层
doit888 发表于 2020-2-26 20:42
厉害!请问一下这个界面是什么代码做的吗?还是调用的 cube 的内核文件?

那个配置界面是MDK的一个功能,可以看b_config.h的具体内容就知道了

使用特权

评论回复
 楼主 | 2020-2-29 19:57 | 显示全部楼层
本帖最后由 liklon 于 2020-2-29 19:58 编辑

对代码感兴趣的童鞋欢迎加入一起开发啦!
也许比较多童鞋之前习惯用SVN管理代码,当前项目是用git,在此分享git的使用教程。
这个网站教程比较好:https://www.liaoxuefeng.com/wiki/896043488029600
再附上一份pdf教程:
git教程.part2.rar (1.95 MB, 下载次数: 19)

使用特权

评论回复
| 2020-3-1 11:12 | 显示全部楼层

支持

使用特权

评论回复
 楼主 | 2020-3-3 09:20 | 显示全部楼层
看到板块内有关于uGUI使用的帖子 ,这个只有3个文件的GUI确实适合MCU相关项目。进一步去看了源码的license,是比较开放的,那么BabyOS就非常开心的将其合并,让其成为Thirdparty的一份子。
于是在配置文件中多了一项:
QQ截图20200303091749.png
--------------------------------------------------------------------------------------------
在b_device_list.h注册lcd和触屏后便可以使用:
  1. /**
  2.            for example !

  3. /////B_DEVICE_REG(dev, driver_interface, desc);           
  4. */

  5. B_DEVICE_REG(SSD1289, bSSD1289_Driver, "LCD")
  6. B_DEVICE_REG(XPT2046, bXPT2046_Driver, "TOUCH")
复制代码
主函数代码片段:
  1.   bGUI_Init(SSD1289, XPT2046);
  2.   
  3.   UG_WindowCreate( &wnd, wmdObjTable, 3, _GUI_Callback);
  4.   UG_WindowSetTitleText(&wnd, "BabyOS");
  5.   UG_ButtonCreate( &wnd, &btn1, BTN_ID_0, 50, 50, 200, 200 );
  6.   UG_ButtonSetText(&wnd, BTN_ID_0, "UGUI");
  7.   UG_WindowShow(&wnd);
复制代码

对应的实验效果:
UGUI.png
---------------------------------------------------------------------------------------
还有很大优化空间,在此抛砖引玉,等各位网友 大显身手。


使用特权

评论回复
 楼主 | 2020-3-5 09:26 | 显示全部楼层
新增b_menu
    方便多级菜单使用的场景,增加b_menu。可以通过b_button b_menu b_gui三个功能模块联合起来做实验。
   使用步骤:
   1. 设计菜单界面,给每个界面一个ID号,如下图所示
    menu.jpg
2.在b_config.h使能b_menu,配置页面数量

3.开始构建页面之间的关系,页面与页面的关系有两种(兄弟关系和父子关系)。新增页面并指定画图程序:
  1.   bInit();                                      //BabyOS Init
  2.   bButtonInit();                                //Button
  3.   bGUI_Init(SSD1289, NULL);                     //GUI
  4.   UG_PutString(50, 200, "BabyOS test b_menu");
  5.   //Create menu
  6.   bMenuAddSibling(1, 1, Create1);
  7.   bMenuAddSibling(1, 2, Create2);
  8.   bMenuAddChild(1, 3, Create3);
  9.   bMenuAddChild(2, 4, Create4);
  10.   bMenuAddSibling(4, 5, Create5);
  11.   bMenuAddChild(4, 6, Create6);
  12.   bMenuAddChild(5, 7, Create7);
复制代码

  第一个参数是新增页面的参考页面的ID,根据与参考页面的关系调用对应的API,如果是兄弟关系则调用bMenuAddSibling 父子关系则调用bMenuAddChild
  第二个参数是新增页面的ID
  第三个参数是绘制界面的函数

4.根据不同的按键事件,发送不同的切换指令:
  1. void bButtonCallback(void *p)
  2. {
  3.     flex_button_t *btn = (flex_button_t *)p;
  4.     if(btn->event != FLEX_BTN_PRESS_DOWN)
  5.     {
  6.         return;
  7.     }
  8.     switch(btn->id)
  9.     {
  10.         case USER_BUTTON_1:
  11.             bMenuAction(MENU_UP);
  12.             break;
  13.         case USER_BUTTON_2:
  14.             bMenuAction(MENU_DOWN);
  15.             break;
  16.         case USER_BUTTON_3:
  17.             bMenuAction(MENU_BACK);
  18.             break;
  19.         case USER_BUTTON_WAKEUP:
  20.             bMenuAction(MENU_ENTER);
  21.             break;
  22.     }
  23. }
复制代码
切换指令有 UP DOWN BACK ENTER
如果要直接跳转至某个界面,调用void bMenuJump(uint32_t id);
如果涉及到用户权限问题,可以根据需要隐藏某个界面,通过调用int bMenuSetVisible(uint32_t id, uint8_t s);
获取当前界面的ID,调用uint32_t bMenuCurrentID(void);

实验效果如下:
menu.gif


使用特权

评论回复
 楼主 | 2020-3-6 18:27 | 显示全部楼层
现在BabyOS代码里面急缺驱动,这个版块里面的人应该大多有STM32的开发板吧,来一起开发,添加驱动吧!邀请各位网友助力!!!

使用特权

评论回复
 楼主 | 2020-3-11 11:39 | 显示全部楼层
本帖最后由 liklon 于 2020-3-11 11:40 编辑

增加b_trace

      对于刚使用ST芯片的童鞋来说,当程序跑入硬件错误中断后就很懵,有经验的工程师或许能马上定位问题,但是新手就很焦虑,有这么一项开源代码CmBacktrace很好的帮助新手应对这个麻烦。于是这份代码又被BabyOS给吸收进来了,形成了b_trace,用于追踪触发HardFault的位置,并不适合所有的MCU ,目前测试过Cortex-M3和M0是可以的,其他的木有板子测试。
先在b_config.h中配置:

103123y0lkwyw5wmoou3zn.jpg
调用bTraceInit,参数是编译生成的文件名。
  1. /****************************Init*******************************/
  2.   bInit();                                      //BabyOS Init
  3.   bTraceInit("BabyOS");
  4.   _TestHardfault();
  5.   while (1)
  6.   {
  7.       bExec();
  8.   /* USER CODE END WHILE */

  9.   /* USER CODE BEGIN 3 */

  10.   }
  11.   /* USER CODE END 3 */
复制代码

制造错误:
  1. typedef void (*pfunc)(void);

  2. int _TestHardfault()
  3. {
  4.     ((pfunc)0x00000000)();
  5.     return 0;
  6. }
复制代码

在Hardfault中断服务函数调用bHardfaultCallback();
  1. /**
  2. * [url=home.php?mod=space&uid=247401]@brief[/url] This function handles Hard fault interrupt.
  3. */
  4. void HardFault_Handler(void)
  5. {
  6.   /* USER CODE BEGIN HardFault_IRQn 0 */
  7. #if _CMBACKTRACE_ENABLE   
  8.   bHardfaultCallback();
  9. #endif   
  10.   /* USER CODE END HardFault_IRQn 0 */
  11.   while (1)
  12.   {
  13.     /* USER CODE BEGIN W1_HardFault_IRQn 0 */
  14.     /* USER CODE END W1_HardFault_IRQn 0 */
  15.   }
  16.   /* USER CODE BEGIN HardFault_IRQn 1 */

  17.   /* USER CODE END HardFault_IRQn 1 */
  18. }
复制代码

测试效果:

103347lcoz8pf5fkk8lwag.jpg

其中使用到的addr2line功能在bos\core\thirdparty\CmBacktrace\addr2line

使用特权

评论回复
| 2020-3-11 12:53 | 显示全部楼层
liklon 发表于 2020-3-6 18:27
现在BabyOS代码里面急缺驱动,这个版块里面的人应该大多有STM32的开发板吧,来一起开发,添加驱动吧!邀请 ...

国内想形成这种社区话的开发方式,感觉还是挺困难的。
基本要做的东西,只有靠自己,我们以前也尝试过让社区去实现一些驱动,不过基本都不可行
1. 代码不一定符合我们的规范
2. 质量不一定达到我们的要求
3. 基本找不到人

使用特权

评论回复
| 2020-3-12 11:53 | 显示全部楼层
这个不错啊,可以将驱动分个类,组织一下结构。增加一个驱动框架模板文件,可以方便直接在模板文件添加驱动内容。

使用特权

评论回复
 楼主 | 2020-3-12 15:54 | 显示全部楼层
WoodData 发表于 2020-3-12 11:53
这个不错啊,可以将驱动分个类,组织一下结构。增加一个驱动框架模板文件,可以方便直接在模板文件添加驱动 ...

嗯嗯,将驱动分类增框架模板文件,谢谢您提这个建议。如果您有空余时间的话真希望您能帮忙设计一下

使用特权

评论回复
 楼主 | 2020-3-15 21:08 | 显示全部楼层
本帖最后由 liklon 于 2020-3-15 21:33 编辑

优化b_protocol通用协议,并增加测试的上位机

BabyOS中提供一套通用的协议,其格式如下:
TIM截图20200315211248.png

在b_config.h进行配置
config.png

注册b_protocol实例时需要指定设备ID和分发函数。测试软件中发送的测试指令时发送给ID为0x520的设备,所以测试代码需要将自身ID设为0x520
  1. Protocol_n = bProtocolRegist(0x520, Dispatch);
复制代码
设备将收到的数据给b_protocol解析,解析正确后调用分发函数。分发函数根据不同指令处理不同的事情
  1. int Dispatch(uint8_t cmd, uint8_t *param, bProtoLen_t param_len)
  2. {
  3.       b_log("cmd:%d param: %s len:%d\r\n", cmd, param, param_len);
  4.       return 0;
  5. }
复制代码
测试上位机的源码:https://gitee.com/notrynohigh/BabyOS_Protocol

使用教程:https://gitee.com/notrynohigh/BabyOS_Example/tree/b_protocol/

测试:设备每10s上报一条指令,在测试软件中点击测试按钮会发送一条指令至设备
b_protocol.png





使用特权

评论回复
 楼主 | 2020-3-22 07:58 | 显示全部楼层
1.b_protocol 增加选项,对传输数据是否加密
2.b_gui增加配置横屏或竖屏

-------------------------------------------------------
上位机软件增加对应的加密传输选项
8D51A18D-EDB5-4F12-BC07-E16FE7F9AEB2.png

使用特权

评论回复
 楼主 | 2020-3-27 20:12 | 显示全部楼层
调整代码结构

最近调整了代码的结构,主要是让开发者和用户对代码的结构有更清晰的了解。也希望能有工程师接受这份代码,尝试在项目中使用使用。
只有在项目中得到使用,才算是一套合格的代码,附上新的结构图,希望大家给出改善意见。

frame.png

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表