事情是这样的,单片机用的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 */ } |
开中断之前先清一下标志位呢? |
如果说你确定只是加了个IAP操作才有问题,说明你APP这块没多少问题。你试试在IAP端做跳转前 将这边开启过的中断使能全部逐一关闭掉,包括滴答中断的使能。保证清清爽爽的跳过去,然后纯粹地运行APP的代码。如果还有问题,重点检查APP端的中断矢量表的重定义以及中断方面的配置。 |
怎么监听触摸动作松开?
USB HS 怎样测试眼图?
STM32F767 LWIP无法ping通
touchgfx添加文字不能显示,直接死(HardFault_Handler)
求问诡异的问题,eth网口ping不通
STM32F745: PDR必须直连VDD或VSS吗?
STM32F765 3.3V和GND短路
stm32f723iek6
请问 Stm32 哪款芯片比较适合跑ai?
STM32F769I-DISCO各种板载芯片的引脚图应该去哪找,数据手册上好像没看到?