STM32 UDS Bootloader开发-下位机篇-App软件

这篇具有很好参考价值的文章主要介绍了STM32 UDS Bootloader开发-下位机篇-App软件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在之前的文章中,介绍了STM32 UDS Bootloader开发需求和bootloader软件开发的修改点。本文继续介绍APP软件关于UDS的部分。APP主要实现预编程阶段的部分内容。

链接文件


LR_IROM1 0x0800E000 0x00032000  {    ; load region size_region
  ER_IROM1 0x0800E000 0x00032000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  RW_IRAM1 0x20000000 0x0000BFF0  {  ; RW data
   .ANY (+RW +ZI)
  }
  RW_IRAM2 0x2000BFF0 UNINIT 0x00000010  {
   .ANY (+RW +ZI)
  }
}

LR_IROM2 0x0800D800 0x0000800  {    ; load region size_region
  ER_IROM2 0x0800D800 0x0000800  {  ; load address = execution address
   *(.APP_INFO)    
   .ANY (+RO)
   .ANY (+XO)
  }
  
}

此处按需求定义APP_INFO的flash区域为起始地址0x0800D800,大小0x800。

RW_IRAM2区域定义UNINIT,保证在APP跳boot复位后,对应ram区域的内容不被初始化

APP软件

检查预编程条件

static void RoutineControl(struct UDSServiceInfo *i_pstUDSServiceInfo, tUdsAppMsgInfo *m_pstPDUMsg)
{
    uint8 Ret = FALSE;
    uint32 ReceivedCrc = 0u;
    ASSERT(NULL_PTR == m_pstPDUMsg);
    ASSERT(NULL_PTR == i_pstUDSServiceInfo);
    RestartS3Server();

    if(TRUE == IsCheckPreProgrammingCondition(m_pstPDUMsg))
    {
        m_pstPDUMsg->aDataBuf[0u] = i_pstUDSServiceInfo->SerNum + 0x40u;
        m_pstPDUMsg->xDataLen = 4u;
    }
    #ifdef UDS_PROJECT_FOR_BOOTLOADER
    /* Is erase memory routine control? */
    else if (TRUE == IsEraseMemoryRoutineControl(m_pstPDUMsg))
    {
        /* Request client timeout time */
        SetNegativeErroCode(i_pstUDSServiceInfo->SerNum, NRC_SERVICE_BUSY, m_pstPDUMsg);
        m_pstPDUMsg->pfUDSTxMsgServiceCallBack = &DoEraseFlash;
    }
    /* Is check sum routine control? */
    else if (TRUE == IsCheckSumRoutineControl(m_pstPDUMsg))
    {
        ReceivedCrc = m_pstPDUMsg->aDataBuf[4u];
        ReceivedCrc = (ReceivedCrc << 8u) | m_pstPDUMsg->aDataBuf[5u];
        /* TODO Bootloader: #04 SID_31 Uncomment this 2 lines when CRC32 used */
        #ifdef EN_CRC32_SOFTWARE
        ReceivedCrc = (ReceivedCrc << 8u) | m_pstPDUMsg->aDataBuf[6u];
        ReceivedCrc = (ReceivedCrc << 8u) | m_pstPDUMsg->aDataBuf[7u];
        #endif
        Flash_SavedReceivedCheckSumCrc(ReceivedCrc);
        /* Request client timeout time */
        SetNegativeErroCode(i_pstUDSServiceInfo->SerNum, NRC_SERVICE_BUSY, m_pstPDUMsg);
        m_pstPDUMsg->pfUDSTxMsgServiceCallBack = &DoCheckSum;
    }
    /* Is check programming dependency? */
    else if (TRUE == IsCheckProgrammingDependency(m_pstPDUMsg))
    {
        /* Write application information in flash. */
        (void)Flash_WriteFlashAppInfo();
        /* Do check programming dependency */
        Ret = DoCheckProgrammingDependency();

        if (TRUE == Ret)
        {
            m_pstPDUMsg->aDataBuf[0u] = i_pstUDSServiceInfo->SerNum + 0x40u;
            m_pstPDUMsg->xDataLen = 4u;
        }
        else
        {
            /* Don't have this routine control ID */
            SetNegativeErroCode(i_pstUDSServiceInfo->SerNum, NRC_SUBFUNCTION_NOT_SUPPORTED, m_pstPDUMsg);
        }
    }
    #endif
    else
    {
        /* Don't have this routine control ID */
        SetNegativeErroCode(i_pstUDSServiceInfo->SerNum, NRC_SUBFUNCTION_NOT_SUPPORTED, m_pstPDUMsg);
    }
}

此处正常检查预编程条件应该判断车速,蓄电池电压这些,这里直接返回的true.

停止DTC设置

static void ControlDTCSetting(struct UDSServiceInfo *i_pstUDSServiceInfo, tUdsAppMsgInfo *m_pstPDUMsg)
{
    uint8 RequestSubfunction = 0u;
    ASSERT(NULL_PTR == m_pstPDUMsg);
    ASSERT(NULL_PTR == i_pstUDSServiceInfo);
    RequestSubfunction = m_pstPDUMsg->aDataBuf[1u];

    switch (RequestSubfunction)
    {
        case 0x01u :
        case 0x02u :
            m_pstPDUMsg->aDataBuf[0u] = i_pstUDSServiceInfo->SerNum + 0x40u;
            m_pstPDUMsg->aDataBuf[1u] = RequestSubfunction;
            m_pstPDUMsg->xDataLen = 2u;
            break;

        case 0x81u :
        case 0x82u :
            m_pstPDUMsg->xDataLen = 0u;
            break;

        default :
            SetNegativeErroCode(i_pstUDSServiceInfo->SerNum, NRC_SUBFUNCTION_NOT_SUPPORTED, m_pstPDUMsg);
            break;
    }
}

此处正常应该调用停止DTC诊断的API函数,本APP没有做诊断,所以没有,直接返回的true

禁止无关通讯

static void CommunicationControl(struct UDSServiceInfo *i_pstUDSServiceInfo, tUdsAppMsgInfo *m_pstPDUMsg)
{
    uint8 RequestSubfunction = 0u;
    ASSERT(NULL_PTR == m_pstPDUMsg);
    ASSERT(NULL_PTR == i_pstUDSServiceInfo);
    RequestSubfunction = m_pstPDUMsg->aDataBuf[1u];

    switch (RequestSubfunction)
    {
        case 0x0u :
        case 0x03u :
            m_pstPDUMsg->aDataBuf[0u] = i_pstUDSServiceInfo->SerNum + 0x40u;
            m_pstPDUMsg->aDataBuf[1u] = RequestSubfunction;
            m_pstPDUMsg->xDataLen = 2u;
            break;

        case 0x80u :
        case 0x83u :
            /* Don't transmit UDS message. */
            m_pstPDUMsg->aDataBuf[0u] = 0u;
            m_pstPDUMsg->xDataLen = 0u;
            break;

        default :
            SetNegativeErroCode(i_pstUDSServiceInfo->SerNum, NRC_SUBFUNCTION_NOT_SUPPORTED, m_pstPDUMsg);
            break;
    }
}

此处应该停止发送应用报文和网络管理报文,本APP没有其他报文发送,此处直接返回true

定义APP_INFO

__attribute__((used)) __attribute__((section (".APP_INFO"))) const tAppFlashStatus gs_stAppFlashStatusInfo = 
{
	.appStartAddr = APP_A_START_ADDR,
    .isFlashErasedSuccessfull =  0x00,
    .isFlashProgramSuccessfull = 0x00,
    .isFlashStructValid = 0x00,
};

定义该flash区域为APP_INFO,配置appStartAddr为0x0800E000.

调试输出

为了确认BOOT和APP跳转是否成功,设置了Bootloader软件中LED1闪烁,APP软件中LED0闪烁

boolean TIMER_HAL_Is100msTickTimeout(void)
{
    boolean result = FALSE;

    if (gs_100msCnt >= 1000u)
    {
        result = TRUE;
        gs_100msCnt -= 1000u;
        #ifdef UDS_PROJECT_FOR_APP
        LED0=!LED0;
        #endif
    }
    timerTickCnt++;

    return result;
}

hex处理

此处编译出来hex有两块

STM32 UDS Bootloader开发-下位机篇-App软件
使用hexview+bat脚本填充间隔

..\..\..\HexTools\hexview.exe /G /s .\STM32_UDS_APP.hex  /S /FA: /AF:0xFF /XI:32  -o STM32_UDS_APP_Fill.hex /e:errorfile 

创建单个区域文件(/FA)

此选项可用于创建单个块文件。在这种情况下,HexView将使用第一个块的起始地址和最后一个块的结束地址,并使用/AFxx参数给定的填充字符填充其间的所有剩余byte。

/AF:0xFF表示填充使用0xFF

/XI:32指定输出行的字节数为32

总结

到此,APP软件开发就完成了。后面有时间会介绍上位机的开发

丐版刷写界面如下:

STM32 UDS Bootloader开发-下位机篇-App软件文章来源地址https://www.toymoban.com/news/detail-513468.html

到了这里,关于STM32 UDS Bootloader开发-下位机篇-App软件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 APP跳转到Bootloader

    stm32 app跳转到bootloade 【STM32】串口IAP功能的实现,BootLoader与App相互跳转 STM32 从APP跳入BootLoader问题

    2024年02月08日
    浏览(41)
  • S32Kxxx bootloader 之 LIN UDS bootloader

    了解更多关于bootloader 的C语言实现,请加我Q扣: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序)。 LIN 总线是汽车ECU使用比较多的一种总线, 车灯, 车门, 汽车空调控制面板等等ECU都有在使用. 而这些ECU离线升级时, 就需要使用到LIN bootloader, OEM厂商都

    2024年02月08日
    浏览(43)
  • stm32利用bootloader与app实现远程升级

    1、flash空间分配: 事先在flash开辟好空间,假设flash为128k,我这边给它分为五个区,分别为bootloader、标志位、application、application backup、标签ID。 (注:升级之前,app的代码烧录于application的flash存储区域内。用于app升级的 bin文件 大小一定要小于自己开辟的flash空间大小)

    2024年02月13日
    浏览(50)
  • STM32 BOOTLOADER配置以及APP跳转实现(裸机)

    Bootloader:  Bootloader是硬件启动的引导程序,是运行操作系统的前提。在操作系统内核或用户应用程序运行之前运行的一段小代码。对硬件进行相应的初始化和设定,最终为操作系统准备好环境。 APP: APP就是我们的应用程序,经过硬件引导程序之后跳转到系统程序运行 拓展:

    2024年02月06日
    浏览(38)
  • 【STM32】IAP升级01 bootloader实现以及APP配置(主要)

    通过之前的了解 之前的了解,我们知道实现IAP升级需要两个条件: 1.APP程序必须在 IAP 程序之后的某个偏移量为 x 的地址开始; 2.APP程序的中断向量表相应的移动,移动的偏移量为 x; 默认条件下的起始地址 默认的条件下,图中 IROM1 的起始地址(Start)一般为 0x08000000,大小

    2024年02月03日
    浏览(46)
  • STM32 Bootloader开发记录

    编写一个基础的Bootloader,记录一下开发过程及遇到的问题。 1、基本思路 作为一个Bootloader,它首先需要具备跳转功能,能够跳转到我们的APP地址空间中运行APP。 其次,它还需要有能够读写FLASH的能力。除了启动APP,另外还有对APP进行升级的操作,这个功能需要用到读写FLAS

    2024年02月08日
    浏览(42)
  • 基于STM32单片机BOOTLOADER通过串口升级程序IAP——APP方案

                            此方法前提是你得有一个EEPROM         我用的单片机是STM32F103ZET6 , 此单片机FLASH容量为512KB; 在此单片机里面FLASH的起始地址是0X8000000,BOOT作为引导加载程序一般都是从这个地址开始,单片机一上点默认会从这个地址开始运行,所以将自己

    2024年02月04日
    浏览(63)
  • STM32 IAP应用开发——自制BootLoader

    什么是IAP? IAP(In-Application Programming) 指MCU可以在系统中获取新代码并对自己重新编程,即可用程序来改变程序。在应用编程(IAP)是用户的应用代码对片内Flash存储器进行擦除/编程的方法。这种方式的典型应用就是用一小段代码来实现程序的下载,实际上单片机的ISP功能就

    2024年02月13日
    浏览(38)
  • STM32 IAP应用开发--bootloader升级程序

    原文链接:https://blog.csdn.net/ShenZhen_zixian/article/details/129424077 什么是IAP? IAP(In-Application Programming) 指MCU可以在系统中获取新代码并对自己重新编程,即可用程序来改变程序。在应用编程(IAP)是用户的应用代码对片内Flash存储器进行擦除/编程的方法。这种方式的典型应用就

    2024年01月17日
    浏览(81)
  • STM32 usart bootloader 源代码 STM32 usart bootloader 源代码 STM32 usart bootloader 原代源码

    STM32 usart bootloader 源代码   STM32 usart bootloader 源代码  STM32 usart bootloader 原代源码,上位机C#,下位机c。 简单修改可以支持stm32全系列芯片。 支持串口升级 该版本为优化过的版本, 1.支持代码段保护; 2.支持烧写失败重置; 3.兼容我公司生产的配套wifi模块和w5500模块远程更新

    2024年01月23日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包