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

改IAP后HAL_Delay卡死,定时器不进中断,直到freeRTOS初始化才开始中断,CUBE生成的代码

[复制链接]
骑着毛驴数星星 提问时间:2023-1-12 15:05 / 未解决
事情是这样的,单片机用的F767ZGT6,一开始我没用IAP,单纯CUBE中开启了freeRTOS,并且Timebase Source选择了TIM1。初始化过程如下,运行的没有问题。但是改了IAP以后程序卡在HAL_Delay里,在定时器中断中加串口打印发现应该是定时器一直没有开启导致计数,应该MX_FREERTOS_Init()以及osKernelStart执行完以后才开启的定时器, 我把HAL_Delay全部屏蔽以后其余的程序运行是正常的。重新去掉IAP功能(去掉地址偏移,去掉KEIL设置flash区域),问题: 为什么IAP会导致Timebase 的TIM1中断延后开启?而不用IAP时就开启正常呢

请指教,非常感谢各位的回答。



我看了下osKernelStart中的代码,里面只有vTaskStartScheduler,然后除了定义空闲任务应该就是对时钟节拍的初始化:
                portDISABLE_INTERRUPTS();

                #if ( configUSE_NEWLIB_REENTRANT == 1 )
                {
                        /* Switch Newlib's _impure_ptr variable to point to the _reent
                        structure specific to the task that will run first. */
                        _impure_ptr = &( pxCurrentTCB->xNewLib_reent );
                }
                #endif /* configUSE_NEWLIB_REENTRANT */

                xNextTaskUnblockTime = portMAX_DELAY;
                xSchedulerRunning = pdTRUE;
                xTickCount = ( TickType_t ) configINITIAL_TICK_COUNT;

                portCONFIGURE_TIMER_FOR_RUN_TIME_STATS();

                traceTASK_SWITCHED_IN();

就这导致正式开启TIM1?那为什么不用IAP时全面也能开启TIM1呢?


main代码如下:
int main(void)
{
  /* USER CODE BEGIN 1 */
        //SystemInit();
        //SCB->VTOR = FLASH_BASE | 0x18000;//设置偏移量
       
    SCB_EnableICache();//使能I-Cache
    SCB_EnableDCache();//使能D-Cache   
        SCB->CACR|=1<<2;   //强制D-Cache透写,如不开启,实际使用中可能遇到各种问题       
       
//        __set_FAULTMASK(0);
        //INTX_ENABLE();
  /* 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 */
  //delay_init(216);  
  //INTX_ENABLE();
  /* USER CODE END SysInit */


  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_ADC3_Init();
  MX_SPI1_Init();
  MX_SPI5_Init();
  MX_CAN1_Init();
  MX_CAN2_Init();
  MX_CAN3_Init();
  MX_SPI2_Init();
  MX_SPI3_Init();
  MX_SPI4_Init();
  MX_SPI6_Init();
  MX_UART4_Init();
  MX_UART7_Init();
  MX_TIM6_Init();
  MX_TIM3_Init();
  /* USER CODE BEGIN 2 */
  //INTX_ENABLE();
  printf("app初始化1完成\r\n");
        HAL_GPIO_WritePin(SPI_RST_5500_GPIO_Port,SPI_RST_5500_Pin,GPIO_PIN_RESET);
        //HAL_Delay(500);
        //delay_ms(500);
        HAL_GPIO_WritePin(SPI_RST_5500_GPIO_Port,SPI_RST_5500_Pin,GPIO_PIN_SET);
        //HAL_Delay(500);
        //delay_ms(500);
        //w5500user_init();
        user_init();
        //api_init();
        HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);//开启中断
        HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO1_MSG_PENDING);//开启中断
        HAL_CAN_ActivateNotification(&hcan3, CAN_IT_RX_FIFO1_MSG_PENDING);//开启中断
        HAL_CAN_Start(&hcan1);
        HAL_CAN_Start(&hcan2);
        HAL_CAN_Start(&hcan3);
        HAL_GPIO_WritePin(GPIOF, LED1_Pin, GPIO_PIN_RESET);
        //HAL_Delay(1000);//延时1s,观察是否复位
        //delay_ms(500);
       
        HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
        printf("app初始化2\r\n");
  /* USER CODE END 2 */


  /* Call init function for freertos objects (in freertos.c) */
  MX_FREERTOS_Init();
  printf("app初始化3\r\n");
  /* Start scheduler */
  osKernelStart();


  /* We should never get here as control is now taken by the scheduler */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  printf("app初始化4\r\n");
  while (1)
  {
    /* USER CODE END WHILE */


    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}


收藏 评论2 发布时间:2023-1-12 15:05

举报

2个回答
HL_zju 回答时间:2023-1-12 17:06:48
开中断之前先清一下标志位呢?
xmshao 回答时间:2023-1-12 19:25:24
如果说你确定只是加了个IAP操作才有问题,说明你APP这块没多少问题。你试试在IAP端做跳转前 将这边开启过的中断使能全部逐一关闭掉,包括滴答中断的使能。保证清清爽爽的跳过去,然后纯粹地运行APP的代码。如果还有问题,重点检查APP端的中断矢量表的重定义以及中断方面的配置。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版