
事情是这样的,单片机用的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端的中断矢量表的重定义以及中断方面的配置。 |
STM32F723ZET6使用ADC捕获标准正弦波并通过USB主动上报,正弦波重新拟合后存在凹陷峰?
STM32F769是否可以部署边缘AI
STM32F723ZET6配置内部USB PHY的高速模式,初始化的时候usb init无法通过,要怎么修改配置呢?
训练好的ai模型导入cubemx不成功咋办,试了好几个模型压缩了也不行,ram占用过大,有无解决方案?
【STM32F769I-DISC1】LVGL在使用SPI_DMA数据发送时出现错误。
STM32F769I-DISC1的内存地址映印射如果查找
TouchGFX4.25.0 生成工程代码时报TouchGFX CMake projects only support ARM GCC toolchain.
求助
STM32F767+DP83848 LWIP+UDP 大量数据分片发送问题???
请问有STM32F750型号的芯片原理图嘛?