环境说明:
电脑系统: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升级模式,否则执行用户程序)
/** @addtogroup STM32373C_EVAL_LOW_LEVEL_COM
* @{
*/
#define COMn 1
/**
* @brief Definition for COM port1, connected to USART1
*/
#define EVAL_COM1 USART1
#define EVAL_COM1_CLK RCC_APB2Periph_USART1
#define EVAL_COM1_TX_PIN GPIO_Pin_6
#define EVAL_COM1_TX_GPIO_PORT GPIOB
#define EVAL_COM1_TX_GPIO_CLK RCC_AHBPeriph_GPIOB
#define EVAL_COM1_TX_SOURCE GPIO_PinSource6
#define EVAL_COM1_TX_AF GPIO_AF_7
#define EVAL_COM1_RX_PIN GPIO_Pin_7
#define EVAL_COM1_RX_GPIO_PORT GPIOB
#define EVAL_COM1_RX_GPIO_CLK RCC_AHBPeriph_GPIOB
#define EVAL_COM1_RX_SOURCE GPIO_PinSource7
#define EVAL_COM1_RX_AF GPIO_AF_7
#define EVAL_COM1_CTS_PIN GPIO_Pin_3
#define EVAL_COM1_CTS_GPIO_PORT GPIOD
#define EVAL_COM1_CTS_GPIO_CLK RCC_AHBPeriph_GPIOD
#define EVAL_COM1_CTS_SOURCE GPIO_PinSource3
#define EVAL_COM1_CTS_AF GPIO_AF_7
#define EVAL_COM1_RTS_PIN GPIO_Pin_4
#define EVAL_COM1_RTS_GPIO_PORT GPIOD
#define EVAL_COM1_RTS_GPIO_CLK RCC_AHBPeriph_GPIOD
#define EVAL_COM1_RTS_SOURCE GPIO_PinSource4
#define EVAL_COM1_RTS_AF GPIO_AF_7
#define EVAL_COM1_DRE_PIN GPIO_Pin_8
#define EVAL_COM1_DRE_GPIO_PORT GPIOB
#define EVAL_COM1_DRE_GPIO_CLK RCC_AHBPeriph_GPIOB
#define EVAL_COM1_DRE_SOURCE GPIO_PinSource8
#define EVAL_COM1_DRE_AF GPIO_AF_8
#define EVAL_COM1_IRQn USART1_IRQn
再根据自己的板子,修改对应的串口,我这里使用的是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
/**
* @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。
二、设置用户应用软件
使用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###*/
打开内部的*.icf文件,修改
define symbol __ICFEDIT_intvec_start__ = 0x08002000;
define symbol __ICFEDIT_region_ROM_start__ = 0x08002000;
define symbol __ICFEDIT_region_ROM_end__ = 0x0800F7FF;
设置Output Converter,输出二进制文件
三、使用SecureCRT下载用户应用软件
设置波特率等参数,
设置包字节为128,我使用FT232作为USB转RS485的适配器,FT232的内部缓存为128字节,因此我选择Ymodem包的大小为128,不过1024我没测试
串口打开后,按1进入升级模式,
选择要升级的文件,Add即可!