STM32/STM8技术论坛
直播中

王峥

7年用户 204经验值
私信 关注
[问答]

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)

回帖(11)

孙婷婷

2018-12-18 08:52:29
本帖最后由 安 于 2018-2-11 10:56 编辑

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

李维嘉

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

陈磊

2018-12-18 09:18:02
APP跳转后,中断是否有重新初始化?
举报

王峥

2018-12-18 09:29:39
引用: TOPCB 发表于 2018-12-18 16:50
本帖最后由 安 于 2018-2-11 10:56 编辑

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

回复:安: 我的串口已经进行过了初始化,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);       
举报

王峥

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

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

王峥

2018-12-18 09:53:08
回复: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-12-18 10:08:12
从huart->gState == HAL_UART_STATE_READY这里分析,应该是串口没有初始化准备好,发生这种情况以后,建议再重新初始化一次试试。再确定一下huart->gState的值是多少。
举报

王峥

2018-12-18 10:21:43
引用: TOPCB 发表于 2018-12-18 18:06
从huart->gState == HAL_UART_STATE_READY这里分析,应该是串口没有初始化准备好,发生这种情况以后,建议再重新初始化一次试试。再确定一下huart->gState的值是多少。

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

王峥

2018-12-18 10:29:01
本帖最后由 PaulRambo 于 2018-2-11 15:22 编辑

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

+CSQ = 23

AUTO Jump to APP
This is APP
DS3231  Time is 2018/02/11 1W  15:16:52
Soft reset in 3 secs
  3  2  1
This is Bootloader
DS3231  Time is 2018/02/11 1W  15:16:55
GSM is Alive
举报

lee_st

2018-12-19 00:14:04
代码有问题
举报

lee_st

2018-12-19 00:14:15
多么简单的问题啊
举报

更多回帖

发帖
×
20
完善资料,
赚取积分