[其他ST产品] 基于Ymodem协议通过RS-485对STM32F3的IAP升级

[复制链接]
 楼主| wailian1265k 发表于 2023-5-31 11:10 | 显示全部楼层 |阅读模式
环境说明:

电脑系统:win7 64bit

ST官方软件库:STSW-STM32111

链接地址:http://www.st.com/en/embedded-software/stsw-stm32111.html

软件IDE开发平台:IAR for arm V7.20

上位机通信软件:SecureCRT


实现方法:

一、修改官方软件

选定我所使用的处理器型号


修改处理器资源和硬件端口配置

/**
* @brief Key push-button         //PB9
*/
#define KEY_BUTTON_PIN                         GPIO_Pin_9
#define KEY_BUTTON_GPIO_PORT             GPIOB
#define KEY_BUTTON_GPIO_CLK                RCC_AHBPeriph_GPIOB
#define KEY_BUTTON_EXTI_LINE                EXTI_Line9
#define KEY_BUTTON_EXTI_PORT_SOURCE      EXTI_PortSourceGPIOB
#define KEY_BUTTON_EXTI_PIN_SOURCE         EXTI_PinSource9

#define KEY_BUTTON_EXTI_IRQn                      EXTI9_5_IRQn

修改IAP功能触发按键端口(上电时,MCU检测到KEY_BUTTON一直为低电平,则进入IAP升级模式,否则执行用户程序)


 楼主| wailian1265k 发表于 2023-5-31 11:12 | 显示全部楼层
  1. /** @addtogroup STM32373C_EVAL_LOW_LEVEL_COM
  2.   * @{
  3.   */
  4. #define COMn                             1

  5. /**
  6. * @brief Definition for COM port1, connected to USART1
  7. */
  8. #define EVAL_COM1                        USART1
  9. #define EVAL_COM1_CLK                    RCC_APB2Periph_USART1

  10. #define EVAL_COM1_TX_PIN                 GPIO_Pin_6
  11. #define EVAL_COM1_TX_GPIO_PORT           GPIOB
  12. #define EVAL_COM1_TX_GPIO_CLK            RCC_AHBPeriph_GPIOB
  13. #define EVAL_COM1_TX_SOURCE              GPIO_PinSource6
  14. #define EVAL_COM1_TX_AF                  GPIO_AF_7

  15. #define EVAL_COM1_RX_PIN                 GPIO_Pin_7
  16. #define EVAL_COM1_RX_GPIO_PORT           GPIOB
  17. #define EVAL_COM1_RX_GPIO_CLK            RCC_AHBPeriph_GPIOB
  18. #define EVAL_COM1_RX_SOURCE              GPIO_PinSource7
  19. #define EVAL_COM1_RX_AF                  GPIO_AF_7

  20. #define EVAL_COM1_CTS_PIN                GPIO_Pin_3
  21. #define EVAL_COM1_CTS_GPIO_PORT          GPIOD
  22. #define EVAL_COM1_CTS_GPIO_CLK           RCC_AHBPeriph_GPIOD
  23. #define EVAL_COM1_CTS_SOURCE             GPIO_PinSource3
  24. #define EVAL_COM1_CTS_AF                 GPIO_AF_7

  25. #define EVAL_COM1_RTS_PIN                GPIO_Pin_4
  26. #define EVAL_COM1_RTS_GPIO_PORT          GPIOD
  27. #define EVAL_COM1_RTS_GPIO_CLK           RCC_AHBPeriph_GPIOD
  28. #define EVAL_COM1_RTS_SOURCE             GPIO_PinSource4
  29. #define EVAL_COM1_RTS_AF                 GPIO_AF_7

  30. #define EVAL_COM1_DRE_PIN                GPIO_Pin_8
  31. #define EVAL_COM1_DRE_GPIO_PORT          GPIOB
  32. #define EVAL_COM1_DRE_GPIO_CLK           RCC_AHBPeriph_GPIOB
  33. #define EVAL_COM1_DRE_SOURCE             GPIO_PinSource8
  34. #define EVAL_COM1_DRE_AF                 GPIO_AF_8

  35.    
  36. #define EVAL_COM1_IRQn                   USART1_IRQn
 楼主| wailian1265k 发表于 2023-5-31 11:12 | 显示全部楼层
再根据自己的板子,修改对应的串口,我这里使用的是USART1,注意其他包括时钟和RX TX端口也要一起修改


/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
  #define USER_FLASH_LAST_PAGE_ADDRESS  0x0800F000
  #define USER_FLASH_END_ADDRESS        0x0800F7FF /* 64 KBytes */
  #define FLASH_PAGE_SIZE               0x800      /* 2 Kbytes */

/* define the address from where user application will be loaded,
   the application address should be a start sector address */
#define APPLICATION_ADDRESS     (uint32_t)0x08002000

修改存储器的宏定义,我使用的是STM32F3C8,Flash大小为64K,其地址范围是0x08000000~0x0800FFFF

每个扇区为2K,对应十六进制为0x800,我将其最后一个扇区留作存储用户数据,这样BootLoader程序和用户应用程序都可以读写这个扇区,而将0x08000000~0x08001FFF用作BootLoader程序的存储空间,将0x08002000~0x0800F7FF用作BootLoader程序的存储空间,将0x0800F7FF~0x0800FFFF用作BootLoader程序的存储空间(最后一个扇区)作为用户数据存储空间,因此可知,BootLoader程序编译后生成二进制文件不可以超过8K,用户应用程序二进制代码量不可以超过54K
 楼主| wailian1265k 发表于 2023-5-31 11:12 | 显示全部楼层
/**
  * @brief  Print a character on the HyperTerminal
  * @param  c: The character to be printed
  * @retval None
  */
void SerialPutChar(uint8_t c)
{
  GPIO_WriteBit(EVAL_COM1_DRE_GPIO_PORT,EVAL_COM1_DRE_PIN,Bit_SET);
  USART_SendData(EVAL_COM1, c);
  while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET) {}

   GPIO_WriteBit(EVAL_COM1_DRE_GPIO_PORT,EVAL_COM1_DRE_PIN,Bit_RESET);

}

修改SerialPutChar函数,在函数的开头添加GPIO_WriteBit(EVAL_COM1_DRE_GPIO_PORT,EVAL_COM1_DRE_PIN,Bit_SET)

设备RS-485  驱动芯片为发送模式(笔者的RS-485芯片为SN75176,硬件上睑其Pin2和Pin3的收发控制脚连接在一起)

在函数的最后添加GPIO_WriteBit(EVAL_COM1_DRE_GPIO_PORT,EVAL_COM1_DRE_PIN,Bit_RESET),设置为接收模式,

注意while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET) {},这里要是USART_FLAG_TC,表示一直等到发送完成后,不可以是USART_FLAG_TXE(代表发送缓存空),后者会带来有些数据无法发送的问题

对了不要忘记在初始化中添加EVAL_COM1_DRE_PIN的初始化代码,设置为输出模式,Pull-push,初始设置输出低电平。

其他的不用改,将代码下载到MCU里,截止目前STM32F3的Bootloader功课已经OK。
 楼主| wailian1265k 发表于 2023-5-31 11:13 | 显示全部楼层
二、设置用户应用软件
85976476bb50c89e5.png
使用IAR 打开预先编写好的用户应用软件,设置其工程,找到Linker标签

/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x08002000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x08002000;
define symbol __ICFEDIT_region_ROM_end__   = 0x0800F7FF;
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__   = 0x20003FFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x400;
define symbol __ICFEDIT_size_heap__   = 0x200;

/**** End of ICF editor section. ###ICF###*/
 楼主| wailian1265k 发表于 2023-5-31 11:13 | 显示全部楼层
打开内部的*.icf文件,修改

define symbol __ICFEDIT_intvec_start__ = 0x08002000;

define symbol __ICFEDIT_region_ROM_start__ = 0x08002000;

define symbol __ICFEDIT_region_ROM_end__   = 0x0800F7FF;

308616476bb6c8a1a6.png

设置Output Converter,输出二进制文件
 楼主| wailian1265k 发表于 2023-5-31 11:14 | 显示全部楼层
三、使用SecureCRT下载用户应用软件
978276476bb7f22642.png
 楼主| wailian1265k 发表于 2023-5-31 11:14 | 显示全部楼层
设置波特率等参数,
435146476bb8a80836.png
设置包字节为128,我使用FT232作为USB转RS485的适配器,FT232的内部缓存为128字节,因此我选择Ymodem包的大小为128,不过1024我没测试
 楼主| wailian1265k 发表于 2023-5-31 11:20 | 显示全部楼层
串口打开后,按1进入升级模式,

977146476bd116119c.png

选择要升级的文件,Add即可!
modesty3jonah 发表于 2023-6-7 13:05 | 显示全部楼层
stm32 iap升级,从IAP跳转APP后APP程序中
pentruman 发表于 2023-6-8 15:43 | 显示全部楼层
Ymodem是一种常见的串行通信协议,可用于实现STM32单片机的IAP 升级功能。
adolphcocker 发表于 2023-6-13 23:15 | 显示全部楼层
可以参考Ymodem协议规范并使用开源代码库进行开发。
sdlls 发表于 2023-6-14 15:02 | 显示全部楼层
编写Ymodem协议的数据帧格式解析函数,实现文件传输、校验和确认等功能。
adolphcocker 发表于 2023-6-14 16:32 | 显示全部楼层
怎么用usb进行iap更新              
jtracy3 发表于 2023-6-19 14:31 | 显示全部楼层
在使用Ymodem协议进行IAP升级时,需要考虑到传输效率、数据完整性和安全性等方面因素,并进行充分的测试和验证
alvpeg 发表于 2023-6-19 14:53 | 显示全部楼层
stm32的iap升级一定要用ymodem协议吗
belindagraham 发表于 2023-6-21 14:03 | 显示全部楼层
当接收到Ymodem数据包时,需要使用协议解析函数对数据包进行解析和处理,包括获取数据内容、计算校验和、发送确认等过程。
lihuami 发表于 2023-6-21 14:25 | 显示全部楼层
在应用程序中调用IAP升级函数,启动IAP升级过程。在升级前需要先检查升级文件的合法性和完整性,并进行备份和恢复操作。
louliana 发表于 2023-6-21 15:01 | 显示全部楼层
STM32芯片怎么通过无线更新程序?
sfd123 发表于 2023-6-22 08:39 | 显示全部楼层
alvpeg 发表于 2023-6-19 14:53
stm32的iap升级一定要用ymodem协议吗

当然不是!你可以使用自己定义的协议啊!只不过使用Ymodem 就不用自己搞上位机了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

413

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部