Changes from v2.7.7 to v2.7.8:
[feat]:upgrade patch tool to v3.8 [opt]:opt code generate process display [opt]:opt login logic [opt]:opt ghs support [opt]:add MC03 ghs support/*
Copyright 2020-2025 Yuntu Microelectronics Co., Ltd. All rights reserved. SPDX-License-Identifier: BSD-3-Clause @file yt_linker.ld @brief*/
/* MEMORY MAP /
MEMORY
{
IVT (RX) : ORIGIN = 0x0, LENGTH = 0x400
TEXT (RX) : ORIGIN = 0x400, LENGTH = 0x7bc00
DTC (RX) : ORIGIN = 0x7c000, LENGTH = 0x1000
DTC_BACKUP (RX) : ORIGIN = 0x7d000, LENGTH = 0x1000
INF (RX) : ORIGIN = 0x7e000, LENGTH = 0x1000
INF_BACKUP (RX) : ORIGIN = 0x7f000, LENGTH = 0x1000
IVT_RAM (RW) : ORIGIN = 0x1fff8000, LENGTH = 0x400
STACK (RW) : ORIGIN = 0x20007c00, LENGTH = 0x400
RAM (RW) : ORIGIN = 0x1fff8400, LENGTH = 0xf800
}
/ SECTIONS */
SECTIONS
{
.IVT : {
}
上面是项目中的ld檔,修改完后SPI的初始程序(下面所示)会一直在下面循环出不来(修改前是没问题的),请问有可能是什么原因呢?会不会是.bss档没清0呢?请问sample code清0的程序在那呢?
while (spiState->rxCount != (uint16_t)0)
{
/* Read the last word from the RX FIFO */
if (SPI_GetStatusFlag(base, SPI_RX_DATA_FLAG))
{
SPI_DRV_ReadRXBuffer(instance);
}
}
CMake 在嵌入式编程中的地位已经越来越重要。它是一个强大的跨平台自动化构建系统,能够管理大型项目中的软件构建过程。以下是几个方面,说明了CMake在嵌入式领域的重要性和使用情况:
跨平台兼容性:CMake可以生成各种平台上的编译环境,包括Windows、MacOS和各种Unix-like系统。这使得它特别适合于开发可以在多种硬件上运行的嵌入式软件。 灵活性和可扩展性:CMake支持复杂的项目结构,可以轻松地管理多个库和应用程序的依赖关系。这对于嵌入式系统开发尤其重要,因为这些系统往往包含多个模块和组件。 工具链集成:CMake可以与各种编译器和工具链无缝集成,如GCC、Clang等,以及专用的嵌入式开发工具链,如ARM Keil、IAR等。这使得开发者可以更容易地在其选择的环境中编译和测试代码。YCT 支持生成CMAKE-GCC/CMAKE-IAR/CMAKE-KEIL/CMAKE-GHS 代码可重用性:使用CMake可以更容易地在不同项目之间重用代码。通过寻找包和库,CMake允许开发者将常用的功能或库集成到新的嵌入式项目中,而无需重新配置整个构建环境。 YCT生成的CMAKE文件架构YCT生成的cmake文件遵守最新的Modern Cmake的理解:
目标导向:Modern CMake 鼓励使用基于目标(target)的指令来管理构建配置,而不是基于全局的设置。每个目标可以定义自己的编译选项、预处理器定义、链接库等,这使得项目更加模块化和易于管理。 用法要求:在传统 CMake 中,库的依赖关系通常通过全局变量和目录链接来管理。而在 Modern CMake 中,推荐使用 target_link_libraries、target_compile_definitions 和 target_include_directories 等命令为目标设置用法要求。这样,当其他目标链接到库时,它们会自动继承正确的编译器标志、宏定义和包含路径。YCT生成的工程默认是如下的配置:
project 包含:GENERATED_CONFIG_TARGET,GENERATED_SDK_TARGET
用户可以直接在 USER CODE BEGIN 开始,USER CODE END 介绍的中间部分增加自己的配置代码,在这之间生成的代码不会被覆盖掉
# USER CODE BEGIN include # target_include_directories(...) # USER CODE END include # USER CODE BEGIN add_executable # target_sources(${project_elf} PRIVATE ..) # USER CODE END add_executable下面以增加bsp目录为例:
# USER CODE BEGIN include # 增加bsp/inc头文件搜索路径 target_include_directories(${project_elf} PRIVATE "bsp/inc") # USER CODE END include # USER CODE BEGIN add_executable # 增加源文件bsp/bsp.c 作为源代码 target_sources(${project_elf} PRIVATE "bsp/bsp.c") # USER CODE END add_executable 添加一个独立的target文件当源文件比较多的时候,或者想更好的控制代码的编译选项的时候,建议增加一个独立的target方式来实现,还是以bsp代码作为例子。
写一个BSP.cmake 文件放到bsp目录 cmake_minimum_required(VERSION 3.16) set(sources bsp.c ) #增加头文件 set(includes inc) #增加私有头文件 set(priIncludes ) add_library(BSP STATIC ${sources}) target_include_directories(BSP PUBLIC ${includes}) target_include_directories(BSP PRIVATE ${priIncludes}) #添加基础的编译选项,如CPU类型等 configcore(BSP ${CMAKE_SOURCE_DIR}) #增加宏定义,PRVIATA代表只有这个target里的源代码可以识别到这个宏,(不用加-D) target_compile_definitions(BSP PRIVATE BSP ) #对BSP target的代码单独设置优化选项,不影响其他模块 target_compile_options(BSP PRIVATE -O1 ) #如果BSP代码访问到了SDK的头文件,那么需要添加依赖的target target_link_libraries(BSP GENERATED_CONFIG_TARGET GENERATED_SDK_TARGET ) 修改顶层的CMakeLists.txt文件 # USER CODE BEGIN include #包含我们添加的BSP.cmake文件 include(${CMAKE_SOURCE_DIR}/bsp/BSP.cmake) #把BSP target 加入到project里 target_link_libraries(${project_elf} BSP) # USER CODE END include本方案基于YT Config Tool开发,使用Vscode+Cmake+Ozone工具链开发编译调试;基于Demo板硬件搭建实施;使用同星科技TC1012P CAN/LIN工具及同星科技TSmaster软件。
5e1b4583-94f0-4786-8b03-c70851e6bb51-image.png
新建YTM32B1MC03的JFLASH工程
e31f21d8-f1b4-4be0-960d-b1bdd08bc63d-image.png
找到Bootloader编译的烧程文件
9ceb1572-c212-4c57-a815-0b8d7e84806c-image.png
加载Bootloader文件
807cf228-2a95-43a9-b84f-4cf29b0332a3-image.png
擦除芯片(或者快捷键F4)
ace171c2-6b70-4201-99c3-50d9863d1af6-image.png
4ddc4c41-a35e-49fd-9404-c0a4cf401dd3-image.png
烧录程序(或者快捷键F6)
98170abf-7180-46a8-b7da-86a82369cd88-image.png
d226326b-944a-499f-ad36-a6af638db7fb-image.png 上下电运行Bootloader
拔掉JLINK烧录器,重新上下电后,板子重新工作,LED按照100ms快速闪烁,程序工作在Bootloader里面。 升级上位机配置
将FlashDriver文件、Application文件、SeedAndKey.dll几个文件放到升级上位机目录下。
435a580c-314d-4f54-8a4b-6d2e9007348d-image.png
打开升级上位机工程(如上图中.TSProj_x86文件)配置收发ID
45aa0f66-c39f-4794-8fc9-eb3a8489d382-image.png
配置TP时间参数,配置加密dll
6438a816-417d-45ad-b0f1-200d3b1e75ce-image.png
配置FlashDriver和Application和校验方式
8a33cf16-38f8-4cb4-b500-e24496e683db-image.png
配置自动诊断流程
b726c12e-406e-485c-9441-b671b51efb75-image.png
4. 执行升级
4.1 从Bootloader升级
dc21dc68-a986-49b0-a596-453a1e948641-image.png
升级完成后,LED灯1000ms闪烁,运行在Application程序中。
4.2 从Application升级
从Bootloader升级成功运行到Application后,再次点击运行,从Application升级。
1ba1902e-953b-4e91-978d-989d81d4320e-image.png
升级完成后,LED灯1000ms闪烁,运行在Application程序中。
4.3 StayInBoot升级
从Application升级中,是有升级请求标识的(KeepInBootVar变量)。
本方案设计上认为:
运行到Bootloader以后,如果通讯一半断开未发生升级服务(擦除芯片/请求下载/数据传输/下载退出等UDS服务),则即使有升级请求,可以超时退出重新跳转到Application运行;反之则必须StayInBoot等待重新升级。
4.3.1 未发生升级流程请求
升级一半,拔掉CAN线模拟通讯断开,升级失败
0b519b6a-91d3-44a0-b6bf-794829a3652b-image.png
通讯断开超时后,Bootloader重新进入Application运行,Demo板上LED灯1000ms闪烁。
4.3.2 已发生升级流程请求
执行到升级流程后,拔掉CAN线模拟通讯断开,升级失败
d9d0ca85-0330-4f42-b93e-c7196f69ca0b-image.png
通讯断开超时后,Boootloader不能进入Application,执行StayInBoot(重新复位或者上下电等均保持StayInBoot)。
重新执行升级
93dce8d5-9f9f-4619-b11d-62bbfea398c7-image.png
升级成功,Demo板上LED灯1000ms闪烁。
5. 附件代码
uds_can_fbl_mc03_release_20250529_2.zip
1、问题:
8cd613af-f399-40db-af3e-cb19baa96ca7-61120d41fcb69a4633ea860186e84c5.png
使用 YTM32B1MC03 SDK 1_3_1
我创建一个bootload工程,并集成了OTA升级功能,在升级完成后执行跳转APP操作,但APP无法正常启动,单步调试APP发现程序卡在了SPI Master初始化里不出来了
2、配置如下:
boot:
144423cd-d5d1-4b86-acb4-c3da6c24225d-6299e211d1c76e033e19a1985fc438e0_.png
06cadc11-2895-491d-af64-2a7f00a728fa-269d6a21873411c782f732b49a0207b0_.png
3、补充:
A、屏蔽掉无法初始化的外设,启动定时器,启动RTOS task,分别在两个位置操作IO翻转,示波器观察到,bootload升级完APP 跳转至APP后,IO一直在翻转,可以确定升级跳转都没问题。
B、在APP做地址偏移之前 程序所有功能都能正常执行。
C、另外,在修改APP的偏移地址后,编译出现下面图片中的信息
f9003ffb-6934-4cf6-8efb-247dc5812334-image.png
本方案基于YT Config Tool开发,使用Vscode+Cmake+Ozone工具链开发编译调试;基于Demo板硬件搭建实施;使用同星科技TC1012P CAN/LIN工具及同星科技TSmaster软件。
dbc523c3-21f4-4d1a-98b3-3b50282fac1a-image.png
新建YTM32B1MD14的JFLASH工程
c609c5a4-00b8-434b-a244-ae5bde77e46e-image.png
找到Bootloader编译的烧程文件
a0b6c9f7-8e07-40e7-aaa4-3076355c8caa-image.png
加载Bootloader文件
3900e9bd-c72e-4bc9-acc3-e2287c796557-image.png
擦除芯片(或者快捷键F4)
156d3954-7e53-4a13-8e5f-026e4a1bff49-image.png
fae94334-266c-4740-969c-f69d2650440e-image.png
烧录程序(或者快捷键F6)
ac129ec4-4b1b-42cc-80ba-44d166e59e25-image.png
6d1d1b5c-28af-444d-84a1-01280c9a14e3-image.png 上下电运行Bootloader
拔掉JLINK烧录器,重新上下电后,板子重新工作,LED按照100ms快速闪烁,程序工作在Bootloader里面。 升级上位机配置
将FlashDriver文件、Application文件、SeedAndKey.dll几个文件放到升级上位机目录下。
3f15b88d-af6f-43f6-b285-877a7d0ca419-image.png
打开升级上位机工程(如上图中.TSProj_x86文件)配置收发ID
ade66a27-609f-4150-8fde-a1f6f0833ec9-image.png
配置TP时间参数,配置加密dll
b8723e3c-c726-4876-b46a-e8e4488d0ec1-image.png
配置FlashDriver和Application和校验方式
95adfb20-50a3-4532-bd58-7b9a69330010-image.png
配置自动诊断流程
6d7f2e9f-73b1-4354-a03a-37f565903759-image.png
4. 执行升级
4.1 从Bootloader升级
b35da6fc-c501-4ebb-9e57-6167a92185d6-image.png
升级完成后,LED灯1000ms闪烁,运行在Application程序中。
4.2 从Application升级
从Bootloader升级成功运行到Application后,再次点击运行,从Application升级。
14c4d1e0-df93-4efb-80f3-fda4130399e3-image.png
升级完成后,LED灯1000ms闪烁,运行在Application程序中。
4.3 StayInBoot升级
从Application升级中,是有升级请求标识的(KeepInBootVar变量)。
本方案设计上认为:
运行到Bootloader以后,如果通讯一半断开未发生升级服务(擦除芯片/请求下载/数据传输/下载退出等UDS服务),则即使有升级请求,可以超时退出重新跳转到Application运行;反之则必须StayInBoot等待重新升级。
4.3.1 未发生升级流程请求
升级一半,拔掉CAN线模拟通讯断开,升级失败
b38f0141-062e-4be3-96d8-74d35fb5f42b-image.png
通讯断开超时后,Bootloader重新进入Application运行,Demo板上LED灯1000ms闪烁。
4.3.2 已发生升级流程请求
执行到升级流程后,拔掉CAN线模拟通讯断开,升级失败
d66fcdc3-fedc-4180-98b0-07e4e5dc9259-image.png
通讯断开超时后,Boootloader不能进入Application,执行StayInBoot(重新复位或者上下电等均保持StayInBoot)。
重新执行升级
e3fce7cf-3ad9-49f9-b415-9d64b295a22b-image.png
升级成功,Demo板上LED灯1000ms闪烁。
5. 附件代码
uds_can_fbl_md14_release_20250530_2.zip
-
Announcements
Announcements regarding our community
-
Discussion & Question
A place to talk about whatever you want or ask a question
-
Blogs
Blog posts from individual members
快速上手云途开发生态
发帖前请查看
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...