/* ********************************************************************************************************* * * 模块名称 : CAN方式固件升级 * 文件名称 : demo_canfd_update.c * 版 本 : V1.0 * 说 明 : CAN方式固件升级 * * 修改记录 : * 版本号 日期 作者 说明 * V1.0 2022-06-15 Eric2013 正式发布 * * Copyright (C), 2022-2030, 安富莱电子 www.armfly.com * ********************************************************************************************************* */ #include "main.h" #include "demo_canfd_update.h" #include "bsp_cpu_flash.h" #include "bsp_msg.h" #include "bsp_can.h" /* ********************************************************************************************************* * 函数 ********************************************************************************************************* */ /* ********************************************************************************************************* * 宏定义 ********************************************************************************************************* */ #define AppAddr 0x08020000 /* APP地址 */ /* ********************************************************************************************************* * 变量 ********************************************************************************************************* */ __IO uint32_t uwCRCValue; __IO uint32_t uwExpectedCRCValue; __IO uint32_t uwAppSize; uint8_t buf[1024]; uint32_t RecCount = 0; uint32_t RecCount0 = 0; uint32_t RecSize = 0; uint8_t RecCplt = 0; uint32_t filesize = 0; uint32_t Bus_Error=0; uint32_t update_index = 0; uint32_t update_index_true = 0; uint32_t update_sum = 0; uint32_t update_sum_true = 0; /* ********************************************************************************************************* * 函 数 名: DemoCANUpdate * 功能说明: CAN烧录 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void DemoCANUpdate(void) { uint8_t cmd; uint32_t SectorCount = 0; uint32_t SectorRemain = 0; uint32_t i; uint32_t TotalSize = 0; uint8_t ucState; MSG_T msg; can_Init(); /* 初始化CAN */ while (1) { if (bsp_GetMsg(&msg)) { switch (msg.MsgCode) { case MSG_CAN2_RX: /* 接收到CAN设备的应答 */ cmd = g_Can2RxData[0]; /* 开始传输固件命令 **************/ if(cmd == '$') { /* 接收够224个数据 */ RecSize = g_Can2RxData[1]; update_index = g_Can2RxData[2] + (g_Can2RxData[3] << 8) + (g_Can2RxData[4] << 16) + (g_Can2RxData[5] << 24); if(update_index==update_index_true && Bus_Error==0) { update_sum = g_Can2RxData[6] + (g_Can2RxData[7] << 8); update_sum_true = 0; for(uint8_t i=0;iCTRL = 0; SysTick->LOAD = 0; SysTick->VAL = 0; /* 关闭所有中断,清除所有中断挂起标志 */ for (i = 0; i < 8; i++) { NVIC->ICER[i]=0xFFFFFFFF; NVIC->ICPR[i]=0xFFFFFFFF; } /* 使能全局中断 */ ENABLE_INT(); /* 跳转到应用程序,首地址是MSP,地址+4是复位中断服务程序地址 */ AppJump = (void (*)(void)) (*((uint32_t *) (AppAddr + 4))); /* 设置主堆栈指针 */ __set_MSP(*(uint32_t *)AppAddr); /* 在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针 */ __set_CONTROL(0); /* 跳转到系统BootLoader */ AppJump(); /* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */ while (1) { } } /* ********************************************************************************************************* * 函 数 名: can_Init * 功能说明: 配置CAN硬件 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void can_Init(void) { bsp_InitCan2(); } /* ********************************************************************************************************* * 函 数 名: can_DeInit * 功能说明: 退出CAN硬件硬质,恢复CPU相关的GPIO为缺省;关闭CAN中断 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void can_DeInit(void) { bsp_DeInitCan2(); } /***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/