请选择 进入手机版 | 继续访问电脑版
查看: 7777|回复: 8

[分享] 【经验分享】AN2295 bootloader文档解析(二)

[复制链接]

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2014-7-21 09:34:47 | 显示全部楼层 |阅读模式
[size=34.54545211791992px]AN2295 bootloader[size=34.54545211791992px]文档解析

AN2295提供了基于8-bit MCU、Coldfire、[url=https://www.freescale.co
m/zh-Hans/webapp/sps/site/homepage.jsp?code=KINETIS]Kinetis[/url]版本的boot loader代码,开发者可根据自己所选MCU的型号,选择对应的版本。由于在同一版本的boot loader代码中,为了适用于同一类型但不同系列的MCU,所以就定义了很多变量以作不同系列MCU的选择之用,但这样会导致boot loader代码的复杂程度递增,从而增加分析的难度。

 
    所以出于上述的原因,特地选择[url=https://www.freescale.co
m/zh-Hans/webapp/sps/site/prod_summary.jsp?code=FRDM-KE02Z]FRDM-KE02[/url]
boot loader例程,其可为作为AN2295 boot loader代码的“简装版”,来介绍boot loader例程的工作原理及流程。

 

Ø  主程序代码说明
            int main(void)                                                                    
            {                                                                                 
                        uint32_t uiNullCounter = 0;                                                     
                        uint32_t uiRepeatCount = 0;                                                     
                        FC_Init();   
                for(;;) {                                                                         
                                                                         
                                    if( !FC_Communication() )                                                     
                                    {                                                                              
                                                if( g_ucFC_State == FC_STATE_NULL )                                         
                                                {                                                                           
                                                            uiNullCounter ++;                                                          
                                                            if( uiNullCounter > 0xffff )                                              
                                                            {                                                                         
                                                                        uiNullCounter = 0;                                                       
                                                                        uiRepeatCount ++;                                                       
                                                                        UART_putchar(TERM_PORT,0xfc);                                                    
                                                            }                                                                                                                                                                          
                                                            if( uiRepeatCount > CONNECT_OVER_TIME )                                   
                                                            {                                                                          
                                #ifdef FLASH_LOCATION                                         
                                                                        SCB_VTOR = RELOCATION_VERTOR_ADDR;                                      
                                                                        JumpToUserApplication(RELOCATION_VERTOR_ADDR);                          
                                #endif                                                        
                                                            }                                                                         
                                                }                                                                            
                                    }                                                                             
                                                                                              
                        }                                                                                                                                                  
                    return 0;                                                                 
            }               
 Ø  FC_Init函数
 
            void FC_Init( void )
            {
                        Flash_Init();                               //初始化Flash时钟
                        m_pRecFrame = (uint8_t *)&m_RecFrame;
                        g_ucFC_State = FC_STATE_NULL;
                        m_uiRecCount = 0;                       //初始化各变量值
            }
Ø  FC_ Communication函数
 
[table=400]            [tr]            [td]            unsigned char FC_Communication( void )
            {
                        uint8_t uiReadData,i;
                        uint8_t *pAddress;
                        ADDRESS_TYPE * pTempAddress;
                                                       // 判断UART有无收到数据
                        if(UART_S1_RDRF_MASK != UART_getchar_present(TERM_PORT))
                        {
                                    return 0;
                        }
                                                               // 读取UART收到的数据
                        uiReadData = UART_getchar(TERM_PORT);
                        switch( g_ucFC_State )
                        {
                                    case FC_STATE_NULL:
                                    {
                                                if( uiReadData == FC_CMD_ACK )         // FC_CMD_ADK即为0xFC
                                                {
                      //由于KE02波特率设置精准,所以例程中无MCU与PC波特率同步校准函数
                                                            UART_putchar( TERM_PORT,0xfc );
            g_ucFC_State = FC_STATE_WORKING;  // 进入接受命令操作状态
                                                }
                                                else
                                                {
                                                            return 0;
                                                }
                                    }
                                    break;
                                    case FC_STATE_WORKING:
                                                {
                                                            switch( uiReadData )
                                                            {
                             // Ident指令(0x49),发送boot loader的相关属性信息
                                                            case FC_CMD_IDENT:    
                                                                        {
                                                                                    UART_putchar( TERM_PORT,m_MCU_Info.Version);
                                                                                    UART_putchar( TERM_PORT,m_MCU_Info.Sdid>>8);
                                                                                    UART_putchar( TERM_PORT,m_MCU_Info.Sdid);
                                                                        pTempAddress=(ADDRESS_TYPE *)&m_MCU_Info.BlocksCnt;
            <span style="mso-bidi-font-size:10.5pt;font-family:"微软雅黑","sans-serif"">                                                                        for(i=0;i= sizeof(uint32_t) )
                                                            {
                                                                        //地址字节校正
                                                                        LONG_Convert(&m_RecFrame.uiAddress);
                                //判断Erase flash操作是否成功
                                                                        if(!Flash_EraseSector(m_RecFrame.uiAddress))
                                                                        {
                                                                                    UART_putchar( TERM_PORT,FC_CMD_ACK );
                                                                        }
                                                                        else
                                                                        {
                                                                                    UART_putchar( TERM_PORT,FC_CMD_NACK );
                                                                        }
                                                                        g_ucFC_State = FC_STATE_WORKING;
                                                            }
                                    }
                                    break;
                    // 接受Write Flash操作的起始地址
                                    case FC_STATE_WRITE_ADDRESS:
                                                {
                                                            m_pRecFrame[m_uiRecCount++] = uiReadData;
                                                            if( m_uiRecCount >= sizeof(uint32_t) )
                                                            {
                                                                        g_ucFC_State = FC_STATE_WRITE_LEN;
                                                            }
                                                           
                                    }
                                    break;
            // 接受Write Flash操作的字节个数
                                    case FC_STATE_WRITE_LEN:
                                                {
                                                            m_pRecFrame[m_uiRecCount++] = uiReadData;
                                            g_ucFC_State = FC_STATE_WRITE_DATA;
                                    }
                                    break;
            // 接受Write Flash操作的数据
                                    case FC_STATE_WRITE_DATA:
                                                {
                                                            m_pRecFrame[m_uiRecCount++] = uiReadData;
                                                            if( m_uiRecCount > (m_RecFrame.Length + sizeof(uint32_t) ))
                                                            {
                                                                        LONG_Convert(&m_RecFrame.uiAddress);
            Memcpy_Byte((uint8_t*)&m_ucDataBuff[0],(uint8_t*)&m_RecFrame.DataBuff[0],
            m_RecFrame.Length);
                                                uiNumberCount ++;
                                if( !Flash_Program(m_RecFrame.uiAddress,
                                                               (uint8_t *)&m_ucDataBuff[0],m_RecFrame.Length) )
                                                                        {
                                                                                    UART_putchar( TERM_PORT,FC_CMD_ACK );
                                                                        }
                                                                        else
                                                                        {
                                                                                    UART_putchar( TERM_PORT,FC_CMD_NACK );
                                                                        }
                             
                                                                        g_ucFC_State = FC_STATE_WORKING;
                                                            }
                                                }          
                                                break;
            //Read Flash操作
                                    case FC_STATE_READ:
                                                {
                                                            m_pRecFrame[m_uiRecCount++] = uiReadData;
                                                            if( m_uiRecCount > sizeof(uint32_t) )
                                                            {
                                                                        LONG_Convert(&m_RecFrame.uiAddress);
                                                                        pAddress = (uint8_t *)m_RecFrame.uiAddress;
            
<span style="mso-bidi-font-size:10.5pt;font-family:"微软雅黑","sans-serif"">                                                            for( i=0;i
11.jpg

AN2295—Developer’s Serial Bootloader 解析(二).pdf

457.14 KB, 下载次数: 501, 下载积分: 威望 1

回复

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
 楼主| 发表于 2014-7-21 09:44:28 | 显示全部楼层

RE:【经验分享】AN2295 bootloader文档解析(二)

不足之处,欢迎指正,未完待续!!
回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

273

帖子

0

高级会员

Rank: 4

积分
718
最后登录
1970-1-1
发表于 2014-7-21 13:30:59 | 显示全部楼层

RE:【经验分享】AN2295 bootloader文档解析(二)

又有更新啊,非常好,谢谢斑竹分享!
回复 支持 反对

使用道具 举报

该用户从未签到

131

主题

835

帖子

0

金牌会员

Rank: 6Rank: 6

积分
10021
最后登录
1970-1-1
发表于 2014-7-21 13:35:59 | 显示全部楼层

RE:【经验分享】AN2295 bootloader文档解析(二)

非常精髓的简装版!感谢楼主!
回复 支持 反对

使用道具 举报

该用户从未签到

63

主题

263

帖子

0

高级会员

Rank: 4

积分
921
最后登录
2021-2-23
发表于 2014-7-21 14:11:45 | 显示全部楼层

回复:【经验分享】AN2295 bootloader文档解析(二)

非常精髓的简装版!感谢楼主!
回复 支持 反对

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
 楼主| 发表于 2014-7-21 16:41:32 | 显示全部楼层

回复:【经验分享】AN2295 bootloader文档解析(二)

回复第 5 楼 于2014-07-21 14:11:45发表:
非常精髓的简装版!感谢楼主!
 
谢谢支持,如有疑问欢迎来论坛中讨论!
 
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2017-5-9 08:12
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    34

    主题

    801

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2264
    最后登录
    2021-8-11
    发表于 2014-7-31 09:53:34 | 显示全部楼层

    RE:【经验分享】AN2295 bootloader文档解析(二)

    解析很完善,入门没问题
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    124

    主题

    3600

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5781
    最后登录
    1970-1-1
     楼主| 发表于 2014-7-31 11:55:05 | 显示全部楼层

    回复:【经验分享】AN2295 bootloader文档解析(二)

    回复第 7 楼 于2014-07-31 09:53:34发表:
    解析很完善,入门没问题
     
    谢谢支持,如有什么问题请在后面跟帖!
     
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    6

    主题

    24

    帖子

    0

    注册会员

    Rank: 2

    积分
    84
    最后登录
    2016-8-23
    发表于 2016-7-19 13:32:36 | 显示全部楼层
    专门登录,只为说一声谢谢楼主
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-18 13:28 , Processed in 0.182171 second(s), 27 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表