小白用小安派学习过程第三篇

  [复制链接]
查看7372 | 回复59 | 2023-8-6 16:25:34 | 显示全部楼层 |阅读模式
本帖最后由 妖猊 于 2023-8-6 16:25 编辑

不能再用“天”来说更新了,所以那么就是“小白用小安派学习过程第三篇”
由于烧录需要USB转串口暂时没法烧录,那么就先来解读下出厂固件的工程代码吧
我是用VScode打开编辑的,那么下列的截图都是用VScode界面为例,用其他IDE的类似

首先打开下载下来的工程,我是把整个小安派整个开源库都拉了下来,里面有各种小安派开发板的开源工程,因为只有s1 那么就就分析S1为主,其他同理可得的
打开后密密麻麻各种文件,不要慌,嵌入式固件基本都是C语言写的为主。所以建议还是需要有点点C语言基础好的,没有也没关系慢慢学
那么我们以.c和.h的文件为主,
所有程序都是main函数为入口的,习惯上相应的文件也多以main命名的,
当我们打开main文件,拉到最大底下就可以看到main函数了

接下就看看在main里都做了些什么吧
所以第一行是
  1. board_init();
复制代码
那么这个board_init 是干嘛的了,其实从方法命名上可以看出这个是板子初始化方法,查BouffaloSDK的文档也能知道
这个函数处于board目录下是包含时钟、引脚、内存管理和 console 的板级初始化

至于注释的暂时先不看
接下来就是
  1. tcpip_init(NULL, NULL);
复制代码
这个是网络底层的初始化,是lwip_os 至于lwip是什么可以自行百度(我也是百度来的)
  1. wifi_start_firmware_task();
复制代码
wifi_start_firmware_task 的实现是在main文件的第109行,wifi_start_firmware_task  命名很明确就是启动wifi库的任务
看下wifi_start_firmware_task 都做些什么
首先是
  1.     GLB_PER_Clock_UnGate(GLB_AHB_CLOCK_IP_WIFI_PHY | GLB_AHB_CLOCK_IP_WIFI_MAC_PHY | GLB_AHB_CLOCK_IP_WIFI_PLATFORM);
  2.     GLB_AHB_MCU_Software_Reset(GLB_AHB_MCU_SW_WIFI);
复制代码
作用是释放IP时钟,然后重置MCU
  1. GLB_Set_EM_Sel(GLB_WRAM160KB_EM0KB);
复制代码
设置EM的频率类型

  1. <font _mstmutation="1">    if (0 != rfparam_init(0, NULL, 0)) {
  2.         LOG_I("PHY RF init failed!\r\n");
  3.         return 0;
  4.     }

  5.     LOG_I("PHY RF init success!\r\n");</font>
复制代码
初始化RFPARAM,如果失败就直接返回,不然就继续下一步
  1.     extern void interrupt0_handler(void);
  2.     bflb_irq_attach(WIFI_IRQn, (irq_callback)interrupt0_handler, NULL);
  3.     bflb_irq_enable(WIFI_IRQn);

  4.     xTaskCreate(wifi_main, (char*)"fw", WIFI_STACK_SIZE, NULL, TASK_PRIORITY_FW, &wifi_fw_task);
复制代码
WIFI_IRQn进行配置去使能
然后创建 wifi_fw_task

接着是lwip_sntp_init, 实现是在293行,也就是同步网络时间的,网络时间服务器的是ntp1.aliyun.com如果想修改网络时间服务器,改这里就行了
  1.     bflb_mtd_init();
  2.     easyflash_init();
复制代码
是分区初始化和easyflash初始化
EasyFlash是一款开源的轻量级嵌入式Flash存储器库,方便开发者更加轻松的实现基于Flash存储器的常见应用开发。非常适合智能家居、可穿戴、工控、医疗、物联网等需要断电存储功能的产品,资源占用极低,支持各种 MCU 片上存储器。该库主要包括 三大实用功能 :
  • ENV 快速保存产品参数,支持 写平衡(磨损平衡) 及 掉电保护 功能

EasyFlash不仅能够实现对产品的 设定参数 或 运行日志 等信息的掉电保存功能,还封装了简洁的 增加、删除、修改及查询 方法, 降低了开发者对产品参数的处理难度,也保证了产品在后期升级时拥有更好的扩展性。让Flash变为NoSQL(非关系型数据库)模型的小型键值(Key-Value)存储数据库。
  • IAP 在线升级再也不是难事儿

该库封装了IAP(In-Application Programming)功能常用的接口,支持CRC32校验,同时支持Bootloader及Application的升级。
  • Log 无需文件系统,日志可直接存储在Flash上

非常适合应用在小型的不带文件系统的产品中,方便开发人员快速定位、查找系统发生崩溃或死机的原因。同时配合EasyLogger(我开源的超轻量级、高性能C日志库,它提供与EasyFlash的无缝接口)一起使用,轻松实现C日志的Flash存储功能。
SDK已经移植好了EasyFlash 所以直接调用初始化就可以了
  1.     /* lvgl init */
  2.     lv_log_register_print_cb(lv_log_print_g_cb);
  3.     lv_init();
  4.     lv_port_disp_init();
  5.     lv_port_indev_init();
复制代码
LVGL(轻量级和通用图形库)是一个免费和开源的图形库,它提供了创建嵌入式GUI所需的一切,具有易于使用的图形元素,美丽的视觉效果和低内存占用。
lv_log_register_print_cb 是向LVGL库注册log回调,可有可无,可以调试输出日志,也可以把log日志保存成日志文件方便长时间调试查找
lv_init();
lv_port_disp_init();
lv_port_indev_init();
是初始化LVGL库和LVGL显示及LVGL的操作输入方式
  1.     setup_ui(&guider_ui);

  2.     printf("lv_task_handler\r\n");
  3.     // lv_task_handler();
  4.     custom_init(&guider_ui);
  5.     printf("lvgl success\r\n");
  6.     xTaskCreate(lvgl_task, (char*)"lvgl", LVGL_STACK_SIZE, NULL, LVGL_TASK_PRIORITY, &lvgl_TaskHandle);
复制代码
设置UI界面及创建lvgl任务
  1. vTaskStartScheduler();
复制代码
启动任务调度器
  1. while (1) {
  2.         // printf("\r\n[%s] heap size ------------------- %d\r\n", __func__, xPortGetFreeHeapSize());
  3.         vTaskDelay(5000/portTICK_RATE_MS);
  4.     }
复制代码
while (1) 是保存程序能一直运行,该循环并不是阻止程序的跑飞,而是防止main()返回。因为在嵌入式中,main函数是不能返回的,而虽然我们所编写的单片机程序是用的是C语言,可最终下载到单片机里运行的程序包含两个部分:一是我们编写的程序代码,另一部分是编译器自动生成的代码,例如在keil里,观察我们所写的C语言程序在转换成汇编语言后,单片机的代码区,没有写程序的部分,例如全1或全0区域,程序运行到该区域后就会造成意料不到的结果,在没有while(1)的去情况下运行到最后一行的时候,会自动跳转到main函数的第一行,就造成了main()函数的返回。不同的C语言实现的单片机初始化代码会有不同的表现,例如:在cal_main后jmp,或者是在call_main后jmp 0,这些将会导致不可预料的结果。
vTaskDelay 是FreeRTOS的相对延时函数,与任务调度CPU时间片有关,有关FreeRTOS的知识了解下,不想了解的,那就照搬好了,哈哈哈
有些不明白作用代码,小白照搬没错的,不用,那么我们改界面能实现界面操作下的功能就好了,或者视想实现的功能的情况再做分析和了解
这是我对main函数里的代码的分析,不是专业的讲的可能不对,不对的地方欢迎大家指正


回复

使用道具 举报

爱笑 | 2023-8-7 08:24:59 来自手机 | 显示全部楼层
非常实用的第三篇,期待第四篇!
用心做好保姆工作
回复 支持 反对

使用道具 举报

粉色小风扇 | 2023-8-7 10:47:30 | 显示全部楼层
太实用了,比官方写的还好
回复 支持 反对

使用道具 举报

6
回复

使用道具 举报

繁星 | 2023-8-9 10:49:48 | 显示全部楼层
学习学习
回复

使用道具 举报

Mr.Tail | 2023-8-9 15:27:04 | 显示全部楼层
楼主出来更新啦,第四篇怎么没啦,生产队的驴都不敢这么歇
回复 支持 反对

使用道具 举报

Egbert | 2023-8-10 15:06:54 | 显示全部楼层
厉害
回复

使用道具 举报

Superjiango | 2023-8-10 15:17:27 | 显示全部楼层
感谢分享
回复

使用道具 举报

Ai-thinker | 2023-8-11 19:00:36 | 显示全部楼层
简直就是保姆级教程!
回复 支持 反对

使用道具 举报

王乐乐 | 2023-8-12 17:26:52 | 显示全部楼层
666
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则