首页 > 编程语言 >DAPLINK 源码学习(1)BL 之 main() 函数

DAPLINK 源码学习(1)BL 之 main() 函数

时间:2024-10-23 10:11:15浏览次数:1  
标签:main DAPLINK 函数 BL init 源码 board bootloader config

目录

bootloader 主函数

1)我们以 stm32f103xb_bl 为例,从 bootloader 项目的 main() 函数开始:

  • (1)sdk_init():MCU 初始化
  • (2)gpio_init():USB 相关引脚配置
  • (3)config_init():RAM 中配置初始化
  • (4)board_bootloader_init():nothing
  • (5)reset_button_pressed() 和 modify_stack_pointer_and_start_app():运行 BL or IF
  • (6)OS 和 main task 配置:
    • osKernelInitialize():初始化
    • osThreadNew(main_task):主任务回调函数 main_task()
    • osKernelStart():启动主任务

1 sdk_init()

1)sdk_init() 是 DAPLINK 提供的 厂商 sdk 初始化 接口函数。移植时可实现该函数,以进行时钟等外设上电初始化:

// 在 /source/hic_hal/sdk.h 文件中声明
void sdk_init(void);

// 在 /source/daplink/sdk_stub.c 文件中提供默认实现
__WEAK void sdk_init()
{
    // Do nothing
}

2)在 stm32f103xb_bl 项目中,该函数的调用逻辑如下:

2 gpio_init()

1)gpio_init() 是 DAPLINK 提供的 LED、按键初始化接口函数。移植时可实现该函数,用来来指示 USB 状态、等

2)在 stm32f103xb_bl 项目中,该函数的调用逻辑如下:

3 config_init()

config_init() 用来进行配置初始化。其创建 static cfg_ram_t 结构体的两个实例:config_ram 和 config_ram_copy。

可以用来对配置进行备份:比如我们在程序运行过程中(非上电)调用 config_init() 函数,则当前配置将保存到 config_ram_copy 中;此时我们可以对配置进行临时修改,修改完成后如果我们想恢复,只需要将 config_ram.key 修改一下后再次调用 config_init() 函数即可。

2)在 stm32f103xb_bl 项目中,该函数的调用逻辑如下:

4 board_bootloader_init()

board_bootloader_init() 是 DAPLINK 提供的板级 bootloader 初始化接口函数。移植时可实现该函数,用来对开发板进行初始化(DAPLINK 中,除了 nrf52820 芯片对 bootloader 所在的 flash 进行锁定外,没有其它厂商实现该函数)。

// 定义在 source/daplink/bootloader/main_bootloader.c 文件中
__WEAK void board_bootloader_init()
{
    return;
}

5 运行 IF 还是 BL?

BL 表示 bootloader,用来升级 IF;IF 则表示 interface,是 DAPLINK 实现烧录的执行代码。

该部分代码逻辑如下:

if (!reset_button_pressed()
    && g_board_info.target_cfg
    && validate_bin_nvic((uint8_t *)g_board_info.target_cfg->flash_regions[0].start)
    && !config_ram_get_initial_hold_in_bl()) {
    
    // change to the new vector table
    SCB->VTOR = g_board_info.target_cfg->flash_regions[0].start; //bootloaders should only have one flash region for interface
    
    // modify stack pointer and start app
    modify_stack_pointer_and_start_app((*(uint32_t *)(g_board_info.target_cfg->flash_regions[0].start)),
            (*(uint32_t *)(g_board_info.target_cfg->flash_regions[0].start + 4)));
}
  • 1)首先是 reset_button_pressed() 函数,该函数主要用来判断当前是否是复位状态。以 stm32f103xb_bl 为例来看,当 MCU 低电平复位时,该函数返回 1,无法进入 if 逻辑内。

  • 2)然后是 validate_bin_nvic() 函数,该函数有两个判断:

    • (1)判断 SP 指针。即 IF 在 FLASH 起始地址存储的内容是否在 RAM 的地址范围内。

      当我们没有烧录 IF 时,该地址上存储值为 0xFFFFFFFF,不在 RAM 范围内。将无法进入到该 if 判断内部执行。

    • (2)判断 Reset_Handler、NMI_Handler、HardFault_Handler 指针。即 IF 在 FLASH 起始地址偏移 4、8、12 位置存储的内容是否在超出 FLASH 区域

  • 3)最后是 config_ram_get_initial_hold_in_bl() 函数,该函数用来判断是否 hold in bootloader。
    cfg_ram_t config_ram 结构体持有的 uint8_t 类型的 hold_in_bl 变量,该变量只有在虚拟文件系统 vfs 改变时才会通过调用 config_ram_set_hold_in_bl() 函数来修改。

  • 4)modify_stack_pointer_and_start_app() 函数,从 FLASH 中 IF 所在位置开始运行。

6 main_task()

  • 1)OsKernelInitialize():初始化 OS 内核
  • 2)osThreadNew():将 main_task() 函数赋值给到 OS 的主函数回调上。
  • 3)osKernelStart():回调 main_task() 函数

7 总结

关于 main() 函数,我们来总结一下移植时需要修改的地方:

移植点 描述
sdk_init() 厂商 sdk 初始化。主要用来进行时钟 RCC 的初始化
gpio_init() led、button 初始化。USB 状态指示灯、复位按钮初始化
board_bootloader_init() 缺省。bootloader flash
board_info_t g_board_info 板子信息定义。包括 daplink 名称、mcu flash/ram 信息等

标签:main,DAPLINK,函数,BL,init,源码,board,bootloader,config
From: https://www.cnblogs.com/luyaocf/p/18475066

相关文章

  • Playwright 源码 启动 Chromium 的命令
    问:Playwright无声无息地启动了Chromium,到底底层执行了个啥子?带着问题,开启探险之旅!!!......
  • SpringBoot养老知识考试管理系统-计算机毕业设计源码86305
    摘要随着人口老龄化趋势的加剧,老年人的健康管理和养老知识学习变得尤为重要。然而,传统的养老知识教育方式存在信息不对称、资源有限等问题,无法满足老年人广泛的学习需求。因此,本系统旨在利用互联网技术,为老年人提供便捷的养老知识学习和考试平台,帮助他们掌握养老知识、提高健......
  • springboot微信点餐小程序-计算机毕业设计源码93176
     目 录摘要1绪论1.1研究背景1.2 研究意义1.3微信开发者工具介绍2 系统分析2.1可行性分析2.2系统流程分析2.2.1数据新增流程2.2.2 数据删除流程2.3 系统功能分析2.4 系统用例分析3系统总体设计3.1 系统功能模块设计3.2 数据库设计......
  • CogVideo---CogVideoX-微调代码源码解析-四-
    CogVideo&CogVideoX微调代码源码解析(四)ContributionGuideTheremaystillbemanyincompleteaspectsinthisproject.Welookforwardtoyourcontributionstotherepositoryinthefollowingareas.Ifyoucompletetheworkmentionedaboveandarewillingto......
  • CogVideo---CogVideoX-微调代码源码解析-十一-
    CogVideo&CogVideoX微调代码源码解析(十一).\cogvideo-finetune\sat\sgm\modules\encoders\__init__.py请提供需要注释的代码,我将为您添加注释。.\cogvideo-finetune\sat\sgm\modules\video_attention.py#导入PyTorch库importtorch#从上级模块导入必要的组件from.......
  • CogVideo---CogVideoX-微调代码源码解析-十三-
    CogVideo&CogVideoX微调代码源码解析(十三)VideoCaptionTypically,mostvideodatadoesnotcomewithcorrespondingdescriptivetext,soitisnecessarytoconvertthevideodataintotextualdescriptionstoprovidetheessentialtrainingdatafortext-to-vid......
  • CogVideo---CogVideoX-微调代码源码解析-十二-
    CogVideo&CogVideoX微调代码源码解析(十二).\cogvideo-finetune\sat\vae_modules\autoencoder.py#导入所需的标准库和第三方库importlogging#日志库,用于记录信息importmath#数学库,提供数学函数importre#正则表达式库,用于字符串匹配importrandom#随机数库,......
  • CogVideo---CogVideoX-微调代码源码解析-十-
    CogVideo&CogVideoX微调代码源码解析(十).\cogvideo-finetune\sat\sgm\modules\diffusionmodules\sampling.py#部分移植自https://github.com/crowsonkb/k-diffusion/blob/master/k_diffusion/sampling.py"""#从类型提示模块导入字典和联合类型fromtypingimportDict......
  • CogVideo---CogVideoX-微调代码源码解析-七-
    CogVideo&CogVideoX微调代码源码解析(七).\cogvideo-finetune\sat\sgm\modules\autoencoding\regularizers\base.py#导入抽象方法和类型注解fromabcimportabstractmethod#导入任意类型和元组类型fromtypingimportAny,Tuple#导入PyTorch和功能模块importtorc......
  • CogVideo---CogVideoX-微调代码源码解析-六-
    CogVideo&CogVideoX微调代码源码解析(六).\cogvideo-finetune\sat\sgm\modules\autoencoding\losses\discriminator_loss.py#导入所需的类型定义fromtypingimportDict,Iterator,List,Optional,Tuple,Union#导入NumPy库importnumpyasnp#导入PyTorch库im......