PaulRambo 发表于 2018-2-11 10:29:38

STM32L476 IAP跳转到APP之后串口无法输出问题求助

大家好!我最近在做STM32L476的IAP 功能,目前已经实现从Bootloader到APP的跳转。但是出现的问题是,在Bootloader中使用到了串口1,跳转到APP的时候串口1无法输出,但是外部中断、定时器中断和GPIOB都正常工作。我查了huart1.gState状态为HAL_UART_ERROR_NONE,告诉我么有错误。
我想请教下哪位大神遇到过类似问题?问题卡在了if(huart->gState == HAL_UART_STATE_READY)

发表于 2018-2-11 10:54:41

本帖最后由 安 于 2018-2-11 10:56 编辑

重新初始化串口试一下。看样子像是串口没有初始化。HAL_UART_STATE_READY             = 0x20U,    /*!< Peripheral Initialized and ready for use Value is allowed for gState and RxState */

toofree 发表于 2018-2-11 11:03:36

首先你的APP程序在没有偏移地址的时候,必须能够单独正常工作。
加上偏移地址重新编译后的程序,才能下载到APP存储区。
中断向量重定向,所有外设重新初始化。

wolfgang2015 发表于 2018-2-11 12:10:37

APP跳转后,中断是否有重新初始化?

PaulRambo 发表于 2018-2-11 13:54:00

安 发表于 2018-2-11 10:54
重新初始化串口试一下。看样子像是串口没有初始化。HAL_UART_STATE_READY             = 0x20U,    /*!<...

回复:安: 我的串口已经进行过了初始化,APP中的代码如下:
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
MX_UART4_Init();
、、-------------------------------------------
void MX_USART1_UART_Init(void)
{
HAL_UART_MspDeInit(&huart1);       
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
//huart1.Init.OverSampling = UART_OVERSAMPLING_16;
//huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
//huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
       
        HAL_UART_MspInit(&huart1);       

PaulRambo 发表于 2018-2-11 14:01:13

回复:toofree我的APP能够独立运行,这个可以确定。而且我这里的现象比较奇怪,每次重新烧写一遍APP,都能够运行一次APP,一旦关闭电源,运行一次Bootloader之后,APP就不能再串口输出 了。现象看起来像是Bootloader占用了Uart没有释放。
另外我的偏移地址加上了并且重新编译过了

中断向量也已经重新定向:SCB->VTOR = (uint32_t)(0x08080000);
外设初始化与独立运行时相同。

PaulRambo 发表于 2018-2-11 14:02:34

回复:wolfgang2015
APP跳转之后,所有外设与中断都重新进行了初始化。
/* 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();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
MX_UART4_Init();
MX_I2C1_Init();
MX_SPI1_Init();
MX_TIM2_Init();

///* USER CODE BEGIN 2 */
        HAL_TIM_Base_Start_IT(&htim2);
        UartGsmReceieveInit();

发表于 2018-2-11 14:32:58

从huart->gState == HAL_UART_STATE_READY这里分析,应该是串口没有初始化准备好,发生这种情况以后,建议再重新初始化一次试试。再确定一下huart->gState的值是多少。

PaulRambo 发表于 2018-2-11 15:14:05

安 发表于 2018-2-11 14:32
从huart->gState == HAL_UART_STATE_READY这里分析,应该是串口没有初始化准备好,发生这种情况以后,建议 ...

谢谢你的提醒,我在代码里面直接重复了一句,初始化的就能用了,不清楚原理,但是目前就先这样用,mark一下,以后有时间回来好好研究依一下。       
MX_USART1_UART_Init();
MX_UART4_Init();
printf("This is APP\r\n");

PaulRambo 发表于 2018-2-11 15:20:52

本帖最后由 PaulRambo 于 2018-2-11 15:22 编辑

感谢各位的回复!等我整理好我最近的IAP的资料,我打算开个帖子分享给论坛的各位。下面是我代码的输出,循环在APP与Bootloader之间跳转,能够启动外设串口1、4、Systic、Timer2、LED、IIC等,应该可以说明运行正常了。
AUTO Jump to APP
This is APP
DS3231Time is 2018/02/11 1W15:16:32
Soft reset in 3 secs
321
This is Bootloader
DS3231Time is 2018/02/11 1W15:16:35
GSM is Alive

+CSQ = 23

AUTO Jump to APP
This is APP
DS3231Time is 2018/02/11 1W15:16:52
Soft reset in 3 secs
321
This is Bootloader
DS3231Time is 2018/02/11 1W15:16:55
GSM is Alive



页: [1] 2
查看完整版本: STM32L476 IAP跳转到APP之后串口无法输出问题求助