3.0.0 版本遇到MCAL工程打不开的情况可以参考:https://forum.ytmicro.com/topic/530/win10-打开mcal工程报-worker-terminated?_=1777532487956
开发JTAG保护,使用论坛最新的驱动后,在FLASH_DRV_EraseSector时返回error了,目前使用flash_driver_bin_20260411+SDK1.4;之前使用去年的flashdriver+SDK1.3验证成功过。
请帮忙分析一下,谢谢。
地址为:#define EFM_CUS_NVR_ADDR (0x10000000)
长度为:#define FEATURE_EFM_NVR_ARRAY_SECTOR_SIZE (0x800u)
flash_driver_bin_20260411.zip
aea6d09f-0244-45fc-b1be-98f769536456-25a2c485d7f488adbff908ad89848a4e.png d87e2b70-8f92-44f9-9ed8-263839ccdfc3-cb9098cb0e026c06c65a43e91fbd1651.png
uds收发几次报文后,YTM32B1LE1芯片调用发送函数卡在BUSY状态,发不出去东西
1.基础工程只配置了CANH和CANL引脚
fbab5089-31e5-4c07-ae00-7451221e2931-image.png
2.外设初始化
c5329698-bd4c-4a18-855c-840d942b9e1a-image.png
3.关于CAN的初始化
94a541a2-5d78-4935-8b70-0f52130595da-image.png
2fd39d64-7a49-4624-8102-739cb4f4a0b8-image.png
8cb41eb1-5c76-4b4a-ba7a-31ac22fe39bd-image.png
4.uds回复正响应时CAN处于BUSY状态(收发了几次后触发的发送BUSY)
46b7642e-d027-4fc9-a35f-b7e8e9c783be-image.png
f7314c2f-db9e-42d4-b60b-b5066546ea8c-image.png
bffd20b5-be22-4e00-83c5-285fa0a0527e-image.png
请大佬们帮忙看看是咋回事,目前是参考的CAN中断接收例程,没有添加busoff
欢迎使用3.0.0YT Config Tool(YCT), 下面是本次版本的更新内容,希望您在使用过程中有更好的体验。一些主要的更新内部包括:
Highlight MCAL YT-Agent 正式发布3a71901e-f734-485b-8917-90c9096ea3a4-2026-04-23 09-52-27.mp4
🤞 详细配置指南
Details [feat]:add MCAL YT-Agent ability [opt]: support three IDE file generate policy: merge, replace, skip [feat]:add main template others slot [bug]:fix cmake ghs fpu in link [bug]:disable softfp for no-dsp device [opt]:fix generate code copyright year [feat]: add cross chip import YCT middlware,SDK [bug]:fix cli doesn't use correct data to generate code [bug]:fix iar project file change the hex value [feat]:add new device YTM32Z1LS11、我已经看过这个教程帖子帮助挺大的,但是https://forum.ytmicro.com/topic/884/%E4%BA%91%E9%80%94mcu%E5%BC%80%E5%8F%91%E5%85%A5%E9%97%A8%E4%BB%8B%E7%BB%8D-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA%E6%8C%87%E5%8D%97,PDF中的“创建用户工程”章节,也是通过YCT生成的用户工程6476b2e1-5ae2-4fae-9bee-40775805fbf1-image.png
工程文件结构基本都是这样的,打开驱动文件列表是这样的,很乱
4389c062-002a-44cb-a070-c5d8107a4f66-image.png
2、基于1的情况,我想要自己搭建工程,整的工程干净清晰一些,比如下面这样吧0fa37edb-b487-49d4-86a2-4c70d7e8eea5-image.png 我看了一下咱们的工程里面的文件有点多,还有rtos文件,所以也不太懂那些文件需要哪些文件不需要,有这样面的教程吗?
本方案基于YT Config Tool开发,使用Vscode+Cmake+Ozone工具链开发编译调试;
基于YTM32B1MC03 Demo板硬件搭建实施;
使用同星科技TC1012P CAN/LIN工具及同星科技TSmaster软件实现UDS刷写上位机配置及刷写流程。
2de86f76-11d3-4c86-8181-b6a235e40ae5-image.png
新建YTM32B1MC03的JFLASH工程
799f5ef3-889e-4ed0-8c5d-75a0d8fefc2e-image.png
找到Bootloader编译的烧程文件
343afda5-62af-4dad-b63c-fd18e2e1e77f-image.png
加载Bootloader文件
62145fab-725b-468c-9f56-d1d97a3bc5dd-image.png
擦除芯片(或者快捷键F4)
a40e47a5-03ca-430a-ad01-3cdbc258a70b-image.png
4417b106-3955-4b4a-840b-7aa6009ca00c-image.png
烧录程序(或者快捷键F6)
14aa247a-bb68-48a3-91e8-1d04d4cec2fd-image.png
88420705-1524-428d-ad54-442b70b52570-image.png 上下电运行Bootloader
拔掉JLINK烧录器,重新上下电后,板子重新工作,LED按照100ms快速闪烁,程序工作在Bootloader里面。 升级上位机配置
将FlashDriver文件、Application文件、SeedAndKey.dll几个文件放到升级上位机目录下。
2ce4450a-8be8-4de7-b8fd-4013ffc30457-image.png
打开升级上位机工程(如上图中.TSProj_x86文件)配置NAD
c6ae6d88-e6bf-46f5-9fc6-212b80cabecd-image.png
配置TP时间参数,配置加密dll
79ba28be-a4a3-4d8e-8f7f-fac25f67d674-image.png
配置FlashDriver和Application和校验方式
7216e704-e018-4795-ab69-530b4cddcdda-image.png
配置自动诊断流程
12d17c0b-044c-471e-b123-c97b0539bcbf-image.png 执行升级
4.1 从Bootloader升级
89d1d77c-92ef-413a-b777-f0cb0843b1e3-image.png
升级完成后,LED灯100ms闪烁,运行在Application程序中。
4.2 从Application升级
从Bootloader升级成功运行到Application后,再次点击运行,从Application升级。
f0e0723f-a6d8-43f5-b72b-b7f5f81e7116-image.png
升级完成后,LED灯100ms闪烁,运行在Application程序中。
4.3 StayInBoot升级
从Application升级中,是有升级请求标识的(KeepInBootVar变量)。
本方案设计上认为:
运行到Bootloader以后,如果通讯一半断开未发生升级服务(擦除芯片/请求下载/数据传输/下载退出等UDS服务),则即使有升级请求,可以超时退出重新跳转到Application运行;反之则必须StayInBoot等待重新升级。
4.3.1 未发生升级流程请求
升级一半,拔掉LIN和GND模拟通讯断开,升级失败
14f022c1-9d44-4904-a6ab-4bd913742d1b-image.png
通讯断开超时后,Bootloader重新进入Application运行,Demo板上LED灯100ms闪烁。
4.3.2 已发生升级流程请求
执行到升级流程后,拔掉LIN和GND模拟通讯断开,升级失败
032c7fc9-6d53-4e1e-a563-59c390adabdc-image.png
通讯断开超时后,Boootloader不能进入Application,执行StayInBoot(重新复位或者上下电等均保持StayInBoot)。
重新执行升级
51476abd-fb4a-4cd5-a54a-68d1da6ea0c9-image.png
升级成功,Demo板上LED灯100ms闪烁。
附件代码
uds_lin_fbl_mc03_20250607.zip
修改了会话跳转权限问题:
uds_lin_fbl_mc03_20250623.zip
一、背景:
①使用LE05官方demo板 配置PTB_0~PTB_5引脚为输出模式
②启用dma,搬运buff中预设的编码到GPIO PCOR Register和GPIO PCOR Register以达到IO口输出电平的切换
ada796bc-ae97-410b-8f6c-61507dc0444e-1740566752304.png
e7f3e953-0562-42da-a1d1-f7089c912370-image.png
编码如:
/* PB0: 预设 PB1: 1 (固定高电平) PB2: 预设 PB3: 0 (固定低电平) PB4: 预设 PB5: 预设 */ /*dma_config0*/ volatile uint32_t ioSentBuff[16] = { // 第一组 PB0 = 高电平,PB1 = 高电平,PB2 = 高电平,PB3 = 低电平,PB4 = 高电平,PB5 = 高电平 0x00000037, // PSOR: PB0, PB1, PB2, PB4, PB5为高电平,PB3为低电平 0x00000000, // PCOR: 不变 // 第二组 PB0 = 低电平,PB1 = 高电平,PB2 = 低电平,PB3 = 低电平,PB4 = 高电平,PB5 = 高电平 0x00000000, // PSOR: 不变 0x00000005, // PCOR: 将PB0, PB2, PB4, PB5设置为低电平,PB3保持低电平,PB1保持高电平 // 第三组 PB0 = 高电平,PB1 = 高电平,PB2 = 高电平,PB3 = 低电平,PB4 = 低电平,PB5 = 低电平 0x00000005, // PSOR: PB0, PB2为高电平 0x00000030, // PCOR: PB4, PB5设置为低电平 // 第四组 0x00000030, 0x0000005, // 第五组 0x0000005, 0x00000030, // 第六组 0x000000030, 0x0000005, // 第七组 0x00000005, 0x00000030, // 第八组 0x00000030, 0x00000005, };二、现状
①DMA配置完后不工作,回调函数也从来没有触发过
DMA配置如下:
#define REG_ADDR_PSOR 0x4000f104 #define REG_ADDR_PCOR 0x4000f108 /* * dma_config0:配置DMA通道的结构体 * 该结构体定义了DMA通道的配置参数,包括虚拟通道配置、源请求、回调函数等 */ const dma_channel_config_t dma_config0 = { .virtChnConfig = 0, // 虚拟通道配置,设置为0表示未配置 .source = DMA_REQ_DISABLED, // 源请求禁用,表示DMA通道不从任何源接收请求 .callback = NULL, // 回调函数,设置为NULL表示不使用回调函数 .callbackParam = NULL, // 回调函数参数,设置为NULL }; /* * dmaChnConfigArray:DMA通道配置数组 * 该数组存储了所有DMA通道的配置结构体指针。此示例只配置了一个DMA通道。 */ const dma_channel_config_t *const dmaChnConfigArray[NUM_OF_CONFIGURED_DMA_CHANNEL] = { &dma_config0, // 配置第一个DMA通道的配置结构体 }; /* * dmaController_InitConfig:DMA控制器初始化配置 * 该结构体用于初始化DMA控制器的一些全局设置,例如错误停止行为等。 */ const dma_user_config_t dmaController_InitConfig = { .haltOnError = false, // 配置DMA控制器在发生错误时不停止 }; /* * dma_config0_State:DMA通道0的状态结构体 * 该结构体用于存储DMA通道0的状态信息,通常用于DMA操作的追踪和管理。 */ dma_chn_state_t dma_config0_State; /* * dmaChnState:DMA通道状态数组 * 该数组存储每个DMA通道的状态结构体指针。在此示例中只配置了一个DMA通道。 */ dma_chn_state_t *const dmaChnState[NUM_OF_CONFIGURED_DMA_CHANNEL] = { &dma_config0_State, // 指向通道0的状态结构体 }; /* * dmaState:DMA控制器状态结构体 * 该结构体用于存储DMA控制器的整体状态信息。 */ dma_state_t dmaState; /* * dma_transfer_config0LoopConfig:DMA循环传输配置 * 该结构体定义了DMA传输的循环配置参数,适用于数据传输时的循环模式。 */ dma_loop_transfer_config_t dma_transfer_config0LoopConfig = { .triggerLoopIterationCount = 1, // 循环触发的迭代次数为1 .srcOffsetEnable = true, // 启用源地址偏移 .dstOffsetEnable = false, // 禁用目标地址偏移 .triggerLoopOffset = 0, // 触发循环的偏移量为0 .transferLoopChnLinkEnable = false, // 禁用DMA通道链接 .transferLoopChnLinkNumber = 0, // 没有链接到其他DMA通道 .triggerLoopChnLinkEnable = false, // 禁用触发循环的DMA通道链接 .triggerLoopChnLinkNumber = 0, // 没有链接到其他DMA通道 }; /* * dma_transfer_config0:DMA传输配置结构体 * 该结构体定义了DMA的源地址、目标地址、传输大小、偏移量等设置。 * 这里的设置意味着DMA将从`ioSentBuff`(源地址)传输数据到目标地址。 */ dma_transfer_config_t dma_transfer_config0 = { .srcAddr = (uint32_t)&ioSentBuff, // 源地址,指向ioSentBuff数组test .destAddr = REG_ADDR_PSOR, // 初始目标地址为0x4000f104 .srcOffset = 8, // 源地址每次偏移8字节 .destOffset = 0, // 目标地址每次偏移0字节,结合逻辑实现地址切换 .srcTransferSize = DMA_TRANSFER_SIZE_8B, // 源数据传输大小为8字节 .destTransferSize = DMA_TRANSFER_SIZE_8B, // 目标数据传输大小为8字节 .srcModulo = DMA_MODULO_OFF, // 禁用源地址的环形缓冲 .destModulo = DMA_MODULO_OFF, // 禁用目标地址的环形缓冲 .transferLoopByteCount = 8, // 每次传输4字节 .srcLastAddrAdjust = 0, // 源地址最后的调整为0 .destLastAddrAdjust = -8, // 目标地址最后的调整为-8 .interruptEnable = true, // 启用DMA中断 .loopTransferConfig = &dma_transfer_config0LoopConfig, // 循环传输配置,使用之前定义的循环配置 };main.c主要代码如下:
/* USER CODE BEGIN PV */ volatile bool g_finish_flag = false; // 完成标志,用于标记 DMA 传输完成 /* USER CODE END PV */ /* Private function declare --------------------------------------------------*/ /* USER CODE BEGIN PFDC */ /* USER CODE END PFDC */ static void Board_Init(void); /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ void dma_transfer_callback(void) { g_finish_flag = true; // 设置完成标志为 true,表示 DMA 传输已完成 } /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ status_t status = STATUS_SUCCESS; /* USER CODE END 1 */ Board_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ status=DMA_DRV_InstallCallback(0, (dma_callback_t)dma_transfer_callback, NULL); //安装回调函数 if(status!=STATUS_SUCCESS) PRINTF("DMA_DRV_InstallCallback return err:%x\r\n",status); status=DMA_DRV_ConfigLoopTransfer(0U, &dma_transfer_config0);// 再配置 DMA 循环传输 if(status!=STATUS_SUCCESS) PRINTF("DMA_DRV_ConfigLoopTransfer return err:%x\r\n",status); DMA_DRV_DisableRequestsOnTransferComplete(0U, true); // 在传输完成后禁用请求 status=DMA_DRV_StartChannel(0U); if(status!=STATUS_SUCCESS) PRINTF("DMA_DRV_StartChannel return err:%x\r\n",status); while (1) { /* USER CODE END WHILE */ if (g_finish_flag) // 如果 DMA 传输完成 { PRINTF("DMA Transfer Completed!\r\n"); g_finish_flag = false; // 重置完成标志 DMA_DRV_StartChannel(0U); } /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }能否帮我看一下我的工程哪里有问题吗? 十分感谢
工程如附件IOPort_FlipLevel_Demo.zip
TRNG 生成时间依据下述公式
Time = 1/slow bus * ent_dly * samp_size
例如当前芯片为 YTM32B1ME05,slow bus 时钟为 40MHz,ent_dly 设置为 0xA00,sample size 默认设置为 0x200
则 Time = 1 / 40M * 0xA00 * 0x200 = 32.768ms
实际测量时间为 32.99ms,与理论时间符合
c5d8cb50-6b3f-4f80-8f9b-cd72da1f0fcf-img_v3_02e4_b6f79694-8a6d-432b-82c2-2f8264a141fg.jpg
864dcbdb-2a8e-47b2-b253-7581615cd2e0-img_v3_02e4_d526cc16-6250-4d66-b4be-4727dc26262g.jpg
IO 每 40ms 反转一次
6e1c7ba6-a570-4abf-bfc1-c9714302fd73-image.png
反转100 次后(约 4s),IO 停止反转,随后系统会因 WDG 超时而复位,复位后,程序会重新开始执行
80730bc4-938a-45b8-97e2-494a71c79776-image.png
此方法可以扩展到更长时间的 WDG 超时复位:
10s 超时:计数阈值设置为 250(40ms × 250 = 10s) 30s 超时:计数阈值设置为 750(40ms × 750 = 30s) 1min 超时:计数阈值设置为 1500(40ms × 1500 = 60s)客户 LIN 通信有 4 个从机节点,从节点 A 反馈报文的 CRC 校验和正好和从节点 B 的 PID 相同,就出现了从节点 B 异常反馈的情况。
6a27b0af-885c-4e5d-bfa1-f08e15ef16bd-image.png
0x8E 是 LIN 从节点 A 的校验和,正常从机响应的情况下应该是最后位,但由于 0x8E 是从节点 B 的 PID, 所以紧接着 0x8E 后面,从节点 B 又响应发送了 0xFF 和 0x3F ,此时从节点 B 就触发了LIN_ERR_RESP_STOPBIT 的错误。
2. 问题分析2.1 环境搭建
TSMaster 做为 LIN Master 发送 ID 为 0x0D 的从机响应
c966ab9b-23af-48e8-b669-ebb14eca3bf8-image.png
MC03 EVB Rev_A 作为从节点 A,基于 MCAL1_0_0 Lin_Slave_Demo 修改,响应 ID 为 0x0D 的报文,回复数据:0xFF, 0x7F, 0x00, 0x02, 0xE2, 0xFF, 0xFF, 0xFF,校验和为 0x8E
4d34f150-2774-4cc4-bece-ff7c495ae4d1-image.png
MC03 EVB Rev_B 作为从节点 B,直接烧入客户工程,响应 ID 为 0x0E(PID 为 0x8E) 的报文
2.2 尝试复现 使用逻辑分析仪抓取总线的波形,波形呈现的情况跟客户现场情况一致,从节点 A 的校验和为 0x8E,与从节点 B 的 PID 相同,从而导致从节点 B 出现了异常响应1802c92f-e9e8-43c7-a136-6c796506b1d2-image.png
2.3 根因分析
由于客户 LinIf_HeaderIndication 函数中,如果接收到的 PID 与代码设置响应的 PID 不一致,return RetVal 的值就是 E_NOT_OK,而驱动会对 LinIf_HeaderIndication 的返回值做判断,当 LinIf_HeaderIndication 返回值为 E_NOT_OK 的情况时,驱动不会做任何操作,状态机会一直停在接收 PID 的状态下,此时总线上的每一 Byte 都会被当作 PID 接收,因此从节点 A 的校验和 0x8E 就会被从节点 B 当初 PID 接收,并触发异常响应。之所以没有触发枕头超时错误,是因为状态机在接收 PID 模式的时候会关闭帧头超时检测。 Std_ReturnType LinIf_HeaderIndication(NetworkHandleType Channel, Lin_PduType* PduPtr)/*PRQA S 1503 # Allow function defined but not used. Conform to design. -HaiLong*/ { Std_ReturnType RetVal = E_NOT_OK; LinIf_SetReceivePID(); LinIf_SetSendPID(); LinIdleCounter = LIN_IDLE_HOLD; if(LinConf_LinChannel_LinChannel_0 == Channel) { if (SendConfigPid == PduPtr->Pid) { PduPtr->Cs = LIN_ENHANCED_CS; PduPtr->Dl = 8U; PduPtr->Drc = LIN_SLAVE_RESPONSE; PduPtr->SduPtr = ComLinFrame.ComSendType.ComSendData; SlaveResId = SendConfigPid; RetVal = E_OK; } if (RecvConfigPid == PduPtr->Pid) { PduPtr->Cs = LIN_ENHANCED_CS; PduPtr->Drc = LIN_MASTER_RESPONSE; MasterResId = RecvConfigPid; RetVal = E_OK; } if(LIN_Calculate_PID(0x3CU) == PduPtr->Pid) { PduPtr->Cs = LIN_CLASSIC_CS; PduPtr->Drc = LIN_MASTER_RESPONSE; MasterResId = 0x3C; RetVal = E_OK; } if(LIN_Calculate_PID(0x3DU) == PduPtr->Pid) { PduPtr->Cs = LIN_CLASSIC_CS; PduPtr->Dl = 8U; PduPtr->Drc = LIN_SLAVE_RESPONSE; if(L_Data_Request(LinTpDiagData.ui8_LinTpDiagResponse) == E_OK) { PduPtr->SduPtr = LinTpDiagData.ui8_LinTpDiagResponse; RetVal = E_OK; } else { /*do nothing*/ } SlaveResId = 0x3D; } } return RetVal; } 2.4 解决方案1. MCAL_1_0_0 中 LinIf_HeaderIndication 函数的返回值必须 E_OK
3. 补充说明1. MCAL_2_3_0 驱动已经修复了这个风险点
Config Tool Version:2.7.8
ME05 SDK version:1.4.0
EVB version: YTM32B1ME0-EVB-Q144 Rev.C
有客户需要用MCU引脚输出特定波形进行通信,如下图:
54fe2b5d-4f3f-43d4-83e2-a5cf1d39d48c-image.png
MCU没有特定的硬件外设可以输出这种波形,使用IO模拟会很占用CPU资源,但是用SPI进行组帧可以模拟出这种波形。
通过调整SPI的波特率和帧间隔时间去满足它的时序要求。
固定发送特定的组帧,即用一个SPI帧去模拟一bit时序,如下图:
c1612f8c-76fe-46d0-ba39-c568f64b541f-image.png
设定SPI的帧长度(Framesize)为6,0码 高电平/低电平时间:1/2;1码 高电平/低电平时间:2/1.
如上时序中1bit的理想时间是720ns,我们假设是750ns,即SPI一帧750ns,
那SPI的1bit就是 750ns/6 = 125ns,可得SPI的波特率为1 / 125ns = 1 / 0.000 000 125 = 8M.即设定SPI的波特率为8M最合适。
功能时钟选择PLL, 120M时钟, 3分频,所以SPI的功能时钟为40M.
278d4ba8-cd11-4da1-acd5-6dbf5778f475-image.png
这里只考虑主机发送的配置:
fde763e0-db49-4f03-92d5-bb3a8fc4a656-image.png
因为要尽量满足时钟波形连续无间隔,需要对CS2CLK,CLK2CS,Frame2Frame进行微调,这里都设置1。
1bdf13d4-bad8-4daf-9b43-187bd7247988-image.png
设置为Frame2Frame讲个刚好为60ns,与时钟线的负脉宽基本一样
b8834884-cfc8-48c4-97ae-91e783fa09b5-image.png
此函数可将16进制数据转化为对应的码元数据,方便SPI发送函数传参。
比如说0x23,它的二进制数据是0010 0011,转换后的数据数组就是
{0x30, 0x30,0x3C, 0x30, 0x30, 0x30,0x3C, 0x3C}
e35dc1bd-fddb-44c8-877b-15305751dd52-image.png
T0H典型值:250ns。
T0L典型值:500ns。
5f946a40-374b-46a4-ab9d-a9daf0cc8f83-image.png
T1H典型值:500ns。
T1L典型值:250ns。
d79c86bd-3f64-4827-b6dd-3f1b48a23ef5-image.png
12f2b216-ff1b-4829-84fc-fb75ba6ab282-image.png
5.4 Reset码249495ab-18ee-414f-8cfa-1859fa161ae5-image.png
6. 示例工程SPI模拟时序波形.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哦...