【飞思卡尔 MC9S12】BootLoader 下位机

发布者:SereneNature最新更新时间:2021-07-16 来源: eefocus关键字:飞思卡尔  MC9S12  BootLoader  下位机 手机看文章 扫描二维码
随时随地手机看文章

上一篇:【飞思卡尔 MC9S12】内部D-Flash模拟EEPROM


本篇讲述BootLoader下位机的开发。


刚到新公司第三天就接了一个项目,搞到现在才局部完成,更新比较慢了。


先上传源码比较实际,再介绍基本功能。


源码地址:https://download.csdn.net/download/u010875635/11692136


实际上搞定CAN通信和Flash读写,Bootloader下位机就没什么问题了。


注意一下Bootloader与App的分区划分。


Bootloader与App分别占用2个非分页区。


Bootloader: 0xC000-0xFFFF(实际到0xF7FF,保留一个sector给vector table)


Application: 0x4000-0x7FFF,加上其它分页区(转换成全局地址为0x7F4000-0x7FFFF)

Bootloader实际上核心逻辑没有什么东西,无非就是传输协议,数据重新组合,然后写进去,只不过数据组合的方式决定了刷写的速度。


MCU上电后,首先会进入Bootloader中,1s内没有收到刷写命令(如果App可以接收跳转,则时间不需要这么久,可直接从App跳到Bootloader进行刷写),就会跳到App。数据的CAN ID和命令的CAN ID分开。


本Bootloader采用按行传送数据,减少地址传送次数,以及数据和命令分开传送的方式,提高单位时间数据传送量,以加快刷写速度,在刷写结束后,做个简单校验(例如CRC校验,此处没有做,大家可以自行补充),然后在某个地方写Flag标识,开机启动时Bootloader会读取这个标识,然后判断App是否完好,若是完好,则会在超时后跳到App。


需要注意的是,跳转前要将使用的设备DeInit,例如CAN,否则App使用时可能会有问题。

核心逻辑代码如下(详细请参考源码):


void main(void) 

{

    

    McuDrivers_System_Init();

    McuDrivers_GPIO_Init();

    McuDrivers_CAN2_Init();

 

EnableInterrupts;

CAN_Send(1,g_Bootloader_EntryBootloaderReponse,8);

 

 

    for(;;) 

    {

        CAN_Tasks(); //can

 

        Tick_Tasks();

     

  

        //_FEED_COP(); /* feeds the dog */

    } /* loop forever */

  /* please make sure that you never leave main */

}

 

 

 

UINT32 countTick = 0;

UINT8 Tick_Tasks()

{

    countTick++;

    //每隔1000大约1ms

    if(countTick==1000)

    {

        countTick=0;

        return Time_Tasks();

    }

    return 1;

}

 

UINT32 countTimer=0;

 

UINT8 Time_Tasks()

{

    countTimer++;

    if(countTimer<(1000*g_GOTOAPP_TIMEOUT))

{

if(countTimer%500==0)

McuDriver_GPIO_PB0_Toggle(); //blue led blink

}

    else if(countTimer==(1000*g_GOTOAPP_TIMEOUT))

    {

    app_entry();

        return 0;

    }

 

    if(countTimer>(1000*g_GOTOAPP_TIMEOUT*10))

        countTimer=(1000*g_GOTOAPP_TIMEOUT)+1; 

 

 

 

    return 1;

}

 

 

Scm_CanStandData m_CAN_RxMsg;  /* for CAN RX  */

 

#pragma MESSAGE DISABLE C1420 //result of function call is ignore

//send can data

void CAN_Send(UINT8 isCmdType,UINT8 *datas,UINT8 length)

{

    m_CAN_RxMsg.U32ID = isCmdType==1?SendCmdCANID:SendDataCANID;

    m_CAN_RxMsg.DataType = 0; //data type

    m_CAN_RxMsg.DataFormat = 1;   //ext

    m_CAN_RxMsg.DataLength = length;

    memcpy(m_CAN_RxMsg.Datas,datas,length);

    

    McuDrivers_CAN2_SendData(&m_CAN_RxMsg);     

}

 

void Software_Wait(UINT16 milliSeconds)

{

    UINT16 i,j;

    for(i=0;i        for(j=0;j<1000;j++) ;

               

}

 

//UINT32 g_ReceiveCount=0;

UINT8 m_State = 0;

#pragma MESSAGE DISABLE C2705//result of function call is ignore

//Receive Can Data

void CAN_Tasks()

{

    Protocol_Bootloader_CmdType result;

    int reponse = 0;

    if(McuDrivers_CAN2_GetStateRX()) 

    {

        if(McuDrivers_CAN2_ReadData(&m_CAN_RxMsg)==ERR_OK)

        {

            if(m_CAN_RxMsg.U32ID==ReceiveCmdCANID)  //cmd id

            {

                result = Bootloader_DataParse_g(m_CAN_RxMsg.Datas,m_CAN_RxMsg.DataLength);

 

        switch (result)

        {

        case Reset:

        app_entry();          /*jump to app and should not back */

        break;

       

        case FlashErase:

        if(m_State==0)

        {

            countTimer=(1000*g_GOTOAPP_TIMEOUT)+1;

        reponse = UserFlash_EraseIvtAndUserAppBlock_g(m_CAN_RxMsg.Datas,m_CAN_RxMsg.DataLength);

                        switch(reponse)

                        {

                            case -1:

                            g_Bootloader_EraseFlashReponse[1]=AddressChecksumError;

                            break;

                            case -2:

                            g_Bootloader_EraseFlashReponse[1]= AddressOverRange;

                            break;

                            case -3:

                            g_Bootloader_EraseFlashReponse[1]= EraseFailed;

                            break;

                            default:

                                g_Bootloader_EraseFlashReponse[1]= CmdRunOK;

                                UserFlash_ClearAppIndicate_g(APP_UPDATE_OK_GLOBAL_ADDR); //clear app flag

                McuDriver_GPIO_PB0_Set(); // led 0 off

                m_State = 1;

                            break;

                        }

                        CAN_Send(1,g_Bootloader_EraseFlashReponse,8); 

 

        }

       

        break;

          

            case SendAddress:

            if(m_State==1)

            {

               // g_ReceiveCount++;

              //if(g_ReceiveCount>=20063)

              //  _asm(nop);

                reponse = UserFlash_AddrParse_g(m_CAN_RxMsg.Datas,m_CAN_RxMsg.DataLength);

                

                switch(reponse)

                        {

                            case -1:

                            g_Bootloader_SendAddressReponse[1]=AddressChecksumError;

                            break;

                            case -2:

                            g_Bootloader_SendAddressReponse[1]= DataChecksumError;

                            break;

                            default:

                            g_Bootloader_SendAddressReponse[1]= CmdRunOK;

                            break;

                        }

                CAN_Send(1,g_Bootloader_SendAddressReponse,8);

            }

                

            break;

            

       

 

        case DataEnd:

        reponse = UserFlash_CheckLastLineChecksumAndWritten_g(); //write last line to flash

        switch(reponse)

                        {

                            case -1:

                            g_Bootloader_DataProgramEndReponse[1]=DataChecksumError;

                            break;

                            case -2:

                            g_Bootloader_DataProgramEndReponse[1]= FlashProgramFailed;

                            break;

                            default:

[1] [2]
关键字:飞思卡尔  MC9S12  BootLoader  下位机 引用地址:【飞思卡尔 MC9S12】BootLoader 下位机

上一篇:MC9S12XE的模拟EEPROM综述
下一篇:飞思卡尔MC9S12(X)系列的内存资源分配和.prm文件的结构

推荐阅读最新更新时间:2024-11-13 20:22

飞思卡尔半导体推出汽车视觉片上系统(SoC)S32V视觉微处理器
飞思卡尔半导体推出全球首个汽车视觉片上系统(SoC)S32V视觉微处理器,该微处理器具有必要的可靠性、安全和安防措施,可实现自我感知汽车的自动化和辅助驾驶功能。   S32V采用多种汽车级技术,使汽车业超越了现有的以便捷性为中心的“辅助”模式,推动汽车业进入一个新时代。到那时,汽车将能够捕捉数据、处理数据并在危急情况下与驾驶员联合控制,这种能力是从当前的“辅助”时代迈向未来完全无人驾驶汽车时代的基本桥梁。   作为飞思卡尔SafeAssure功能安全计划的组成部分,S32V微处理器在结构上符合最严格的ISO 26262功能安全标准,旨在实现测量单位为十亿分之几的汽车级质量指标。这种高可靠性再加上集成式第二代CogniVu
[单片机]
详解bootloader的执行流程与ARM Linux启动过程分析
ARM Linux启动过程分析是本文要介绍的内容,嵌入式 Linux 的可移植性使得我们可以在各种电子产品上看到它的身影。对于不同体系结构的处理器来说Linux的启动过程也有所不同。 本文以S3C2410 ARM处理器为例,详细分析了系统上电后 bootloader的执行流程及 ARM Linux的启动过程。 1、引 言 Linux 最初是由瑞典赫尔辛基大学的学生 Linus Torvalds在1991 年开发出来的,之后在 GNU的支持下,Linux 获得了巨大的发展。虽然 Linux 在桌面 PC 机上的普及程度远不及微软的 Windows 操作系统,但它的发展速度之快、用户数量的日益增多,也是微软所不能轻视的。而近些
[单片机]
详解<font color='red'>bootloader</font>的执行流程与ARM Linux启动过程分析
基于STM32F407的bootloader、IAP、Flash_APP、上位机设计(二)
第二部分:Flash_App设计 前期准备: 一、硬件:STM32F407VET6板一块,IAP使用串口通信,板上需引出串口或有DB9接口都行(如果不使用串口,使用其他协议均可)。 二、软件:KEIL4.73版本,关于IAP读写FLASH的源代码是使用战舰的源码,共有iap、stmflash、sys等文件,上位机软件设计使用QT5.5。 工作开始: 三、Flash_App工程中有几个需要修改的地方。 (1):Target里面IROM1,Start修改为0X8010000,这个和Bootload的#define FLASH_APP1_ADDR 0x08010000 一致,Size修改为0xF0000,代
[单片机]
NXP 120亿联姻Freescale,MCU和汽车半导体霸主出世
增强了NXP在 智能世界的安全连接 中的领导地位 成为了全球第一的汽车半导体厂商 成为了全球第一的通用MCU半导体厂商 此次合并将缔造一个高性能的混合信号半导体行业的领导者,有超过100亿美元的收入总和。合并后的公司将成为汽车半导体解决方案和通用微控制器(MCU)产品的市场领导者。合并后的公司将把握住对安全、连接和处理的更多需求所带来的机遇。 今天的宣布是一个变革的步骤,我们的目的是成为高性能混合信号解决方案的行业领导者。结合NXP和飞思卡尔在高成长的智能世界创建一个强大的集团。我们期待继续在整体市场显着增长,推动世界一流的盈利能力并挣得更多的现金,两家的结合将使得飞思卡尔和NXP公司的股
[半导体设计/制造]
NXP 120亿联姻<font color='red'>Freescale</font>,MCU和汽车半导体霸主出世
U-BOOT的启动流程及移植
1 Bootloader及u-boot简介 Bootloader 代码是芯片复位后进入操作系统之前执行的一段代码,主要用于完成由硬件启动到操作系统启动的过渡,从而为操作系统提供基本的运行环境,如初始化CPU、 堆栈、存储器系统等。Bootloader 代码与CPU 芯片的内核结构、具体型号、应用系统的配置及使用的操作系统等因素有关,其功能类似于PC机的BIOS程序。由于bootloader和CPU及电路板的配置情况有关,因此不可能有通用的bootloader ,开发时需要用户根据具体情况进行移植。嵌入式Linux系统中常用的bootloader有armboot、redboot、blob、u-boot等,其中u-boot是当前比较
[单片机]
飞思卡尔ISO26262 ASIL-D电子助力转向演示系统方案
1. 概述 汽车电子助力转向系统(EPS)可以降低能耗,提高驾控智能水平,且更容易与其它高级安全系统集成,因而近年来在汽车中得到了大力的推广和发展。在这个领域,国内EPS供应商与国外供应商的主要差距体现在EPS控制技术和系统安全设计两方面。 飞思卡尔半导体公司在2011年推出了“采用永磁同步电机的汽车电子助力转向电控单元解决方案”,旨在帮助国内EPS供应商掌握永磁同步电机的控制技术。这一方案获得了《世界电子元器件》期刊 “2012年全国优秀IC和电子产品解决方案”最佳方案奖。 在2012年的飞思卡尔中国技术论坛上,飞思卡尔又推出了针对道路车辆-功能安全国际标准ISO26262 ASIL-D等级的EPS演示系统方案。该方案不仅演示了
[嵌入式]
Mouser 备货Freescale Kinetis KV1x 微控制器
2014 年 7 月 11 日 – 贸泽电子 (Mouser Electronics) 即日起开始供应Freescale Semiconductor 的 Kinetis® KV1x 微控制器系列产品。Kinetis V 系列 KV1x MCU 产品是 Freescale 全新 Kinetis V 系列的入门级产品,此可扩展的微控制器 (MCU) 系列产品的目标应用市场为数字电机控制。采用 75 MHz ARM® CortexM0+ 内核的 Kinetis KV1x 系列产品具有整数除法和平方根协处理器,从而降低了因需要电机控制算法而引起的 CPU 负荷。 相较于同级的其他微控制器,Mouser Electronics 提供
[工业控制]
无法使用内置Bootloader的DFU方式进行固件升级
1 前言 本文将针对客户无法使用内置Bootloader的DFU方式进行固件升级的问题进行分析。 2 问题描述 客户使用的是STM32F205VET6,做了个最小系统测试板,在BOOT0=1,BOOT1=0的情况下连接PC,使用PC端软件DfuSeDemo无法检测到DFU设备,但是同样在Bootloader模式下,却可以通过串口1进行固件升级。 3 问题分析 首先怀疑的是USB线路问题,因此,在却换到正常模式(BOOT0=0,BOOT1=0)时,使用CubeMx做了个简单的鼠标HID测试程序验证,结果发现在正常模式下测试程序是能正常运行的,从这点可以说明USB不存在线路不通的问题。 其次,检查各个管脚的电平,VDD,BOOT0
[单片机]
无法使用内置<font color='red'>Bootloader</font>的DFU方式进行固件升级
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved