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日
    浏览(11)
  • S32Kxxx bootloader 之 LIN UDS bootloader

    S32Kxxx bootloader 之 LIN UDS bootloader

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

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

    stm32利用bootloader与app实现远程升级

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

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

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

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

    【STM32】IAP升级01 bootloader实现以及APP配置(主要)

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

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

    STM32 Bootloader开发记录

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

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

    基于STM32单片机BOOTLOADER通过串口升级程序IAP——APP方案

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

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

    STM32 IAP应用开发——自制BootLoader

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

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

    STM32 IAP应用开发--bootloader升级程序

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

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

    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日
    浏览(11)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包