参考:https://blog.csdn.net/weixin_42418557/article/details/122321427
大部分参考了这个帖子,
但中途发现几个问题记录一下
问题1:
官方工程里的代码
HAL_StatusTypeDef Serial_PutByte( uint8_t param )
{
/* May be timeouted... */
if ( UartHandle.State == HAL_UART_STATE_TIMEOUT )
{
UartHandle.State = HAL_UART_STATE_READY;
}
return HAL_UART_Transmit(&UartHandle, ¶m, 1, TX_TIMEOUT);
}
调试中发现UartHandle.State报错,原因是新版STM32Cube生成的一个stm32f1xx_hal_uart.h中.State已经变更为.gState
修改后的代码
HAL_StatusTypeDef Serial_PutByte( uint8_t param )
{
/* May be timeouted... */
if ( UartHandle.gState == HAL_UART_STATE_TIMEOUT )
{
UartHandle.gState = HAL_UART_STATE_READY;
}
return HAL_UART_Transmit(&UartHandle, ¶m, 1, TX_TIMEOUT);
}
这样编译就不会出错
问题2
配置好APP后,Xshell发送Bin文件结束后APP无法正常运行
官方工程跳转APP代码片段
/* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
{
/* Jump to user application */
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
JumpToApplication = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
JumpToApplication();
在JumpToApplication();前加入关闭中断等函数
/* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
{
/* Jump to user application */
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
JumpToApplication = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
SysTick->CTRL = 0X00;//禁止SysTick
SysTick->LOAD = 0;
SysTick->VAL = 0;
__disable_irq();
JumpToApplication();
同理在Main_Menu();菜单里面的3也需要加入这四行代码
case '3' :
Serial_PutString("Start program execution......\r\n\n");
/* execute the new program */
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
/* Jump to user application */
JumpToApplication = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
SysTick->CTRL = 0X00;//禁止SysTick
SysTick->LOAD = 0;
SysTick->VAL = 0;
__disable_irq();
JumpToApplication();
break;
问题3
波特率为9600 8 N 1的时候发送Bin文件一直卡住
原因:不知道,没仔细查