初级会员

- 积分
- 117
- 金钱
- 117
- 注册时间
- 2020-3-12
- 在线时间
- 24 小时
|
1金钱
事情是这样的,单片机用的F767ZGT6,一开始我没用IAP,单纯CUBE中开启了freeRTOS,并且Timebase Source选择了TIM1。初始化过程如下,运行的没有问题。但是改了IAP以后程序卡在HAL_Delay里,在定时器中断中加串口打印发现应该是定时器一直没有开启导致计数,应该MX_FREERTOS_Init()执行完以后才开启的定时器, 搜索代码TIM1也没看到在哪里初始化的。我把HAL_Delay全部屏蔽以后其余的程序运行是正常的。问题1: 为什么IAP会导致Timebase 的TIM1中断延后开启?
问题2: TIM1的初始化和开中断的过程在哪执行的?
问题3:原子哥例程中的delay_init也是操作的Timebase Source吗?在CUBE中使用freeRTOS时还能不能复制原子哥例程中的delay_init来作为延时用?
请指教,非常感谢各位的回答。
未加IAP时初始化代码:
- int main(void)
- {
- /* USER CODE BEGIN 1 */
- //SCB->VTOR = FLASH_BASE | 0x18000;//IAP设置偏移量,IAP时打开
-
- SCB_EnableICache();//使能I-Cache
- SCB_EnableDCache();//使能D-Cache
- SCB->CACR|=1<<2; //强制D-Cache透写,如不开启,实际使用中可能遇到各种问题
- /* 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 */
- /* 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);
- HAL_GPIO_WritePin(SPI_RST_5500_GPIO_Port,SPI_RST_5500_Pin,GPIO_PIN_SET);
- HAL_Delay(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,观察是否复位
-
- 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();
- /* Start scheduler */
- osKernelStart();
- /* We should never get here as control is now taken by the scheduler */
- /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- printf("app初始化3\r\n");
- while (1)
- {
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- }
- /* USER CODE END 3 */
- }
复制代码
|
最佳答案
查看完整内容[请看2#楼]
关于问题3:实测了下,发现用IAP的时候,用原子哥例程中的delay_init,以及把HAL_Delay替换成delay_ms后运行看上去都是正常的。
但是,把IAP去掉后发现程序死掉了,死在了delay_ms中。。。
|