完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
事情是这样的,单片机用的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完成rn"); 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初始化2rn"); /* USER CODE END 2 */ /* Call init function for freertos objects (in freertos.c) */ MX_FREERTOS_Init(); printf("app初始化3rn"); /* Start scheduler */ osKernelStart(); /* We should never get here as control is now taken by the scheduler */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ printf("app初始化4rn"); while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } |
|
相关推荐
1个回答
|
|
如果说你确定只是加了个IAP操作才有问题,说明你APP这块没多少问题。你试试在IAP端做跳转前 将这边开启过的中断使能全部逐一关闭掉,包括滴答中断的使能。保证清清爽爽的跳过去,然后纯粹地运行APP的代码。如果还有问题,重点检查APP端的中断矢量表的重定义以及中断方面的配置。
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1113 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1134 浏览 1 评论
569 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
424 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1020 浏览 2 评论
1611浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
277浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
288浏览 3评论
272浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
247浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-19 20:29 , Processed in 1.063155 second(s), Total 80, Slave 63 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号