|
工具:Keil工况:
我这里有两块板,一块是电源板,一块是主控板,现在需要使用主控板通过串口通讯给电源板升级,电源板给主控板供电
目前的思路是这样:
由于主控板RAM比较大,电源板的程序比较小,现在的是通过上位机把电源板的程序发送到主控板的建立的数组中,正确接收完毕后
主控板通过串口把程序发送到电源板进行升级,电源板的升级需要跳转到boot程序(自己写的,不是系统boot)
一般我们是用通过复位,但是现在如果复位了,主控板就会掉电,在RMA中的程序就会丢失
问题:
1)然后就想到了使用程序跳转,从电源板的APP程序直接跳的电源板的Boot, 测试发现电源的确没有掉,但是串口通讯好像是断了,写的boot里的测试程序好像也没有正常运行
2)电源板的是boot 程序前面有HAL_Init ,SystemClock_Config等等,这个需要去掉吗?
这个是电源板boot的主函数, 其中APPLICATION_ADDRESS 为0x8006000
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
// MX_DMA_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
while (BackgroudCNT++ <= 10)
{
/* Clean the input path */
__HAL_UART_FLUSH_DRREGISTER(&huart2);
// Clear ORE
if(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_ORE) == SET)
{
__HAL_UART_CLEAR_OREFLAG(&huart2);
}
/* Receive key */
HAL_UART_Receive(&huart2, &BackgroudMark, 1, 500);
HAL_Delay(10);
}
UpgradeMark = *(__IO uint32_t*)UpgradeAddr;
if(BackgroudMark == '1' )
{
Main_Menu ();
}
else if(UpgradeMark == 1)
{
Main_Menu ();
}
else
{
// Disable Peripheral CLK
HAL_UART_MspDeInit(&huart2);
MX_GPIO_DeInit();
/* 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();
}
/* Keep the user application running */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
app程序中的跳转到boot,其中BOOT_ADDRESS为0x8000000
/* Jump to user application */
JumpAddress = *(__IO uint32_t*) (BOOT_ADDRESS + 4);
JumpToApplication = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) BOOT_ADDRESS);
JumpToApplication();
|
|