打印
[STM32F4]

FreeRTOS中STemwin的GUI_Init在启动任务前调用卡死

[复制链接]
6032|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pingis58|  楼主 | 2015-12-31 20:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 pingis58 于 2016-1-4 18:53 编辑

    如题 ,库初始化GUI_Init()调用时,在GUI任务创建后,osKernelStart();启动前,被调用,会使systick中断不触发,但中断配置什么都对,systick计数器也在走,就是不中断。最后卡死在延时那。
BSP初始化代码HAL_Delay()函数中。
    GUI_Init()放在GUI任务运行里面调用,显示及其他运行一切正常,找了好久找不到原因,求解,谢谢大家了
main初始化部分,分三部分代码麻烦分析,main调用,BSP部分,GUI初始化部分
<div class="blockcode"><blockquote>int main(void)
{
  /* STM32F4xx HAL library initialization:
       - Configure the Flash prefetch, instruction and Data caches
       - Configure the Systick to generate an interrupt each 1 msec
       - Set NVIC Group Priority to 4
       - Global MSP (MCU Support Package) initialization
     */
  HAL_Init();  
  
  /* Configure the system clock to 180 MHz */
  SystemClock_Config();
  
        BSP_Config();
  /* Configure LED1 and LED3 */
  BSP_LED_Init(LED1);
  BSP_LED_Init(LED3);
  file_isok = FatFS_Init();
  /* Thread 1 definition */
  osThreadDef(LED1, LED_Thread1, osPriorityNormal, 0, configMINIMAL_STACK_SIZE);
  
   /*  Thread 2 definition */
  osThreadDef(LED3, LED_Thread2, osPriorityNormal, 0, configMINIMAL_STACK_SIZE);
        osThreadDef(GUI_TASKID, GUI_Thread, osPriorityNormal, 0, 2048);
  
  /* Start thread 1 */
  LEDThread1Handle = osThreadCreate (osThread(LED1), NULL);
  
  /* Start thread 2 */
  LEDThread2Handle = osThreadCreate (osThread(LED3), NULL);
       
        GUIThreadHandle  = osThreadCreate (osThread(GUI_TASKID), NULL);
       
       
  //init_gui();
  
  /* Start scheduler */
  osKernelStart();

  /* We should never get here as control is now taken by the scheduler */
  for(;;);
}
void BSP_Config(void)
{
        /* Initializes the SDRAM device */
  BSP_SDRAM_Init();
  
  /* Initialize the Touch screen */
  BSP_TS_Init(800, 480);
        //BSP_TS_Init(320, 240);
  
  /* Enable the CRC Module */
  __HAL_RCC_CRC_CLK_ENABLE();
        __HAL_RCC_BKPSRAM_CLK_ENABLE();
        /* Compute the prescaler value to have TIM3 counter clock equal to 10 KHz */
  uwPrescalerValue = (uint32_t) ((SystemCoreClock /2) / 10000) - 1;
  
  /* Set TIMx instance */
  TimHandle.Instance = TIM3;
   
  /* Initialize TIM3 peripheral as follows:
       + Period = 500 - 1
       + Prescaler = ((SystemCoreClock/2)/10000) - 1
       + ClockDivision = 0
       + Counter direction = Up
  */
  TimHandle.Init.Period = 500 - 1;
  TimHandle.Init.Prescaler = uwPrescalerValue;
  TimHandle.Init.ClockDivision = 0;
  TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
  if(HAL_TIM_Base_Init(&TimHandle) != HAL_OK)
  {
    while(1)
    {
    }
  }
  
  /*##-2- Start the TIM Base generation in interrupt mode ####################*/
  /* Start Channel1 */
  if(HAL_TIM_Base_Start_IT(&TimHandle) != HAL_OK)
  {
    while(1)
    {
    }
  }
}

GUI的初始化代码
void init_gui(void)
{
        GUI_Init();

  GUI_SetFont(&GUI_Font32_ASCII);

  GUI_DispStringAt("Starting...", 0, 0);
  
  /* Initialize LCD and LEDs */
  GUI_DispStringAt("Initializing lcd...", 0, 32);
  BSP_Config();
  
  GUI_Initialized = 1;
  
  /* Initialize RTC and Backup */
  GUI_DispStringAt("Initializing rtc and backup...", 0, 64);
  RTC_Init();
  
  /* Activate the use of memory device feature */
  WM_SetCreateFlags(WM_CF_MEMDEV);

  /* Do the calibration if needed */
  CALIBRATION_Check();
}
沙发
mark0668| | 2015-12-31 23:29 | 只看该作者
我也试过,没进之前可以中断,进了就不能中断了, 忘了是怎么解决了.

使用特权

评论回复
板凳
dong_abc| | 2016-1-1 08:05 | 只看该作者
Gui初始化完成之后才能开启系统调度。

使用特权

评论回复
地板
天奕| | 2016-1-1 19:47 | 只看该作者
STemwin时钟开了没

使用特权

评论回复
5
pingis58|  楼主 | 2016-1-4 18:48 | 只看该作者
mark0668 发表于 2015-12-31 23:29
我也试过,没进之前可以中断,进了就不能中断了, 忘了是怎么解决了.

是的,我问题就这样,没GUI_INIT初始化前,中断是进的。初始化后就不中断了,但定时器还是在跑能看到。

使用特权

评论回复
6
pingis58|  楼主 | 2016-1-4 18:50 | 只看该作者
dong_abc 发表于 2016-1-1 08:05
Gui初始化完成之后才能开启系统调度。

我的问题是任务启动前,初始化GUI就会使中断不触发了。放在任务启动后就能正常工作。

使用特权

评论回复
7
pingis58|  楼主 | 2016-1-4 18:53 | 只看该作者
天奕 发表于 2016-1-1 19:47
STemwin时钟开了没

不知道你指的STemwin时钟是哪个。我代码一样,就是把GUI_Init初始化放在任务osKernelStart()后,也就是在任务里面初始化就能正常运行,如果在任务osKernelStart()前,就会使原来已经在systick中断正常的情况下,使中断不会产生。

使用特权

评论回复
8
pingis58|  楼主 | 2016-1-4 19:05 | 只看该作者
mark0668 发表于 2015-12-31 23:29
我也试过,没进之前可以中断,进了就不能中断了, 忘了是怎么解决了.

也就是这肯定是使用问题,或是某些配置不对导致的吗。我的配置跟官方的demo比对,几乎是一样的,实在找不到原因了。

使用特权

评论回复
9
破阵| | 2016-8-6 01:19 | 只看该作者
您好,我也遇到了同样的问题,现在解决了么

使用特权

评论回复
10
yiyigirl2014| | 2018-3-10 09:04 | 只看该作者
有没有解决,分享一下经验。

使用特权

评论回复
11
LMCH| | 2018-3-12 12:30 | 只看该作者
本帖最后由 LMCH 于 2018-3-12 12:32 编辑

单步跟进去看看,CRC开了吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

131

帖子

3

粉丝