你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

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

举报

11个回答
废鱼 回答时间: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 */

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

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

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

wolfgang 回答时间:2018-2-11 12:10:37
APP跳转后,中断是否有重新初始化?

评分

参与人数 1蝴蝶豆 +1 收起 理由
zero99 + 1

查看全部评分

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没有释放。
另外我的偏移地址加上了并且重新编译过了
偏移地址.png
中断向量也已经重新定向: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
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



评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2 结帖奖励

查看全部评分

jiangjialin 回答时间:2019-9-4 10:25:55
PaulRambo 发表于 2018-2-11 15:14
谢谢你的提醒,我在代码里面直接重复了一句,初始化的就能用了,不清楚原理,但是目前就先这样用,mark一 ...

我也遇到类似的问题,在初始化前加了中断延时好的,可是不知道原因,你有知道什么原因吗
马铃土豆薯 回答时间:2020-3-27 08:41:25
我也有相似的问题困扰
请问你们是怎么解决的??跪求
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版