void TIM3_init(uint32_t Period,uint32_t Prescaler) { __HAL_RCC_TIM3_CLK_ENABLE(); TIM_HandleTypeDef TimHandle; TimHandle.Instance = TIM3; /* Select TIM3 */ TimHandle.Init.Period = Period - 1; /* Auto-reload value */ TimHandle.Init.Prescaler = Prescaler - 1; /* Prescaler is set to 1000-1 */ TimHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; /* No clock division */ TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; /* Up counting mode */ TimHandle.Init.RepetitionCounter = 1 - 1; /* No repetition counter */ TimHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; /* Auto-reload register not buffered */ HAL_NVIC_SetPriority(TIM3_IRQn, 2, 2); HAL_NVIC_EnableIRQ(TIM3_IRQn); /* TIM3 initialization */ if (HAL_TIM_Base_Init(&TimHandle) != HAL_OK) { APP_ErrorHandler(); } /* Start TIM3 and enable interrupts */ if (HAL_TIM_Base_Start_IT(&TimHandle) != HAL_OK) { APP_ErrorHandler(); } } #ifndef __TIM_H #define __TIM_H #include "py32f0xx_hal.h" #include "main.h" void TIM3_init(uint32_t Period,uint32_t Prescaler); extern TIM_HandleTypeDef TimHandle;/** ****************************************************************************** * @file main.c * @author MCU Application Team * @brief Main program body ****************************************************************************** * @attention * * <h2><center>&copy; Copyright (c) 2023 Puya Semiconductor Co. * All rights reserved.</center></h2> * * This software component is licensed by Puya under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** * @attention * * <h2><center>&copy; Copyright (c) 2016 STMicroelectronics. * All rights reserved.</center></h2> * * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "Dr_Driver\bsp.h" #include "TIM\tim.h" #include "KEY\key.h" #include "MIC\mic.h" //TIM_HandleTypeDef TimHandle; static void APP_SystemClockConfig(void); uint8_t key_num; /** * @brief Main program. * @retval int */ int main(void) { /* Reset of all peripherals, Initializes the Systick */ HAL_Init(); //HAL_Delay(1000); uint8_t MIC_status=0; //mic状态 uint32_t smoking_tim=0;//吸烟时间 /* Configure the system clock */ APP_SystemClockConfig(); iwdg_init(); Dr_system_init(); //uart Dr_Uart_Debug_Printf("SystemCoreClock = %d\n\r",SystemCoreClock); TIM3_init(32000,1000);//100ms adc_Config(); KEY_init(); MIC_init(); #if (DEBUG_PRINTF == 1) Dr_Uart_Debug_Printf("SystemCoreClock = %d\n\r",SystemCoreClock); #endif while (1) { MIC_status= HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4); switch(key_num) { case 1:smoking_tim=300;break; case 2:smoking_tim=200;break; case 3:smoking_tim=100;break; default:break; } if(timer_1s_flag) { Dr_Uart_Debug_Printf("vbat = %d\r\n",(4095 * 1200) / g_get_adc[2]); //原电池电压 Dr_Uart_Debug_Printf("outvbat = %d\r\n",(g_get_adc[0]* 1200)/g_get_adc[2]); //待测电池电压 Dr_Uart_Debug_Printf("output = %d\r\n",(g_get_adc[1]* 1200)/g_get_adc[2]); //输出电压 Dr_Uart_Debug_Printf("smokingtim = %d\r\n",smoking_tim); //输出电压 Dr_Uart_Debug_Printf("MIC_status = %d\r\n",MIC_status); //输出电压 Dr_Uart_Debug_Printf("\r\n"); //输出电压 } if(timer_10ms_flag ) { adc_get(); timer_10ms_flag = 0; } if(timer_100ms_flag ) { timer_100ms_flag = 0; if(MIC_status) smoking_tim++; } if(timer_1s_flag) { timer_1s_flag=0; } fwdt_feed(); } } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { //BSP_LED_Toggle(LED_GREEN); //BSP_LED_On(LED_GREEN); smoking_tim=500; } void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { static uint32_t last_time[3] = {0}; uint32_t current_time = HAL_GetTick(); Dr_Uart_Debug_Printf("KEY0 Pressed!\n"); // 判断是哪个按键触发的中断 if (GPIO_Pin == GPIO_PIN_5) { // KEY0 if (current_time - last_time[0] > 20) { // 消抖处理(20ms) last_time[0] = current_time; // 处理KEY0按下事件 Dr_Uart_Debug_Printf("KEY0 Pressed!\n"); } } else if (GPIO_Pin == GPIO_PIN_6) { // KEY1 if (current_time - last_time[1] > 20) { last_time[1] = current_time; // 处理KEY1按下事件 Dr_Uart_Debug_Printf("KEY1 Pressed!\n"); } } else if (GPIO_Pin == GPIO_PIN_7) { // KEY2 if (current_time - last_time[2] > 20) { last_time[2] = current_time; // 处理KEY2按下事件 Dr_Uart_Debug_Printf("KEY2 Pressed!\n"); } } } /** * @brief System Clock Configuration * @param None * @retval None */ static void APP_SystemClockConfig(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /* Oscillator Configuration */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_LSE; /* Select oscillators HSE, HSI, LSI, LSE */ RCC_OscInitStruct.HSIState = RCC_HSI_ON; /* Enable HSI */ RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1; /* HSI not divided */ RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_24MHz; /* Configure HSI clock as 8MHz */ RCC_OscInitStruct.HSEState = RCC_HSE_OFF; /* Disable HSE */ // RCC_OscInitStruct.HSEFreq = RCC_HSE_16_32MHz; RCC_OscInitStruct.LSIState = RCC_LSI_OFF; /* Disable LSI */ RCC_OscInitStruct.LSEState = RCC_LSE_OFF; /* Disable LSE */ /*RCC_OscInitStruct.LSEDriver = RCC_LSEDRIVE_MEDIUM;*/ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; /* Disable PLL */ RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; /* Configure oscillators */ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { APP_ErrorHandler(); } /* Clock source configuration */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1; /* Select clock types HCLK, SYSCLK, PCLK1 */ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; /* Select HSI as the system clock */ RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; /* AHB clock not divide */ RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; /* APB clock not divided */ /* Configure clock source */ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) { APP_ErrorHandler(); } } /** * @brief This function is executed in case of error occurrence. * @param None * @retval None */ void APP_ErrorHandler(void) { /* Infinite loop */ while (1) { } } /************************ (C) COPYRIGHT Puya *****END OF FILE******************/为什么只打印了一行SystemCoreClock = 48000000

时间: 2025-06-20 20:56:19 AIGC 浏览: 38
### TIM3初始化后只打印一次SystemCoreClock的原因分析及解决方法 用户提到的问题是TIM3初始化后仅打印了一次`SystemCoreClock`值,这可能与定时器中断逻辑或串口打印逻辑有关。以下是对此问题的详细分析和解决方案。 --- #### 1. 定时器中断未正确触发 如果定时器中断未被正确触发,则`HAL_TIM_PeriodElapsedCallback`函数不会被调用,导致后续的`SystemCoreClock`值无法继续打印。根据提供的信息[^2],需要确保以下几点: - **中断标志位是否清除**:在启动定时器中断之前,必须确保中断标志位已被清除。例如: ```c __HAL_TIM_CLEAR_FLAG(&htim3, TIM_FLAG_UPDATE); HAL_TIM_Base_Start_IT(&htim3); ``` 如果未清除中断标志位,可能会导致中断逻辑异常[^1]。 - **NVIC配置是否正确**:检查NVIC中是否正确启用了TIM3中断,并设置了适当的优先级。 ```c HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM3_IRQn); ``` --- #### 2. 中断服务程序逻辑问题 中断服务程序中的回调函数`HAL_TIM_PeriodElapsedCallback`需要正确实现以确保每次定时器更新事件发生时都能执行相应的任务。如果该函数未被调用或逻辑错误,则可能导致`SystemCoreClock`值只打印一次。 以下是一个典型的回调函数实现: ```c void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM3) { // 在这里添加打印SystemCoreClock的代码 printf("SystemCoreClock: %lu\n", SystemCoreClock); } } ``` 此外,还需要确保`TIM3_IRQHandler`函数正确调用了`HAL_TIM_IRQHandler`: ```c void TIM3_IRQHandler(void) { HAL_TIM_IRQHandler(&htim3); } ``` --- #### 3. 串口打印逻辑问题 如果串口打印逻辑存在问题,也可能导致`SystemCoreClock`值只打印一次。以下是一些常见原因及解决方法: - **缓冲区溢出**:如果使用的是阻塞式串口打印(如`printf`),可能会因为缓冲区满而导致后续数据无法打印。可以通过增加缓冲区大小或使用非阻塞式打印来解决。 - **波特率设置不匹配**:确保串口波特率与接收端一致,否则可能导致数据丢失或乱码。 - **打印频率过高**:如果定时器中断频率过高,而串口打印速度较慢,可能会导致数据丢失。可以通过降低定时器频率或减少打印内容来缓解此问题。 --- #### 4. 定时器参数配置问题 定时器的`Prescaler`和`Period`参数决定了定时器的计数周期。如果这些参数配置不当,可能导致定时器未能按预期工作。例如: - 假设系统时钟为84MHz,希望定时器产生1Hz的频率,则预分频器值应为8399,自动重装载值应为999。 ```c htim3.Init.Prescaler = 8399; htim3.Init.Period = 999; ``` 如果这些参数配置错误,可能导致定时器未能按时触发中断。 --- #### 5. 示例代码 以下是一个完整的示例代码,展示如何正确初始化TIM3并打印`SystemCoreClock`值: ```c #include "stm32fxxx_hal.h" TIM_HandleTypeDef htim3; void MX_TIM3_Init(void) { htim3.Instance = TIM3; htim3.Init.Prescaler = 8399; // 假设系统时钟为84MHz htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 999; // 定时1秒 htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; HAL_TIM_Base_Init(&htim3); // 清除中断标志位 __HAL_TIM_CLEAR_FLAG(&htim3, TIM_FLAG_UPDATE); // 启动定时器中断 HAL_TIM_Base_Start_IT(&htim3); } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM3) { printf("SystemCoreClock: %lu\n", SystemCoreClock); } } void TIM3_IRQHandler(void) { HAL_TIM_IRQHandler(&htim3); } void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) { if (tim_baseHandle->Instance == TIM3) { __HAL_RCC_TIM3_CLK_ENABLE(); HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM3_IRQn); } } ``` --- ###
阅读全文

相关推荐

代码变成了,led一直亮是怎么回事,请根据代码找出问题 #include "./BSP/LED/dsq.h" TIM_HandleTypeDef g_dsq_handle; void dsq_init(uint16_t psc,uint16_t zhi) { TIM_OC_InitTypeDef time_oc_pwm; g_dsq_handle.Instance = TIM3; g_dsq_handle.Init.Prescaler = psc; g_dsq_handle.Init.Period =zhi; g_dsq_handle.Init.CounterMode = TIM_COUNTERMODE_UP; HAL_TIM_PWM_Init(&g_dsq_handle); time_oc_pwm.Pulse = zhi / 2; time_oc_pwm.OCMode = TIM_OCMODE_PWM1; time_oc_pwm.OCPolarity = TIM_OCPOLARITY_LOW; HAL_TIM_PWM_ConfigChannel(&g_dsq_handle,&time_oc_pwm,TIM_CHANNEL_2); HAL_TIM_PWM_Start_IT(&g_dsq_handle,TIM_CHANNEL_2); } void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM3) { GPIO_InitTypeDef gpio_init_dsp; __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_TIM3_CLK_ENABLE(); gpio_init_dsp.Mode = GPIO_MODE_AF_PP; gpio_init_dsp.Pin = GPIO_PIN_5; gpio_init_dsp.Pull = GPIO_PULLUP; gpio_init_dsp.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB,&gpio_init_dsp); __HAL_RCC_AFIO_CLK_ENABLE(); __HAL_AFIO_REMAP_TIM3_PARTIAL(); } } #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" #include "./SYSTEM/delay/delay.h" #include "./BSP/LED/led.h" #include "./BSP/LED/dsq.h" extern TIM_HandleTypeDef g_dsq_handle; int main(void) { uint16_t ledrpwmval = 0; uint8_t dir = 1; HAL_Init(); /* 初始化HAL库 */ sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */ delay_init(72); /* 延时初始化 */ dsq_init(72-1,500-1); while(1) { delay_ms(10); if (dir)ledrpwmval++; /* dir==1 ledrpwmval递增 */ else ledrpwmval--; /* dir==0 ledrpwmval递减 */ if (ledrpwmval > 300)dir = 0; /* ledrpwmval到达300后,方向为递减 */ if (ledrpwmval == 0)dir = 1; /* ledrpwmval递减到0后,方向改为递增 */ __HAL_TIM_SET_COMPARE(&g_dsq_handle, TIM_CHANNEL_2, ledrpwmval); } } 代码变成了,led一直亮是怎么回事,请根据代码找出问题 #include "./BSP/LED/dsq.h" TIM_HandleTypeDef g_dsq_handle; void dsq_init(uint16_t psc,uint16_t zhi) { TIM_OC_InitTypeDef time_oc_pwm; g_dsq_handle.Instance = TIM3; g_dsq_handle.Init.Prescaler = psc; g_dsq_handle.Init.Period =zhi; g_dsq_handle.Init.CounterMode = TIM_COUNTERMODE_UP; HAL_TIM_PWM_Init(&g_dsq_handle); time_oc_pwm.Pulse = zhi / 2; time_oc_pwm.OCMode = TIM_OCMODE_PWM1; time_oc_pwm.OCPolarity = TIM_OCPOLARITY_LOW; HAL_TIM_PWM_ConfigChannel(&g_dsq_handle,&time_oc_pwm,TIM_CHANNEL_2); HAL_TIM_PWM_Start_IT(&g_dsq_handle,TIM_CHANNEL_2); } void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM3) { GPIO_InitTypeDef gpio_init_dsp; __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_TIM3_CLK_ENABLE(); gpio_init_dsp.Mode = GPIO_MODE_AF_PP; gpio_init_dsp.Pin = GPIO_PIN_5; gpio_init_dsp.Pull = GPIO_PULLUP; gpio_init_dsp.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB,&gpio_init_dsp); __HAL_RCC_AFIO_CLK_ENABLE(); __HAL_AFIO_REMAP_TIM3_PARTIAL(); } } #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" #include "./SYSTEM/delay/delay.h" #include "./BSP/LED/led.h" #include "./BSP/LED/dsq.h" extern TIM_HandleTypeDef g_dsq_handle; int main(void) { uint16_t ledrpwmval = 0; uint8_t dir = 1; HAL_Init(); /* 初始化HAL库 */ sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */ delay_init(72); /* 延时初始化 */ dsq_init(72-1,500-1); while(1) { delay_ms(10); if (dir)ledrpwmval++; /* dir==1 ledrpwmval递增 */ else ledrpwmval--; /* dir==0 ledrpwmval递减 */ if (ledrpwmval > 300)dir = 0; /* ledrpwmval到达300后,方向为递减 */ if (ledrpwmval == 0)dir = 1; /* ledrpwmval递减到0后,方向改为递增 */ __HAL_TIM_SET_COMPARE(&g_dsq_handle, TIM_CHANNEL_2, ledrpwmval); } }代码变成了,led一直亮是怎么回事,请根据代码找出问题 #include "./BSP/LED/dsq.h" TIM_HandleTypeDef g_dsq_handle; void dsq_init(uint16_t psc,uint16_t zhi) { TIM_OC_InitTypeDef time_oc_pwm; g_dsq_handle.Instance = TIM3; g_dsq_handle.Init.Prescaler = psc; g_dsq_handle.Init.Period =zhi; g_dsq_handle.Init.CounterMode = TIM_COUNTERMODE_UP; HAL_TIM_PWM_Init(&g_dsq_handle); time_oc_pwm.Pulse = zhi / 2; time_oc_pwm.OCMode = TIM_OCMODE_PWM1; time_oc_pwm.OCPolarity = TIM_OCPOLARITY_LOW; HAL_TIM_PWM_ConfigChannel(&g_dsq_handle,&time_oc_pwm,TIM_CHANNEL_2); HAL_TIM_PWM_Start_IT(&g_dsq_handle,TIM_CHANNEL_2); } void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM3) { GPIO_InitTypeDef gpio_init_dsp; __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_TIM3_CLK_ENABLE(); gpio_init_dsp.Mode = GPIO_MODE_AF_PP; gpio_init_dsp.Pin = GPIO_PIN_5; gpio_init_dsp.Pull = GPIO_PULLUP; gpio_init_dsp.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB,&gpio_init_dsp); __HAL_RCC_AFIO_CLK_ENABLE(); __HAL_AFIO_REMAP_TIM3_PARTIAL(); } } #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" #include "./SYSTEM/delay/delay.h" #include "./BSP/LED/led.h" #include "./BSP/LED/dsq.h" extern TIM_HandleTypeDef g_dsq_handle; int main(void) { uint16_t ledrpwmval = 0; uint8_t dir = 1; HAL_Init(); /* 初始化HAL库 */ sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */ delay_init(72); /* 延时初始化 */ dsq_init(72-1,500-1); while(1) { delay_ms(10); if (dir)ledrpwmval++; /* dir==1 ledrpwmval递增 */ else ledrpwmval--; /* dir==0 ledrpwmval递减 */ if (ledrpwmval > 300)dir = 0; /* ledrpwmval到达300后,方向为递减 */ if (ledrpwmval == 0)dir = 1; /* ledrpwmval递减到0后,方向改为递增 */ __HAL_TIM_SET_COMPARE(&g_dsq_handle, TIM_CHANNEL_2, ledrpwmval); } }代码变成了,led一直亮是怎么回事,请根据代码找出问题 #include "./BSP/LED/dsq.h" TIM_HandleTypeDef g_dsq_handle; void dsq_init(uint16_t psc,uint16_t zhi) { TIM_OC_InitTypeDef time_oc_pwm; g_dsq_handle.Instance = TIM3; g_dsq_handle.Init.Prescaler = psc; g_dsq_handle.Init.Period =zhi; g_dsq_handle.Init.CounterMode = TIM_COUNTERMODE_UP; HAL_TIM_PWM_Init(&g_dsq_handle); time_oc_pwm.Pulse = zhi / 2; time_oc_pwm.OCMode = TIM_OCMODE_PWM1; time_oc_pwm.OCPolarity = TIM_OCPOLARITY_LOW; HAL_TIM_PWM_ConfigChannel(&g_dsq_handle,&time_oc_pwm,TIM_CHANNEL_2); HAL_TIM_PWM_Start_IT(&g_dsq_handle,TIM_CHANNEL_2); } void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM3) { GPIO_InitTypeDef gpio_init_dsp; __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_TIM3_CLK_ENABLE(); gpio_init_dsp.Mode = GPIO_MODE_AF_PP; gpio_init_dsp.Pin = GPIO_PIN_5; gpio_init_dsp.Pull = GPIO_PULLUP; gpio_init_dsp.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB,&gpio_init_dsp); __HAL_RCC_AFIO_CLK_ENABLE(); __HAL_AFIO_REMAP_TIM3_PARTIAL(); } } #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" #include "./SYSTEM/delay/delay.h" #include "./BSP/LED/led.h" #include "./BSP/LED/dsq.h" extern TIM_HandleTypeDef g_dsq_handle; int main(void) { uint16_t ledrpwmval = 0; uint8_t dir = 1; HAL_Init(); /* 初始化HAL库 */ sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */ delay_init(72); /* 延时初始化 */ dsq_init(72-1,500-1); while(1) { delay_ms(10); if (dir)ledrpwmval++; /* dir==1 ledrpwmval递增 */ else ledrpwmval--; /* dir==0 ledrpwmval递减 */ if (ledrpwmval > 300)dir = 0; /* ledrpwmval到达300后,方向为递减 */ if (ledrpwmval == 0)dir = 1; /* ledrpwmval递减到0后,方向改为递增 */ __HAL_TIM_SET_COMPARE(&g_dsq_handle, TIM_CHANNEL_2, ledrpwmval); } }代码变成了,led一直亮是怎么回事,请根据代码找出问题 #include "./BSP/LED/dsq.h" TIM_HandleTypeDef g_dsq_handle; void dsq_init(uint16_t psc,uint16_t zhi) { TIM_OC_InitTypeDef time_oc_pwm; g_dsq_handle.Instance = TIM3; g_dsq_handle.Init.Prescaler = psc; g_dsq_handle.Init.Period =zhi; g_dsq_handle.Init.CounterMode = TIM_COUNTERMODE_UP; HAL_TIM_PWM_Init(&g_dsq_handle); time_oc_pwm.Pulse = zhi / 2; time_oc_pwm.OCMode = TIM_OCMODE_PWM1; time_oc_pwm.OCPolarity = TIM_OCPOLARITY_LOW; HAL_TIM_PWM_ConfigChannel(&g_dsq_handle,&time_oc_pwm,TIM_CHANNEL_2); HAL_TIM_PWM_Start_IT(&g_dsq_handle,TIM_CHANNEL_2); } void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM3) { GPIO_InitTypeDef gpio_init_dsp; __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_TIM3_CLK_ENABLE(); gpio_init_dsp.Mode = GPIO_MODE_AF_PP; gpio_init_dsp.Pin = GPIO_PIN_5; gpio_init_dsp.Pull = GPIO_PULLUP; gpio_init_dsp.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB,&gpio_init_dsp); __HAL_RCC_AFIO_CLK_ENABLE(); __HAL_AFIO_REMAP_TIM3_PARTIAL(); } } #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" #include "./SYSTEM/delay/delay.h" #include "./BSP/LED/led.h" #include "./BSP/LED/dsq.h" extern TIM_HandleTypeDef g_dsq_handle; int main(void) { uint16_t ledrpwmval = 0; uint8_t dir = 1; HAL_Init(); /* 初始化HAL库 */ sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */ delay_init(72); /* 延时初始化 */ dsq_init(72-1,500-1); while(1) { delay_ms(10); if (dir)ledrpwmval++; /* dir==1 ledrpwmval递增 */ else ledrpwmval--; /* dir==0 ledrpwmval递减 */ if (ledrpwmval > 300)dir = 0; /* ledrpwmval到达300后,方向为递减 */ if (ledrpwmval == 0)dir = 1; /* ledrpwmval递减到0后,方向改为递增 */ __HAL_TIM_SET_COMPARE(&g_dsq_handle, TIM_CHANNEL_2, ledrpwmval); } }代码变成了,led一直亮是怎么回事,请根据代码找出问题 #include "./BSP/LED/dsq.h" TIM_HandleTypeDef g_dsq_handle; void dsq_init(uint16_t psc,uint16_t zhi) { TIM_OC_InitTypeDef time_oc_pwm; g_dsq_handle.Instance = TIM3; g_dsq_handle.Init.Prescaler = psc; g_dsq_handle.Init.Period =zhi; g_dsq_handle.Init.CounterMode = TIM_COUNTERMODE_UP; HAL_TIM_PWM_Init(&g_dsq_handle); time_oc_pwm.Pulse = zhi / 2; time_oc_pwm.OCMode = TIM_OCMODE_PWM1; time_oc_pwm.OCPolarity = TIM_OCPOLARITY_LOW; HAL_TIM_PWM_ConfigChannel(&g_dsq_handle,&time_oc_pwm,TIM_CHANNEL_2); HAL_TIM_PWM_Start_IT(&g_dsq_handle,TIM_CHANNEL_2); } void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM3) { GPIO_InitTypeDef gpio_init_dsp; __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_TIM3_CLK_ENABLE(); gpio_init_dsp.Mode = GPIO_MODE_AF_PP; gpio_init_dsp.Pin = GPIO_PIN_5; gpio_init_dsp.Pull = GPIO_PULLUP; gpio_init_dsp.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB,&gpio_init_dsp); __HAL_RCC_AFIO_CLK_ENABLE(); __HAL_AFIO_REMAP_TIM3_PARTIAL(); } } #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" #include "./SYSTEM/delay/delay.h" #include "./BSP/LED/led.h" #include "./BSP/LED/dsq.h" extern TIM_HandleTypeDef g_dsq_handle; int main(void) { uint16_t ledrpwmval = 0; uint8_t dir = 1; HAL_Init(); /* 初始化HAL库 */ sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */ delay_init(72); /* 延时初始化 */ dsq_init(72-1,500-1); while(1) { delay_ms(10); if (dir)ledrpwmval++; /* dir==1 ledrpwmval递增 */ else ledrpwmval--; /* dir==0 ledrpwmval递减 */ if (ledrpwmval > 300)dir = 0; /* ledrpwmval到达300后,方向为递减 */ if (ledrpwmval == 0)dir = 1; /* ledrpwmval递减到0后,方向改为递增 */ __HAL_TIM_SET_COMPARE(&g_dsq_handle, TIM_CHANNEL_2, ledrpwmval); } }代码变成了,led一直亮是怎么回事,请你根据代码找出问题,是你根据提供代码找出问题,明白了吗

/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * Copyright (c) 2025 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "memorymap.h" #include "tim.h" #include "usb_device.h" #include "gpio.h" #include "fmc.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "demo.h" #include "usbd_cdc_if.h" #include "usmart.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ extern USBD_HandleTypeDef hUsbDeviceHS; static uint8_t old_usb_status = 0; /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MPU_Config(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MPU Configuration--------------------------------------------------------*/ MPU_Config(); /* Enable the CPU Cache */ /* Enable I-Cache---------------------------------------------------------*/ SCB_EnableICache(); /* Enable D-Cache---------------------------------------------------------*/ SCB_EnableDCache(); /* 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_FMC_Init(); MX_USB_DEVICE_Init(); PWM_Init(0,300000,300000,300000,10,4);//调用PWM产生函数。初始化CCD和AD MX_TIM12_Init(0,0);//产生400HzPWM,无占空比 MX_TIM1_5_Init(768,30);//定时器1和5产生同步250K占空比80%和400hz占空比25us的PWM MX_TIM14_Init(2500,0); MX_TIM5_Init(1);//定时器5,初始化,1s MX_TIM15_Init(5);//定时器15初始化,5s MX_TIM16_Init(3); //3s MX_TIM17_Init(1); //1s /* USER CODE BEGIN 2 */ usmart_dev.init(240); HAL_TIM_Base_Start_IT(&htim13);//开定时器5,中断 HAL_TIM_Base_Start_IT(&htim17); HAL_TIM_Base_Start_IT(&htim15); HAL_TIM_Base_Start_IT(&htim16); __HAL_TIM_DISABLE(&htim13);//失能 __HAL_TIM_DISABLE(&htim17); __HAL_TIM_DISABLE(&htim15); __HAL_TIM_DISABLE(&htim16); IO_contrl(5);//外部中断IO口控制函数 AD7606_Range(1);//AD7606量程选择 AD7606_Reset();//AD7606复位 GPIO_Init(0);//IO控制 wendu_init(0); //温度 reset_init(0); //复位 PWM_400Hz_start(0);//开启输出400hzPWM PWM_400Hz_stop(0);//关闭产生400HzPWM text_init(0); //开始采集 tim_init(0); //定时器5开启,做模拟看门狗 PWM400_start_init(0,0,0);//PWM输出 caiji_init(1,0);//采集时间设置 version_num(0);//版本号 tim_cnt(60);//初始化5min /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { //检测USB是否断开,断开了就复位 if(hUsbDeviceHS.dev_state != old_usb_status) { if (hUsbDeviceHS.dev_state == USBD_STATE_SUSPENDED) { reset_init(1); } old_usb_status = hUsbDeviceHS.dev_state; } /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Supply configuration update enable */ HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY); /** Configure the main internal regulator output voltage */ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0); while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {} /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 5; RCC_OscInitStruct.PLL.PLLN = 192; RCC_OscInitStruct.PLL.PLLP = 2; RCC_OscInitStruct.PLL.PLLQ = 20; RCC_OscInitStruct.PLL.PLLR = 2; RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2; RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE; RCC_OscInitStruct.PLL.PLLFRACN = 0; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2 |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2; RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2; RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) { Error_Handler(); } } /* USER CODE BEGIN 4 */ /* USER CODE END 4 */ /* MPU Configuration */ void MPU_Config(void) { MPU_Region_InitTypeDef MPU_InitStruct = {0}; /* Disables the MPU */ HAL_MPU_Disable(); /** Initializes and configures the Region and the memory to be protected */ MPU_InitStruct.Enable = MPU_REGION_ENABLE; MPU_InitStruct.Number = MPU_REGION_NUMBER0; MPU_InitStruct.BaseAddress = 0x60000000; MPU_InitStruct.Size = MPU_REGION_SIZE_64KB; MPU_InitStruct.SubRegionDisable = 0x0; MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0; MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS; MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE; MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE; MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE; MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE; HAL_MPU_ConfigRegion(&MPU_InitStruct); /** Initializes and configures the Region and the memory to be protected */ MPU_InitStruct.Enable = MPU_REGION_ENABLE; MPU_InitStruct.Number = MPU_REGION_NUMBER1; MPU_InitStruct.BaseAddress = 0x64000000; MPU_InitStruct.Size = MPU_REGION_SIZE_64KB; MPU_InitStruct.SubRegionDisable = 0x0; MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0; MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS; MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE; MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE; MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE; MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE; HAL_MPU_ConfigRegion(&MPU_InitStruct); /* Enables the MPU */ HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT); } /** * @brief This function is executed in case of error occurrence. * @retval None */ void Error_Handler(void) { /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ __disable_irq(); while (1) { } /* USER CODE END Error_Handler_Debug */ } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t *file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */ /* USER CODE BEGIN Header */ /** ****************************************************************************** * @file gpio.c * @brief This file provides code for the configuration * of all used GPIO pins. ****************************************************************************** * @attention * * Copyright (c) 2025 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "gpio.h" /* USER CODE BEGIN 0 */ #define AD7606_RESULT *(__IO uint16_t *)0x60000000 #define AD7606_RESULT1 *(__IO uint16_t *)0x64000000 int16_t s_volt[16]; #define adc_buffer 3750 int16_t Buf[adc_buffer][16]; uint16_t usWrite=0; /* USER CODE END 0 */ /*----------------------------------------------------------------------------*/ /* Configure GPIO */ /*----------------------------------------------------------------------------*/ /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /** Configure pins PC14-OSC32_IN (OSC32_IN) ------> RCC_OSC32_IN PC15-OSC32_OUT (OSC32_OUT) ------> RCC_OSC32_OUT PH0-OSC_IN (PH0) ------> RCC_OSC_IN PH1-OSC_OUT (PH1) ------> RCC_OSC_OUT PA13 (JTMS/SWDIO) ------> DEBUG_JTMS-SWDIO PA14 (JTCK/SWCLK) ------> DEBUG_JTCK-SWCLK */ void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOI_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOE, IO_CONTROL_0_Pin|IO_CONTROL_1_Pin|IO_CONTROL_2_Pin|IO_CONTROL_3_Pin, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOH, GPIO_PIN_9, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOI, GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(AD7606_RST_GPIO_Port, AD7606_RST_Pin, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOI, GPIO_PIN_5|GPIO_PIN_6, GPIO_PIN_SET); /*Configure GPIO pins : IO_CONTROL_0_Pin IO_CONTROL_1_Pin IO_CONTROL_2_Pin IO_CONTROL_3_Pin */ GPIO_InitStruct.Pin = IO_CONTROL_0_Pin|IO_CONTROL_1_Pin|IO_CONTROL_2_Pin|IO_CONTROL_3_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); /*Configure GPIO pin : AD7606_BUSY_Pin */ GPIO_InitStruct.Pin = AD7606_BUSY_Pin; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(AD7606_BUSY_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pin : PH9 */ GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); /*Configure GPIO pin : PI0 */ GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOI, &GPIO_InitStruct); /*Configure GPIO pins : PI1 PI2 PI5 PI6 */ GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_5|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOI, &GPIO_InitStruct); /*Configure GPIO pin : AD7606_RST_Pin */ GPIO_InitStruct.Pin = AD7606_RST_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(AD7606_RST_GPIO_Port, &GPIO_InitStruct); /* EXTI interrupt init*/ HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); // HAL_NVIC_EnableIRQ(EXTI0_IRQn); HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); } /* USER CODE BEGIN 2 */ void AD7606_Range(uint8_t Range) { if (Range == 1) { HAL_GPIO_WritePin(GPIOH, GPIO_PIN_9, GPIO_PIN_SET); } else if(Range == 0) { HAL_GPIO_WritePin(GPIOH, GPIO_PIN_9, GPIO_PIN_RESET); } } void AD7606_Reset(void) { HAL_GPIO_WritePin(AD7606_RST_GPIO_Port, AD7606_RST_Pin, GPIO_PIN_RESET); /* 退出复位状态 */ HAL_GPIO_WritePin(AD7606_RST_GPIO_Port, AD7606_RST_Pin, GPIO_PIN_SET); /* 进入复位状态 */ HAL_GPIO_WritePin(AD7606_RST_GPIO_Port, AD7606_RST_Pin, GPIO_PIN_SET); /* 仅用于延迟。 RESET复位高电平脉冲宽度最小50ns。 */ HAL_GPIO_WritePin(AD7606_RST_GPIO_Port, AD7606_RST_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(AD7606_RST_GPIO_Port, AD7606_RST_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(AD7606_RST_GPIO_Port, AD7606_RST_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(AD7606_RST_GPIO_Port, AD7606_RST_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(AD7606_RST_GPIO_Port, AD7606_RST_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(AD7606_RST_GPIO_Port, AD7606_RST_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(AD7606_RST_GPIO_Port, AD7606_RST_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(AD7606_RST_GPIO_Port, AD7606_RST_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(AD7606_RST_GPIO_Port, AD7606_RST_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(AD7606_RST_GPIO_Port, AD7606_RST_Pin, GPIO_PIN_RESET); /* 退出复位状态 */ } void AD7606_ReadNowAdc(void) { s_volt[0] = AD7606_RESULT; /* 读第1路样本 */ s_volt[1] = AD7606_RESULT; /* 读第2路样本 */ s_volt[2] = AD7606_RESULT; /* 读第3路样本 */ s_volt[3] = AD7606_RESULT; /* 读第4路样本 */ s_volt[4] = AD7606_RESULT; /* 读第5路样本 */ s_volt[5] = AD7606_RESULT; /* 读第6路样本 */ s_volt[6] = AD7606_RESULT; /* 读第7路样本 */ s_volt[7] = AD7606_RESULT; /* 读第8路样本 */ s_volt[8] = AD7606_RESULT1; /* 读第1路样本 */ s_volt[9] = AD7606_RESULT1; /* 读第2路样本 */ s_volt[10] = AD7606_RESULT1; /* 读第3路样本 */ s_volt[11] = AD7606_RESULT1; /* 读第4路样本 */ s_volt[12] = AD7606_RESULT1; /* 读第5路样本 */ s_volt[13] = AD7606_RESULT1; /* 读第6路样本 */ s_volt[14] = AD7606_RESULT1; /* 读第7路样本 */ s_volt[15] = AD7606_RESULT1; /* 读第8路样本 */ Buf[usWrite][0] = s_volt[0]; Buf[usWrite][1] = s_volt[1]; Buf[usWrite][2] = s_volt[2]; Buf[usWrite][3] = s_volt[3]; Buf[usWrite][4] = s_volt[4]; Buf[usWrite][5] = s_volt[5]; Buf[usWrite][6] = s_volt[6]; Buf[usWrite][7] = s_volt[7]; Buf[usWrite][8] = s_volt[8]; Buf[usWrite][9] = s_volt[9]; Buf[usWrite][10] = s_volt[10]; Buf[usWrite][11] = s_volt[11]; Buf[usWrite][12] = s_volt[12]; Buf[usWrite][13] = s_volt[13]; Buf[usWrite][14] = s_volt[14]; Buf[usWrite][15] = s_volt[15]; if (++usWrite >= adc_buffer) { usWrite = 0; } } /* USER CODE END 2 */ /* USER CODE BEGIN Header */ /** ****************************************************************************** * @file tim.c * @brief This file provides code for the configuration * of the TIM instances. ****************************************************************************** * @attention * * Copyright (c) 2025 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "tim.h" /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ TIM_HandleTypeDef htim1; TIM_HandleTypeDef htim2; TIM_HandleTypeDef htim3; TIM_HandleTypeDef htim4; TIM_HandleTypeDef htim5; TIM_HandleTypeDef htim8; TIM_HandleTypeDef htim12; TIM_HandleTypeDef htim13; TIM_HandleTypeDef htim14; TIM_HandleTypeDef htim15; TIM_HandleTypeDef htim16; TIM_HandleTypeDef htim17; /* TIM1 init function */ void MX_TIM1_5_Init(uint16_t duty_arr,uint16_t duty_arr1) { TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; TIM_SlaveConfigTypeDef sSlaveConfig = {0}; htim1.Instance = TIM1; htim1.Init.Prescaler = 0; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 960-1; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter = 0; htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim1) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_Init(&htim1) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_ENABLE; sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = duty_arr; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } htim5.Instance = TIM5; htim5.Init.Prescaler = 240-1; htim5.Init.CounterMode = TIM_COUNTERMODE_UP; htim5.Init.Period = 2500-1; htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim5.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim5) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim5, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_Init(&htim5) != HAL_OK) { Error_Handler(); } sSlaveConfig.SlaveMode = TIM_SLAVEMODE_TRIGGER; sSlaveConfig.InputTrigger = TIM_TS_ITR0; if (HAL_TIM_SlaveConfigSynchro(&htim5, &sSlaveConfig) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim5, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = duty_arr1; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim5, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } HAL_TIM_MspPostInit(&htim1); HAL_TIM_MspPostInit(&htim5); } /* TIM2 init function */ void MX_TIM_Init(uint32_t arr,uint32_t ccd_icg,uint32_t ccd_sh,uint16_t duty_icg,uint16_t duty_sh) { TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_SlaveConfigTypeDef sSlaveConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; uint32_t fqr,fqr0,fqr1,fqr2; fqr=240000000/(arr/4); //AD clk fqr2=240000000/(arr); //CCD CLK fqr1=240000000/(ccd_icg); //CCD ICG fqr0=240000000/(ccd_sh); //CCD ICG __HAL_RCC_TIM2_CLK_ENABLE(); __HAL_RCC_TIM3_CLK_ENABLE(); __HAL_RCC_TIM4_CLK_ENABLE(); __HAL_RCC_TIM8_CLK_ENABLE(); htim8.Instance = TIM8; //AD7606 CLK htim8.Init.Prescaler = 0; htim8.Init.Period = fqr-1; //2400-1 htim8.Init.CounterMode = TIM_COUNTERMODE_UP; htim8.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim8.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; HAL_TIM_Base_Init(&htim8); sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; HAL_TIM_ConfigClockSource(&htim8, &sClockSourceConfig); htim2.Instance = TIM2; //CCD CLK htim2.Init.Prescaler = 0; htim2.Init.Period = fqr2-1; //600-1 htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; HAL_TIM_Base_Init(&htim2); sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig); htim3.Instance = TIM3; //CCD ICG htim3.Init.Prescaler = fqr1-1; htim3.Init.Period = 15000-1; //600-1 htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; HAL_TIM_Base_Init(&htim3); sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig); htim4.Instance = TIM4; //CCD SH htim4.Init.Prescaler = fqr0-1; htim4.Init.Period = 15000-1; //600-1 htim4.Init.CounterMode = TIM_COUNTERMODE_UP; htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; HAL_TIM_Base_Init(&htim4); sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig); sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; sConfigOC.OCMode = TIM_OCMODE_PWM2; sConfigOC.Pulse = 7; sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_Init(&htim8); sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = fqr2/2; HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_Init(&htim2); sConfigOC.OCMode = TIM_OCMODE_PWM2; sConfigOC.Pulse = duty_icg; HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_Init(&htim3); sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = duty_sh; HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_Init(&htim4); sMasterConfig.MasterOutputTrigger = TIM_TRGO_ENABLE; sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE; HAL_TIMEx_MasterConfigSynchronization(&htim8, &sMasterConfig); sSlaveConfig.SlaveMode = TIM_SLAVEMODE_TRIGGER; sSlaveConfig.InputTrigger = TIM_TS_ITR1; HAL_TIM_SlaveConfigSynchro(&htim2, &sSlaveConfig); sMasterConfig.MasterOutputTrigger = TIM_TRGO_ENABLE; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE; HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig); sSlaveConfig.SlaveMode = TIM_SLAVEMODE_TRIGGER; sSlaveConfig.InputTrigger = TIM_TS_ITR1; HAL_TIM_SlaveConfigSynchro(&htim3, &sSlaveConfig); sMasterConfig.MasterOutputTrigger = TIM_TRGO_ENABLE; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE; HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig); sSlaveConfig.SlaveMode = TIM_SLAVEMODE_TRIGGER; sSlaveConfig.InputTrigger = TIM_TS_ITR2; HAL_TIM_SlaveConfigSynchro(&htim4, &sSlaveConfig); sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig); HAL_TIM_MspPostInit(&htim2); HAL_TIM_MspPostInit(&htim3); HAL_TIM_MspPostInit(&htim4); HAL_TIM_MspPostInit(&htim8); } /* TIM12 init function */ void MX_TIM12_Init(uint32_t arr,uint32_t duty) { // /* USER CODE BEGIN TIM12_Init 0 */ // /* USER CODE END TIM12_Init 0 */ // TIM_ClockConfigTypeDef sClockSourceConfig = {0}; // TIM_MasterConfigTypeDef sMasterConfig = {0}; // TIM_OC_InitTypeDef sConfigOC = {0}; // /* USER CODE BEGIN TIM12_Init 1 */ // /* USER CODE END TIM12_Init 1 */ // htim12.Instance = TIM12; // htim12.Init.Prescaler = 240-1; // htim12.Init.CounterMode = TIM_COUNTERMODE_UP; // htim12.Init.Period = arr-1; // htim12.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // htim12.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; // if (HAL_TIM_Base_Init(&htim12) != HAL_OK) // { // Error_Handler(); // } // sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; // if (HAL_TIM_ConfigClockSource(&htim12, &sClockSourceConfig) != HAL_OK) // { // Error_Handler(); // } // if (HAL_TIM_PWM_Init(&htim12) != HAL_OK) // { // Error_Handler(); // } // sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; // sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; // if (HAL_TIMEx_MasterConfigSynchronization(&htim12, &sMasterConfig) != HAL_OK) // { // Error_Handler(); // } // sConfigOC.OCMode = TIM_OCMODE_PWM1; // sConfigOC.Pulse = duty; // sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; // sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; // if (HAL_TIM_PWM_ConfigChannel(&htim12, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) // { // Error_Handler(); // } // /* USER CODE BEGIN TIM12_Init 2 */ // /* USER CODE END TIM12_Init 2 */ // HAL_TIM_MspPostInit(&htim12); } /* TIM13 init function */ void MX_TIM5_Init(uint32_t time) //名为定时器5,实际上是定时器13 { /* USER CODE BEGIN TIM13_Init 0 */ uint32_t arr; arr=10000*time; /* USER CODE END TIM13_Init 0 */ /* USER CODE BEGIN TIM13_Init 1 */ /* USER CODE END TIM13_Init 1 */ htim13.Instance = TIM13; htim13.Init.Prescaler = 24000-1; htim13.Init.CounterMode = TIM_COUNTERMODE_UP; htim13.Init.Period = arr-1; htim13.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim13.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim13) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM13_Init 2 */ /* USER CODE END TIM13_Init 2 */ } /* TIM14 init function */ void MX_TIM14_Init(uint32_t arr,uint32_t duty) { /* USER CODE BEGIN TIM14_Init 0 */ /* USER CODE END TIM14_Init 0 */ TIM_OC_InitTypeDef sConfigOC = {0}; /* USER CODE BEGIN TIM14_Init 1 */ /* USER CODE END TIM14_Init 1 */ htim14.Instance = TIM14; htim14.Init.Prescaler = 240-1; htim14.Init.CounterMode = TIM_COUNTERMODE_UP; htim14.Init.Period = arr-1; htim14.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim14.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim14) != HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_Init(&htim14) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = duty; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim14, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM14_Init 2 */ /* USER CODE END TIM14_Init 2 */ HAL_TIM_MspPostInit(&htim14); } /* TIM15 init function */ void MX_TIM15_Init(uint16_t time) { /* USER CODE BEGIN TIM15_Init 0 */ uint32_t arr; arr=10000*time; /* USER CODE END TIM15_Init 0 */ TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; /* USER CODE BEGIN TIM15_Init 1 */ /* USER CODE END TIM15_Init 1 */ htim15.Instance = TIM15; htim15.Init.Prescaler = 24000-1; htim15.Init.CounterMode = TIM_COUNTERMODE_UP; htim15.Init.Period = arr-1; htim15.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim15.Init.RepetitionCounter = 0; htim15.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim15) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim15, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim15, &sMasterConfig) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM15_Init 2 */ /* USER CODE END TIM15_Init 2 */ } /* TIM16 init function */ void MX_TIM16_Init(uint16_t time) { /* USER CODE BEGIN TIM16_Init 0 */ uint32_t arr; arr=10000*time; /* USER CODE END TIM16_Init 0 */ /* USER CODE BEGIN TIM16_Init 1 */ /* USER CODE END TIM16_Init 1 */ htim16.Instance = TIM16; htim16.Init.Prescaler = 24000-1; htim16.Init.CounterMode = TIM_COUNTERMODE_UP; htim16.Init.Period = arr-1; htim16.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim16.Init.RepetitionCounter = 0; htim16.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim16) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM16_Init 2 */ /* USER CODE END TIM16_Init 2 */ } /* TIM17 init function */ void MX_TIM17_Init(uint16_t time) { /* USER CODE BEGIN TIM17_Init 0 */ uint16_t arr; arr=4000*time; /* USER CODE END TIM17_Init 0 */ /* USER CODE BEGIN TIM17_Init 1 */ /* USER CODE END TIM17_Init 1 */ htim17.Instance = TIM17; htim17.Init.Prescaler = 60000-1; htim17.Init.CounterMode = TIM_COUNTERMODE_UP; htim17.Init.Period = arr-1; htim17.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim17.Init.RepetitionCounter = 0; htim17.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim17) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM17_Init 2 */ /* USER CODE END TIM17_Init 2 */ } void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) { if(tim_baseHandle->Instance==TIM1) { /* USER CODE BEGIN TIM1_MspInit 0 */ /* USER CODE END TIM1_MspInit 0 */ /* TIM1 clock enable */ __HAL_RCC_TIM1_CLK_ENABLE(); /* USER CODE BEGIN TIM1_MspInit 1 */ /* USER CODE END TIM1_MspInit 1 */ } else if(tim_baseHandle->Instance==TIM2) { /* USER CODE BEGIN TIM2_MspInit 0 */ /* USER CODE END TIM2_MspInit 0 */ /* TIM2 clock enable */ __HAL_RCC_TIM2_CLK_ENABLE(); /* USER CODE BEGIN TIM2_MspInit 1 */ /* USER CODE END TIM2_MspInit 1 */ } else if(tim_baseHandle->Instance==TIM3) { /* USER CODE BEGIN TIM3_MspInit 0 */ /* USER CODE END TIM3_MspInit 0 */ /* TIM3 clock enable */ __HAL_RCC_TIM3_CLK_ENABLE(); /* USER CODE BEGIN TIM3_MspInit 1 */ /* USER CODE END TIM3_MspInit 1 */ } else if(tim_baseHandle->Instance==TIM4) { /* USER CODE BEGIN TIM4_MspInit 0 */ /* USER CODE END TIM4_MspInit 0 */ /* TIM4 clock enable */ __HAL_RCC_TIM4_CLK_ENABLE(); /* USER CODE BEGIN TIM4_MspInit 1 */ /* USER CODE END TIM4_MspInit 1 */ } else if(tim_baseHandle->Instance==TIM5) { /* USER CODE BEGIN TIM5_MspInit 0 */ /* USER CODE END TIM5_MspInit 0 */ /* TIM5 clock enable */ __HAL_RCC_TIM5_CLK_ENABLE(); /* USER CODE BEGIN TIM5_MspInit 1 */ /* USER CODE END TIM5_MspInit 1 */ } else if(tim_baseHandle->Instance==TIM8) { /* USER CODE BEGIN TIM8_MspInit 0 */ /* USER CODE END TIM8_MspInit 0 */ /* TIM8 clock enable */ __HAL_RCC_TIM8_CLK_ENABLE(); /* USER CODE BEGIN TIM8_MspInit 1 */ /* USER CODE END TIM8_MspInit 1 */ } else if(tim_baseHandle->Instance==TIM12) { /* USER CODE BEGIN TIM12_MspInit 0 */ /* USER CODE END TIM12_MspInit 0 */ /* TIM12 clock enable */ __HAL_RCC_TIM12_CLK_ENABLE(); /* USER CODE BEGIN TIM12_MspInit 1 */ /* USER CODE END TIM12_MspInit 1 */ } else if(tim_baseHandle->Instance==TIM13) { /* USER CODE BEGIN TIM13_MspInit 0 */ /* USER CODE END TIM13_MspInit 0 */ /* TIM13 clock enable */ __HAL_RCC_TIM13_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /* TIM13 interrupt Init */ HAL_NVIC_SetPriority(TIM8_UP_TIM13_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM8_UP_TIM13_IRQn); /* USER CODE BEGIN TIM13_MspInit 1 */ /* USER CODE END TIM13_MspInit 1 */ } else if(tim_baseHandle->Instance==TIM14) { /* USER CODE BEGIN TIM14_MspInit 0 */ /* USER CODE END TIM14_MspInit 0 */ /* TIM14 clock enable */ __HAL_RCC_TIM14_CLK_ENABLE(); /* USER CODE BEGIN TIM14_MspInit 1 */ /* USER CODE END TIM14_MspInit 1 */ } else if(tim_baseHandle->Instance==TIM15) { /* USER CODE BEGIN TIM15_MspInit 0 */ /* USER CODE END TIM15_MspInit 0 */ /* TIM15 clock enable */ __HAL_RCC_TIM15_CLK_ENABLE(); /* TIM15 interrupt Init */ HAL_NVIC_SetPriority(TIM15_IRQn, 1, 1); HAL_NVIC_EnableIRQ(TIM15_IRQn); /* USER CODE BEGIN TIM15_MspInit 1 */ /* USER CODE END TIM15_MspInit 1 */ } else if(tim_baseHandle->Instance==TIM16) { /* USER CODE BEGIN TIM16_MspInit 0 */ /* USER CODE END TIM16_MspInit 0 */ /* TIM16 clock enable */ __HAL_RCC_TIM16_CLK_ENABLE(); /* TIM16 interrupt Init */ HAL_NVIC_SetPriority(TIM16_IRQn, 1, 2); HAL_NVIC_EnableIRQ(TIM16_IRQn); /* USER CODE BEGIN TIM16_MspInit 1 */ /* USER CODE END TIM16_MspInit 1 */ } else if(tim_baseHandle->Instance==TIM17) { /* USER CODE BEGIN TIM17_MspInit 0 */ /* USER CODE END TIM17_MspInit 0 */ /* TIM17 clock enable */ __HAL_RCC_TIM17_CLK_ENABLE(); /* TIM17 interrupt Init */ HAL_NVIC_SetPriority(TIM17_IRQn, 2, 1); HAL_NVIC_EnableIRQ(TIM17_IRQn); /* USER CODE BEGIN TIM17_MspInit 1 */ /* USER CODE END TIM17_MspInit 1 */ } } void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(timHandle->Instance==TIM1) { /* USER CODE BEGIN TIM1_MspPostInit 0 */ /* USER CODE END TIM1_MspPostInit 0 */ __HAL_RCC_GPIOA_CLK_ENABLE(); /**TIM1 GPIO Configuration PA8 ------> TIM1_CH1 */ GPIO_InitStruct.Pin = GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF1_TIM1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* USER CODE BEGIN TIM1_MspPostInit 1 */ /* USER CODE END TIM1_MspPostInit 1 */ } else if(timHandle->Instance==TIM2) { /* USER CODE BEGIN TIM2_MspPostInit 0 */ /* USER CODE END TIM2_MspPostInit 0 */ __HAL_RCC_GPIOA_CLK_ENABLE(); /**TIM2 GPIO Configuration PA0 ------> TIM2_CH1 */ GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF1_TIM2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* USER CODE BEGIN TIM2_MspPostInit 1 */ /* USER CODE END TIM2_MspPostInit 1 */ } else if(timHandle->Instance==TIM3) { /* USER CODE BEGIN TIM3_MspPostInit 0 */ /* USER CODE END TIM3_MspPostInit 0 */ __HAL_RCC_GPIOB_CLK_ENABLE(); /**TIM3 GPIO Configuration PB4 (NJTRST) ------> TIM3_CH1 */ GPIO_InitStruct.Pin = GPIO_PIN_4; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF2_TIM3; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* USER CODE BEGIN TIM3_MspPostInit 1 */ /* USER CODE END TIM3_MspPostInit 1 */ } else if(timHandle->Instance==TIM4) { /* USER CODE BEGIN TIM4_MspPostInit 0 */ /* USER CODE END TIM4_MspPostInit 0 */ __HAL_RCC_GPIOD_CLK_ENABLE(); /**TIM4 GPIO Configuration PD12 ------> TIM4_CH1 */ GPIO_InitStruct.Pin = GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF2_TIM4; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); /* USER CODE BEGIN TIM4_MspPostInit 1 */ /* USER CODE END TIM4_MspPostInit 1 */ } else if(timHandle->Instance==TIM5) { /* USER CODE BEGIN TIM5_MspPostInit 0 */ /* USER CODE END TIM5_MspPostInit 0 */ __HAL_RCC_GPIOH_CLK_ENABLE(); /**TIM5 GPIO Configuration PH10 ------> TIM5_CH1 */ GPIO_InitStruct.Pin = GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF2_TIM5; HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); /* USER CODE BEGIN TIM5_MspPostInit 1 */ /* USER CODE END TIM5_MspPostInit 1 */ } else if(timHandle->Instance==TIM8) { /* USER CODE BEGIN TIM8_MspPostInit 0 */ /* USER CODE END TIM8_MspPostInit 0 */ __HAL_RCC_GPIOC_CLK_ENABLE(); /**TIM8 GPIO Configuration PC6 ------> TIM8_CH1 */ GPIO_InitStruct.Pin = GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF3_TIM8; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); /* USER CODE BEGIN TIM8_MspPostInit 1 */ /* USER CODE END TIM8_MspPostInit 1 */ } else if(timHandle->Instance==TIM12) { /* USER CODE BEGIN TIM12_MspPostInit 0 */ /* USER CODE END TIM12_MspPostInit 0 */ __HAL_RCC_GPIOB_CLK_ENABLE(); /**TIM12 GPIO Configuration PB14 ------> TIM12_CH1 */ GPIO_InitStruct.Pin = GPIO_PIN_14; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF2_TIM12; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* USER CODE BEGIN TIM12_MspPostInit 1 */ /* USER CODE END TIM12_MspPostInit 1 */ } else if(timHandle->Instance==TIM14) { /* USER CODE BEGIN TIM14_MspPostInit 0 */ /* USER CODE END TIM14_MspPostInit 0 */ __HAL_RCC_GPIOA_CLK_ENABLE(); /**TIM14 GPIO Configuration PA7 ------> TIM14_CH1 */ GPIO_InitStruct.Pin = GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF9_TIM14; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* USER CODE BEGIN TIM14_MspPostInit 1 */ /* USER CODE END TIM14_MspPostInit 1 */ } } void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) { if(tim_baseHandle->Instance==TIM1) { /* USER CODE BEGIN TIM1_MspDeInit 0 */ /* USER CODE END TIM1_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_TIM1_CLK_DISABLE(); /* USER CODE BEGIN TIM1_MspDeInit 1 */ /* USER CODE END TIM1_MspDeInit 1 */ } else if(tim_baseHandle->Instance==TIM2) { /* USER CODE BEGIN TIM2_MspDeInit 0 */ /* USER CODE END TIM2_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_TIM2_CLK_DISABLE(); /* USER CODE BEGIN TIM2_MspDeInit 1 */ /* USER CODE END TIM2_MspDeInit 1 */ } else if(tim_baseHandle->Instance==TIM3) { /* USER CODE BEGIN TIM3_MspDeInit 0 */ /* USER CODE END TIM3_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_TIM3_CLK_DISABLE(); /* USER CODE BEGIN TIM3_MspDeInit 1 */ /* USER CODE END TIM3_MspDeInit 1 */ } else if(tim_baseHandle->Instance==TIM4) { /* USER CODE BEGIN TIM4_MspDeInit 0 */ /* USER CODE END TIM4_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_TIM4_CLK_DISABLE(); /* USER CODE BEGIN TIM4_MspDeInit 1 */ /* USER CODE END TIM4_MspDeInit 1 */ } else if(tim_baseHandle->Instance==TIM5) { /* USER CODE BEGIN TIM5_MspDeInit 0 */ /* USER CODE END TIM5_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_TIM5_CLK_DISABLE(); /* USER CODE BEGIN TIM5_MspDeInit 1 */ /* USER CODE END TIM5_MspDeInit 1 */ } else if(tim_baseHandle->Instance==TIM8) { /* USER CODE BEGIN TIM8_MspDeInit 0 */ /* USER CODE END TIM8_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_TIM8_CLK_DISABLE(); /* TIM8 interrupt Deinit */ /* USER CODE BEGIN TIM8:TIM8_UP_TIM13_IRQn disable */ /** * Uncomment the line below to disable the "TIM8_UP_TIM13_IRQn" interrupt * Be aware, disabling shared interrupt may affect other IPs */ /* HAL_NVIC_DisableIRQ(TIM8_UP_TIM13_IRQn); */ /* USER CODE END TIM8:TIM8_UP_TIM13_IRQn disable */ /* USER CODE BEGIN TIM8_MspDeInit 1 */ /* USER CODE END TIM8_MspDeInit 1 */ } else if(tim_baseHandle->Instance==TIM12) { /* USER CODE BEGIN TIM12_MspDeInit 0 */ /* USER CODE END TIM12_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_TIM12_CLK_DISABLE(); /* USER CODE BEGIN TIM12_MspDeInit 1 */ /* USER CODE END TIM12_MspDeInit 1 */ } else if(tim_baseHandle->Instance==TIM13) { /* USER CODE BEGIN TIM13_MspDeInit 0 */ /* USER CODE END TIM13_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_TIM13_CLK_DISABLE(); /**TIM13 GPIO Configuration PA6 ------> TIM13_CH1 */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_6); /* TIM13 interrupt Deinit */ /* USER CODE BEGIN TIM13:TIM8_UP_TIM13_IRQn disable */ /** * Uncomment the line below to disable the "TIM8_UP_TIM13_IRQn" interrupt * Be aware, disabling shared interrupt may affect other IPs */ /* HAL_NVIC_DisableIRQ(TIM8_UP_TIM13_IRQn); */ /* USER CODE END TIM13:TIM8_UP_TIM13_IRQn disable */ /* USER CODE BEGIN TIM13_MspDeInit 1 */ /* USER CODE END TIM13_MspDeInit 1 */ } else if(tim_baseHandle->Instance==TIM14) { /* USER CODE BEGIN TIM14_MspDeInit 0 */ /* USER CODE END TIM14_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_TIM14_CLK_DISABLE(); /* USER CODE BEGIN TIM14_MspDeInit 1 */ /* USER CODE END TIM14_MspDeInit 1 */ } else if(tim_baseHandle->Instance==TIM15) { /* USER CODE BEGIN TIM15_MspDeInit 0 */ /* USER CODE END TIM15_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_TIM15_CLK_DISABLE(); /* TIM15 interrupt Deinit */ HAL_NVIC_DisableIRQ(TIM15_IRQn); /* USER CODE BEGIN TIM15_MspDeInit 1 */ /* USER CODE END TIM15_MspDeInit 1 */ } else if(tim_baseHandle->Instance==TIM16) { /* USER CODE BEGIN TIM16_MspDeInit 0 */ /* USER CODE END TIM16_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_TIM16_CLK_DISABLE(); /* TIM16 interrupt Deinit */ HAL_NVIC_DisableIRQ(TIM16_IRQn); /* USER CODE BEGIN TIM16_MspDeInit 1 */ /* USER CODE END TIM16_MspDeInit 1 */ } else if(tim_baseHandle->Instance==TIM17) { /* USER CODE BEGIN TIM17_MspDeInit 0 */ /* USER CODE END TIM17_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_TIM17_CLK_DISABLE(); /* TIM17 interrupt Deinit */ HAL_NVIC_DisableIRQ(TIM17_IRQn); /* USER CODE BEGIN TIM17_MspDeInit 1 */ /* USER CODE END TIM17_MspDeInit 1 */ } } /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ #include "demo.h" #include "tim.h" #include "usbd_cdc_if.h" #include "gpio.h" #define adc_buffer 3750 //一帧数据量 extern int16_t Buf[adc_buffer][16];//缓冲区,16个通道,每个通道3750个数 int16_t data[3]={0};//判断 extern int16_t s_volt[16];//16个通道 uint32_t cnt=0;//计数器 uint8_t res=0;//标志位 uint16_t tim13_cnt=0;//定时器13计数器 uint32_t cnt_num0=0;//真空计时的计数器 uint16_t a=0; void PWM_Init(uint16_t flag,uint32_t num,uint32_t ICG,uint32_t SH,uint32_t ICG_duty,uint32_t SH_duty) { if(flag==1) { HAL_TIM_PWM_Stop(&htim8,TIM_CHANNEL_1); HAL_TIM_PWM_Stop(&htim2,TIM_CHANNEL_1); HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_1); HAL_TIM_PWM_Stop(&htim4,TIM_CHANNEL_1); MX_TIM_Init(num,ICG,SH,ICG_duty,SH_duty); HAL_TIM_PWM_Start(&htim8,TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1); } else { MX_TIM_Init(num,ICG,SH,ICG_duty,SH_duty); HAL_TIM_PWM_Start(&htim8,TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1); } } void pwm_init(uint16_t duty1,uint16_t duty2) { HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_1); HAL_TIM_PWM_Stop(&htim5,TIM_CHANNEL_1); MX_TIM1_5_Init( duty1, duty2); } void PWM_400Hz_start(uint8_t flag) { if(flag==1) { HAL_TIM_PWM_Start(&htim12,TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim5,TIM_CHANNEL_1); HAL_GPIO_WritePin(IO_CONTROL_1_GPIO_Port, IO_CONTROL_1_Pin, GPIO_PIN_SET); } else if(flag == 2) { } else if(flag == 3) HAL_TIM_PWM_Start(&htim14,TIM_CHANNEL_1); else if(flag == 6) { HAL_TIM_PWM_Start(&htim12,TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim14,TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim5,TIM_CHANNEL_1); } } void PWM_400Hz_stop(uint8_t flag) { if(flag==1) { HAL_TIM_PWM_Stop(&htim12,TIM_CHANNEL_1); HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_1); HAL_TIM_PWM_Stop(&htim5,TIM_CHANNEL_1); __HAL_TIM_DISABLE(&htim12); HAL_GPIO_WritePin(IO_CONTROL_1_GPIO_Port, IO_CONTROL_1_Pin, GPIO_PIN_RESET); } else if(flag == 2) { } else if(flag == 3) { HAL_TIM_PWM_Stop(&htim14,TIM_CHANNEL_1); __HAL_TIM_DISABLE(&htim14); } else if(flag == 6) { HAL_TIM_PWM_Stop(&htim12,TIM_CHANNEL_1); HAL_TIM_PWM_Stop(&htim1,TIM_CHANNEL_1); HAL_TIM_PWM_Stop(&htim5,TIM_CHANNEL_1); HAL_TIM_PWM_Stop(&htim14,TIM_CHANNEL_1); __HAL_TIM_DISABLE(&htim12); __HAL_TIM_DISABLE(&htim14); __HAL_TIM_DISABLE(&htim1); __HAL_TIM_DISABLE(&htim5); HAL_GPIO_WritePin(IO_CONTROL_3_GPIO_Port, IO_CONTROL_3_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(IO_CONTROL_0_GPIO_Port, IO_CONTROL_0_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(IO_CONTROL_1_GPIO_Port, IO_CONTROL_1_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(IO_CONTROL_2_GPIO_Port, IO_CONTROL_2_Pin, GPIO_PIN_RESET); } } void version_num(uint8_t flag) { if(flag == 1) { usb_printf("该采集卡的固件版本为: 6.0(带Cache)\n"); } } void GPIO_Init(uint16_t num)//IO控制,输出高低电平 { if(num==1) { HAL_GPIO_WritePin(IO_CONTROL_0_GPIO_Port, IO_CONTROL_0_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(IO_CONTROL_3_GPIO_Port, IO_CONTROL_3_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(IO_CONTROL_2_GPIO_Port, IO_CONTROL_2_Pin, GPIO_PIN_SET); } else if(num == 0) { HAL_GPIO_WritePin(IO_CONTROL_0_GPIO_Port, IO_CONTROL_0_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(IO_CONTROL_3_GPIO_Port, IO_CONTROL_3_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(IO_CONTROL_2_GPIO_Port, IO_CONTROL_2_Pin, GPIO_PIN_RESET); } } void text_init(uint16_t flag)//开始采集 { if(flag == 1) { HAL_GPIO_WritePin(GPIOI, GPIO_PIN_6, GPIO_PIN_RESET); __HAL_TIM_ENABLE(&htim17); while(HAL_GPIO_ReadPin(GPIOI , GPIO_PIN_6) == GPIO_PIN_RESET)//当数据更新就发送出去 { if((data[0]!=Buf[3747][15])||(data[1]!=Buf[3748][15])||(data[2]!=Buf[3749][15])) { CDC_Transmit_HS((uint8_t *)Buf,3750*2*16); data[0]=Buf[3747][15]; data[1]=Buf[3748][15]; data[2]=Buf[3749][15]; } } } } void PWM400_start_init(uint16_t arr,uint16_t duty,uint8_t num)//产生400Hz PWM { uint16_t arr1; arr1=1000000/arr; pwm_init(arr1,duty); PWM_400Hz_start(num); } void caiji_init(uint8_t time,uint8_t flag1)//采集时间设置 { MX_TIM17_Init(time); //采集时间设置 text_init(flag1); } void reset_init(uint8_t flag)//复位,关闭PWM输出 { if(flag == 1) { PWM_400Hz_stop(6); } } void wendu_init(uint8_t flag)//温度输出,16路采样 { if(flag == 1) { usb_printf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",s_volt[0],s_volt[1],s_volt[2],s_volt[3],s_volt[4],s_volt[5],s_volt[6],s_volt[7] ,s_volt[8],s_volt[9],s_volt[10],s_volt[11],s_volt[12],s_volt[13],s_volt[14],s_volt[15]); } } void tim_init(uint16_t flag)//模拟看门狗 { if(flag == 1) { __HAL_TIM_ENABLE(&htim13); } } void tim_cnt(uint32_t num)//抽真空计数器 { cnt_num0=num; } void IO_contrl(uint8_t flag) //IO口外部中断,开始和关闭 { if(flag == 1) { HAL_NVIC_EnableIRQ(EXTI0_IRQn); } else if(flag == 2) { HAL_NVIC_DisableIRQ(EXTI0_IRQn); __HAL_TIM_DISABLE(&htim15); __HAL_TIM_DISABLE(&htim16); } else if(flag == 3) { HAL_GPIO_WritePin(GPIOI, GPIO_PIN_1, GPIO_PIN_SET);//泵/阀初始化为高 HAL_GPIO_WritePin(GPIOI, GPIO_PIN_2, GPIO_PIN_SET);//泵/阀初始化为高 HAL_NVIC_DisableIRQ(EXTI0_IRQn); __HAL_TIM_DISABLE(&htim15); __HAL_TIM_DISABLE(&htim16); } else if(flag == 4) { HAL_GPIO_WritePin(GPIOI, GPIO_PIN_1, GPIO_PIN_RESET);//泵/阀初始化为低 HAL_GPIO_WritePin(GPIOI, GPIO_PIN_2, GPIO_PIN_RESET);//泵/阀初始化为低 HAL_NVIC_DisableIRQ(EXTI0_IRQn); __HAL_TIM_DISABLE(&htim15); __HAL_TIM_DISABLE(&htim16); } else if(flag == 5) { if(HAL_GPIO_ReadPin(GPIOI, GPIO_PIN_0)==GPIO_PIN_RESET) //如果真空为低 { HAL_GPIO_WritePin(GPIOI, GPIO_PIN_1, GPIO_PIN_RESET); //关闭泵 HAL_GPIO_WritePin(GPIOI, GPIO_PIN_2, GPIO_PIN_RESET); //关闭阀 } else if(HAL_GPIO_ReadPin(GPIOI, GPIO_PIN_0)==GPIO_PIN_SET)//如果真空为高电平 { HAL_GPIO_WritePin(GPIOI, GPIO_PIN_1, GPIO_PIN_SET); //打开泵 HAL_GPIO_WritePin(GPIOI, GPIO_PIN_2, GPIO_PIN_SET); //打开阀 } HAL_Delay(10); IO_contrl(1); } } void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//外部中断线0回调函数,当由外部中断时开始计时,计数器期间不断有高电脉冲不影响, { //如果最后检测到外部中断电平跟触发启动定时器的电平一样,则定时器计时完保持原有状态,不一致则进行相反操作 if(GPIO_Pin==GPIO_PIN_0) { if(HAL_GPIO_ReadPin(GPIOI, GPIO_PIN_0)==GPIO_PIN_RESET) { if(HAL_GPIO_ReadPin(GPIOI, GPIO_PIN_0)==GPIO_PIN_RESET) //下降沿,低电平,关闭泵,和阀 { __HAL_TIM_ENABLE(&htim15); HAL_GPIO_WritePin(GPIOI, GPIO_PIN_5, GPIO_PIN_RESET); res=1; } } else if(HAL_GPIO_ReadPin(GPIOI, GPIO_PIN_0)==GPIO_PIN_SET) //上升沿,高电平,打开泵,和阀 { if(HAL_GPIO_ReadPin(GPIOI, GPIO_PIN_0)==GPIO_PIN_SET) { __HAL_TIM_ENABLE(&htim15); HAL_GPIO_WritePin(GPIOI, GPIO_PIN_5, GPIO_PIN_RESET); res=2; } } } if (GPIO_Pin == AD7606_BUSY_Pin)//AD7606下降沿读取8路数据一片 { AD7606_ReadNowAdc(); } } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//定时器的回调函数 { if (htim->Instance == TIM17) { HAL_GPIO_WritePin(GPIOI, GPIO_PIN_6, GPIO_PIN_SET); __HAL_TIM_DISABLE(&htim17); } else if (htim->Instance == TIM13) { HAL_GPIO_WritePin(GPIOI, GPIO_PIN_6, GPIO_PIN_SET); __HAL_TIM_DISABLE(&htim13); } else if (htim->Instance == TIM15) { if(res==1) //关闭泵,和阀 { cnt++; if(cnt==cnt_num0) //计数满60个周期,一个周期5s,60*5=300s { HAL_GPIO_WritePin(GPIOI, GPIO_PIN_1, GPIO_PIN_RESET); __HAL_TIM_DISABLE(&htim15); __HAL_TIM_ENABLE(&htim16); res=3; cnt=0; } } else if(res==2) //打开泵,和阀 { cnt++; if(cnt==cnt_num0) { HAL_GPIO_WritePin(GPIOI, GPIO_PIN_2, GPIO_PIN_SET); __HAL_TIM_DISABLE(&htim15); __HAL_TIM_ENABLE(&htim16); res=4; cnt=0; } } } else if(htim->Instance == TIM16) { if(res==3) //关闭泵,和阀 { tim13_cnt++; if(tim13_cnt==10)//计数满10个周期,一个周期3s,10*3=30s { HAL_GPIO_WritePin(GPIOI, GPIO_PIN_2, GPIO_PIN_RESET); __HAL_TIM_DISABLE(&htim16); HAL_GPIO_WritePin(GPIOI, GPIO_PIN_5, GPIO_PIN_SET); tim13_cnt=0; } } else if(res==4) //打开泵,和阀 { tim13_cnt++; if(tim13_cnt==10) { HAL_GPIO_WritePin(GPIOI, GPIO_PIN_1, GPIO_PIN_SET); __HAL_TIM_DISABLE(&htim16); HAL_GPIO_WritePin(GPIOI, GPIO_PIN_5, GPIO_PIN_SET); tim13_cnt=0; } } } } 这是我前辈的代码,帮我解析一下有关ad7606部分的代码,我need知识

uint8_t sys_stm32_clock_init(uint32_t plln, uint32_t pllm, uint32_t pllp, uint32_t pllq) { HAL_StatusTypeDef ret = HAL_OK; RCC_ClkInitTypeDef rcc_clk_init_handle; RCC_OscInitTypeDef rcc_osc_init_handle; RCC_PeriphCLKInitTypeDef rcc_periph_clk_init; HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY); /* LDOEN = 1, 使能LDO */ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0); /* VOS[1:0] = 0, 电压调节选择Scale0 */ while ((PWR->D3CR & (PWR_D3CR_VOSRDY)) != PWR_D3CR_VOSRDY); /* 等待电压稳定 */ /* 使能HSE,并选择HSE作为PLL时钟源,配置PLL1,开启HSI48时钟 */ rcc_osc_init_handle.OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI48; rcc_osc_init_handle.HSEState = RCC_HSE_ON; rcc_osc_init_handle.HSIState = RCC_HSI_OFF; rcc_osc_init_handle.CSIState = RCC_CSI_OFF; rcc_osc_init_handle.HSI48State = RCC_HSI48_ON; rcc_osc_init_handle.PLL.PLLState = RCC_PLL_ON; rcc_osc_init_handle.PLL.PLLSource = RCC_PLLSOURCE_HSE; rcc_osc_init_handle.PLL.PLLN = plln; rcc_osc_init_handle.PLL.PLLM = pllm; rcc_osc_init_handle.PLL.PLLP = pllp; rcc_osc_init_handle.PLL.PLLQ = pllq; rcc_osc_init_handle.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE; rcc_osc_init_handle.PLL.PLLRGE = RCC_PLL1VCIRANGE_2; rcc_osc_init_handle.PLL.PLLFRACN = 0; ret = HAL_RCC_OscConfig(&rcc_osc_init_handle); if (ret != HAL_OK) { return 1; } /* * 选择PLL的输出作为系统时钟 * 配置RCC_CLOCKTYPE_SYSCLK系统时钟,520M * 配置RCC_CLOCKTYPE_HCLK 时钟,260Mhz,对应AHB1,AHB2,AHB3和AHB4总线 * 配置RCC_CLOCKTYPE_PCLK1时钟,130Mhz,对应APB1总线 * 配置RCC_CLOCKTYPE_PCLK2时钟,130Mhz,对应APB2总线 * 配置RCC_CLOCKTYPE_D1PCLK1时钟,130Mhz,对应APB3总线 * 配置RCC_CLOCKTYPE_D3PCLK1时钟,130Mhz,对应APB4总线 */ rcc_clk_init_handle.ClockType = (RCC_CLOCKTYPE_SYSCLK \ | RCC_CLOCKTYPE_HCLK \ | RCC_CLOCKTYPE_PCLK1 \ | RCC_CLOCKTYPE_PCLK2 \ | RCC_CLOCKTYPE_D1PCLK1 \ | RCC_CLOCKTYPE_D3PCLK1); rcc_clk_init_handle.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; rcc_clk_init_handle.SYSCLKDivider = RCC_SYSCLK_DIV1; rcc_clk_init_handle.AHBCLKDivider = RCC_HCLK_DIV2; rcc_clk_init_handle.APB1CLKDivider = RCC_APB1_DIV2; rcc_clk_init_handle.APB2CLKDivider = RCC_APB2_DIV2; rcc_clk_init_handle.APB3CLKDivider = RCC_APB3_DIV2; rcc_clk_init_handle.APB4CLKDivider = RCC_APB4_DIV2; ret = HAL_RCC_ClockConfig(&rcc_clk_init_handle, FLASH_LATENCY_3); if (ret != HAL_OK) { return 1; } /* * 配置PLL2的R分频输出, 为220Mhz * 配置FMC时钟源是pll2_r_ck时钟 */ rcc_periph_clk_init.PeriphClockSelection = RCC_PERIPHCLK_FMC; rcc_periph_clk_init.PLL2.PLL2M = 25; rcc_periph_clk_init.PLL2.PLL2N = 440; rcc_periph_clk_init.PLL2.PLL2P = 2; rcc_periph_clk_init.PLL2.PLL2R = 2; rcc_periph_clk_init.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_0; rcc_periph_clk_init.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE; rcc_periph_clk_init.PLL2.PLL2FRACN = 0; rcc_periph_clk_init.FmcClockSelection = RCC_FMCCLKSOURCE_PLL2; ret = HAL_RCCEx_PeriphCLKConfig(&rcc_periph_clk_init); if (ret != HAL_OK) { return 1; } HAL_PWREx_EnableUSBVoltageDetector(); /* 使能USB电压电平检测器 */ __HAL_RCC_CSI_ENABLE() ; /* 使能CSI时钟, 为I/O补偿单元提供时钟 */ __HAL_RCC_SYSCFG_CLK_ENABLE() ; /* 使能SYSCFG时钟 */ HAL_EnableCompensationCell(); /* 使能I/O补偿单元 */ return 0; } #ifdef USE_FULL_ASSERT /** * @brief 当编译提示出错的时候此函数用来报告错误的文件和所在行 * @param file:指向源文件 * @param line:指向在文件中的行数 * @retval 无 */ void assert_failed(uint8_t *file, uint32_t line) { while (1) { } } #endif 通过这个判断STM32H723定时器23都是多少时钟分频的

这段代码我的定时器是0.91ms溢出,如果我希望所有的处理都是50ms时才进行,应该修改哪些地方#include “cs100a.h” #include “usart.h” #include “delay.h” #include “sg90.h” uint8_t TIM3_CH1_CAP_STA = 0; uint16_t TIM3_CH1_CAP_VAL = 0; uint16_t TIM3_Interrrupt_count = 0; TIM_HandleTypeDef TIM3_Handler; void cs100a_init(void) { GPIO_InitTypeDef GPIO_InitStructure; __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_AFIO_CLK_ENABLE(); GPIO_InitStructure.Pin = GPIO_PIN_7; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET); } void cs100a_trigger(void) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET); delay_us(15); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET); } void cs100a_start(uint8_t angle) { setSgAngle(angle); delay_ms(200); cs100a_trigger(); TIM3_CH1_CAP_STA = 0; __HAL_TIM_SET_COUNTER(&TIM3_Handler, 0); HAL_TIM_IC_Start_IT(&TIM3_Handler, TIM_CHANNEL_1); } float cs100a_getDistance(void) { if(TIM3_CH1_CAP_STA & 0X80) { uint32_t temp = TIM3_CH1_CAP_STA & 0X3F; temp = 65536;//乘10us temp += TIM3_CH1_CAP_VAL;//总的高电平时间 printf(“高电平时间为%d us\n”, temp); float cs100aDistance = (float)temp34.0/1000/2.0;//测距=时间乘声速340m/s,再除以2 printf(“cs100adistance1距离为%.1f cm\n”, cs100aDistance); HAL_TIM_IC_Stop_IT(&TIM3_Handler, TIM_CHANNEL_1); TIM3_CH1_CAP_STA = 0; return cs100aDistance; } return -1.0; } void TIM3_CH1_cap_init(uint16_t arr, uint16_t psc) { TIM_IC_InitTypeDef TIM3_CH1_ic; TIM3_Handler.Instance = TIM3; TIM3_Handler.Init.Prescaler = psc; TIM3_Handler.Init.CounterMode = TIM_COUNTERMODE_UP;//递增计数模式 TIM3_Handler.Init.Period = arr; HAL_TIM_IC_Init(&TIM3_Handler); TIM3_CH1_ic.ICPolarity = TIM_ICPOLARITY_RISING; TIM3_CH1_ic.ICSelection = TIM_ICSELECTION_DIRECTTI; TIM3_CH1_ic.ICPrescaler = TIM_ICPSC_DIV1; TIM3_CH1_ic.ICFilter = 0; HAL_TIM_IC_ConfigChannel(&TIM3_Handler, &TIM3_CH1_ic, TIM_CHANNEL_1); __HAL_TIM_ENABLE_IT(&TIM3_Handler, TIM_IT_UPDATE); HAL_TIM_IC_Start_IT(&TIM3_Handler, TIM_CHANNEL_1); } void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM3) { GPIO_InitTypeDef GPIO_InitStructure; __HAL_RCC_TIM3_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStructure.Pin = GPIO_PIN_6; GPIO_InitStructure.Mode = GPIO_MODE_INPUT; GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); HAL_NVIC_SetPriority(TIM3_IRQn, 0, 2); HAL_NVIC_EnableIRQ(TIM3_IRQn); } } void TIM3_IRQHandler(void) { HAL_TIM_IRQHandler(&TIM3_Handler); } void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM3) { TIM3_Interrrupt_count++; if(TIM3_Interrrupt_count > 55)//55次,50ms { if((TIM3_CH1_CAP_STA & 0X80) == 0) { if(TIM3_CH1_CAP_STA & 0X40) { TIM3_CH1_CAP_STA |=0X80; TIM3_CH1_CAP_VAL = HAL_TIM_ReadCapturedValue(&TIM3_Handler, TIM_CHANNEL_1); TIM_RESET_CAPTUREPOLARITY(&TIM3_Handler, TIM_CHANNEL_1); TIM_SET_CAPTUREPOLARITY(&TIM3_Handler, TIM_CHANNEL_1, TIM_ICPOLARITY_RISING); } else { TIM3_CH1_CAP_STA = 0; TIM3_CH1_CAP_VAL = 0; TIM3_CH1_CAP_STA |= 0X40; __HAL_TIM_SET_COUNTER(&TIM3_Handler, 0); TIM_RESET_CAPTUREPOLARITY(&TIM3_Handler, TIM_CHANNEL_1); TIM_SET_CAPTUREPOLARITY(&TIM3_Handler, TIM_CHANNEL_1, TIM_ICPOLARITY_FALLING); } } TIM3_Interrrupt_count =0; } } } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM3) { TIM3_Interrrupt_count ++; if(TIM3_Interrrupt_count > 55)//55次,50ms { if((TIM3_CH1_CAP_STA & 0X80) == 0) { if(TIM3_CH1_CAP_STA & 0X40) { if((TIM3_CH1_CAP_STA & 0X3F) == 0X3F) { TIM_RESET_CAPTUREPOLARITY(&TIM3_Handler, TIM_CHANNEL_1); TIM_SET_CAPTUREPOLARITY(&TIM3_Handler, TIM_CHANNEL_1, TIM_ICPOLARITY_RISING); TIM3_CH1_CAP_STA |=0X80; TIM3_CH1_CAP_VAL = 0XFFFF; } else { TIM3_CH1_CAP_STA ++; } } } } TIM3_Interrrupt_count = 0; } if(htim->Instance == TIM4) { TIM4Flag++; } }

#include "counter.h" #include "stdio.h" TIM_HandleTypeDef counter_handle = {0}; uint16_t new_count = 0; //定义两个变量存放打印的值,并决定是否更新打印的值 uint16_t old_count = 0; void counter_init(uint32_t arr, uint32_t psc)//两个参数,重装载值,预分频系数 { TIM_SlaveConfigTypeDef slave_config = {0}; counter_handle.Instance = TIM2; counter_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; counter_handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; counter_handle.Init.CounterMode = TIM_COUNTERMODE_UP; counter_handle.Init.Period = arr; counter_handle.Init.Prescaler = psc; HAL_TIM_IC_Init(&counter_handle); slave_config.SlaveMode = TIM_SLAVEMODE_EXTERNAL1; slave_config.InputTrigger = TIM_TS_TI2FP2; slave_config.TriggerFilter = 0; slave_config.TriggerPolarity = TIM_TRIGGERPOLARITY_RISING; HAL_TIM_SlaveConfigSynchro(&counter_handle ,&slave_config); HAL_TIM_IC_Start(&counter_handle, TIM_CHANNEL_2); } void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim) { if(htim -> Instance == TIM2) { __HAL_RCC_TIM2_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitTypeDef gpio_initstruct; gpio_initstruct.Mode = GPIO_MODE_AF_PP; gpio_initstruct.Pin = GPIO_PIN_1; gpio_initstruct.Pull = GPIO_NOPULL; gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH; gpio_initstruct.Alternate = GPIO_AF1_TIM2; HAL_GPIO_Init(GPIOA, &gpio_initstruct); } } void counter_get(void) { new_count = __HAL_TIM_GET_COUNTER(&counter_handle); if(old_count != new_count) { old_count = new_count; printf("CNT:%d\r\n", new_count); } }

void MX_TIM6_Init(void) { TIM_MasterConfigTypeDef sMasterConfig = {0}; htim6.Instance = TIM6; htim6.Init.Prescaler = 0; htim6.Init.CounterMode = TIM_COUNTERMODE_UP; htim6.Init.Period = 3999; htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim6) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK) { Error_Handler(); } } #include "main.h" #include "math.h" #include "dac.h" #include "dma.h" #include "tim.h" #include "gpio.h" #define M_PI 3.14159265358979323846f #define SINE_WAVE_POINTS 210 #define HSE_VALUE 8000000U volatile uint32_t freq = 100; uint16_t sineWave[SINE_WAVE_POINTS]; void Generate_SineWave(void) { float amplitude = 1242.0f; //0.5=1242 float offset = 2048.0f; for(int i=0; i<SINE_WAVE_POINTS; i++) { sineWave[i] = (uint16_t)(offset + amplitude * sin(2 * M_PI * i / SINE_WAVE_POINTS)); } HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)sineWave, SINE_WAVE_POINTS, DAC_ALIGN_12B_R); } void EXTI0_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(KEY0_Pin); if (freq > 100) freq -= 100; HAL_TIM_Base_Stop(&htim6); __HAL_TIM_SET_AUTORELOAD(&htim6, (42000000.0f / (freq * SINE_WAVE_POINTS)) - 1); __HAL_TIM_SET_COUNTER(&htim6, 0); HAL_TIM_Base_Start(&htim6); HAL_DAC_Stop_DMA(&hdac, DAC_CHANNEL_1); HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)sineWave, SINE_WAVE_POINTS, DAC_ALIGN_12B_R); } void EXTI4_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(KEY_UP_Pin); if (freq < 10000) freq += 100; HAL_TIM_Base_Stop(&htim6); __HAL_TIM_SET_AUTORELOAD(&htim6, (42000000.0f / (freq * SINE_WAVE_POINTS)) - 1); __HAL_TIM_SET_COUNTER(&htim6, 0); HAL_TIM_Base_Start(&htim6); HAL_DAC_Stop_DMA(&hdac, DAC_CHANNEL_1); HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)sineWave, SINE_WAVE_POINTS, DAC_ALIGN_12B_R); } void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { } void SystemClock_Config(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_TIM6_Init(); HAL_TIM_Base_Start(&htim6); MX_GPIO_Init(); MX_DMA_Init(); MX_DAC_Init(); Generate_SineWave(); while (1) { } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 8; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 4; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { Error_Handler(); } }外部振晶为8mhz,为什么按键按下,正弦波频率无法以100hz的步进改变,给出详细的解决办法,并优化代码

#include "tim\bsp_tim.h" TIM_HandleTypeDef htim3; TIM_HandleTypeDef htim4; /* TIM3 init function */ void MX_TIM3_Init(void) { /* USER CODE BEGIN TIM3_Init 0 */ /* USER CODE END TIM3_Init 0 */ TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; /* USER CODE BEGIN TIM3_Init 1 */ /* USER CODE END TIM3_Init 1 */ htim3.Instance = TIM3; htim3.Init.Prescaler = 72-1; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 100-1; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim3) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM3_Init 2 */ /* USER CODE END TIM3_Init 2 */ } /* TIM4 init function */ void MX_TIM4_Init(void) { /* USER CODE BEGIN TIM4_Init 0 */ /* USER CODE END TIM4_Init 0 */ TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; /* USER CODE BEGIN TIM4_Init 1 */ /* USER CODE END TIM4_Init 1 */ htim4.Instance = TIM4; htim4.Init.Prescaler = 72-1; htim4.Init.CounterMode = TIM_COUNTERMODE_UP; htim4.Init.Period = 10000-1; htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim4) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM4_Init 2 */ /* USER CODE END TIM4_Init 2 */ } void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) { if(tim_baseHandle->Instance==TIM3) { /* USER CODE BEGIN TIM3_MspInit 0 */ /* USER CODE END TIM3_MspInit 0 */ /* TIM3 clock enable */ __HAL_RCC_TIM3_CLK_ENABLE(); /* TIM3 interrupt Init */ HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM3_IRQn); /* USER CODE BEGIN TIM3_MspInit 1 */ /* USER CODE END TIM3_MspInit 1 */ } else if(tim_baseHandle->Instance==TIM4) { /* USER CODE BEGIN TIM4_MspInit 0 */ /* USER CODE END TIM4_MspInit 0 */ /* TIM4 clock enable */ __HAL_RCC_TIM4_CLK_ENABLE(); /* TIM4 interrupt Init */ HAL_NVIC_SetPriority(TIM4_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM4_IRQn); /* USER CODE BEGIN TIM4_MspInit 1 */ /* USER CODE END TIM4_MspInit 1 */ } } void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) { if(tim_baseHandle->Instance==TIM3) { /* USER CODE BEGIN TIM3_MspDeInit 0 */ /* USER CODE END TIM3_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_TIM3_CLK_DISABLE(); /* TIM3 interrupt Deinit */ HAL_NVIC_DisableIRQ(TIM3_IRQn); /* USER CODE BEGIN TIM3_MspDeInit 1 */ /* USER CODE END TIM3_MspDeInit 1 */ } else if(tim_baseHandle->Instance==TIM4) { /* USER CODE BEGIN TIM4_MspDeInit 0 */ /* USER CODE END TIM4_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_TIM4_CLK_DISABLE(); /* TIM4 interrupt Deinit */ HAL_NVIC_DisableIRQ(TIM4_IRQn); /* USER CODE BEGIN TIM4_MspDeInit 1 */ /* USER CODE END TIM4_MspDeInit 1 */ } } 这是cubmx配置的定时器和adc#include "adc\bsp_adc.h" char adc_text[30]; uint16_t dma_i = 0; uint16_t adc1_val_buf[ADC1_CHANNEL_CNT * ADC1_CHANNEL_FRE]; //传递给DMA存放多通道采样值的数组 uint32_t adc1_aver_val[ADC1_CHANNEL_CNT] = {0}; //计算多通道的平均采样值的过程数组 uint16_t value[ADC1_CHANNEL_CNT] = {0}; //多通道的平均采样值的数组 double adc_value[ADC1_CHANNEL_CNT] = {0}; //转换为0-3.3V的电压 uint16_t value_max[ADC1_CHANNEL_CNT] = {0}; bool DMA_flag = 0; ADC_HandleTypeDef hadc1; DMA_HandleTypeDef hdma_adc1; /* ADC1 init function */ void MX_ADC1_Init(void) { /* USER CODE BEGIN ADC1_Init 0 */ /* USER CODE END ADC1_Init 0 */ ADC_ChannelConfTypeDef sConfig = {0}; /* USER CODE BEGIN ADC1_Init 1 */ /* USER CODE END ADC1_Init 1 */ /** Common config */ hadc1.Instance = ADC1; hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; hadc1.Init.ContinuousConvMode = ENABLE; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T3_TRGO; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion = 1; if (HAL_ADC_Init(&hadc1) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_1; sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN ADC1_Init 2 */ /* USER CODE END ADC1_Init 2 */ } void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(adcHandle->Instance==ADC1) { /* USER CODE BEGIN ADC1_MspInit 0 */ /* USER CODE END ADC1_MspInit 0 */ /* ADC1 clock enable */ __HAL_RCC_ADC1_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /**ADC1 GPIO Configuration PA1 ------> ADC1_IN1 */ GPIO_InitStruct.Pin = GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* ADC1 DMA Init */ /* ADC1 Init */ hdma_adc1.Instance = DMA1_Channel1; hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE; hdma_adc1.Init.MemInc = DMA_MINC_ENABLE; hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; hdma_adc1.Init.Mode = DMA_NORMAL; hdma_adc1.Init.Priority = DMA_PRIORITY_MEDIUM; if (HAL_DMA_Init(&hdma_adc1) != HAL_OK) { Error_Handler(); } __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1); /* USER CODE BEGIN ADC1_MspInit 1 */ /* USER CODE END ADC1_MspInit 1 */ } } void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle) { if(adcHandle->Instance==ADC1) { /* USER CODE BEGIN ADC1_MspDeInit 0 */ /* USER CODE END ADC1_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_ADC1_CLK_DISABLE(); /**ADC1 GPIO Configuration PA1 ------> ADC1_IN1 */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1); /* ADC1 DMA DeInit */ HAL_DMA_DeInit(adcHandle->DMA_Handle); /* USER CODE BEGIN ADC1_MspDeInit 1 */ /* USER CODE END ADC1_MspDeInit 1 */ } } void MX_DMA_Init(void) { /* DMA controller clock enable */ __HAL_RCC_DMA1_CLK_ENABLE(); /* DMA interrupt init */ /* DMA1_Channel1_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); } //0-3.3v 对应0-3300 double get_adc(ADC_HandleTypeDef *pin) { uint16_t adc; HAL_ADC_Start(pin); adc = HAL_ADC_GetValue(pin); return ((double)adc * 3.3 / 4000) * 1000; } void ADC_Sample_Start(void) { //DMA ADC采集 if(HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&adc1_val_buf,(ADC1_CHANNEL_CNT * ADC1_CHANNEL_FRE)) != HAL_OK) { Error_Handler(); } } void ADC_Process(void) { //处理DMA数据 for(dma_i = 0;dma_i < ADC1_CHANNEL_CNT;dma_i++) { adc1_aver_val[dma_i] = 0; } //在采样值数组中分别取出每个通道的采样值并求和 for(dma_i = 0;dma_i < ADC1_CHANNEL_FRE;dma_i++) { adc1_aver_val[0] += adc1_val_buf[dma_i * ADC1_CHANNEL_CNT+0]; // adc1_aver_val[1] += adc1_val_buf[dma_i * ADC1_CHANNEL_CNT+1]; // adc1_aver_val[2] += adc1_val_buf[dma_i * ADC1_CHANNEL_CNT+2]; } //依次对每个通道采样值求平均值 for(dma_i = 0;dma_i < ADC1_CHANNEL_CNT;dma_i++) { value[dma_i] = adc1_aver_val[dma_i] / ADC1_CHANNEL_FRE; adc_value[dma_i] = (double)value[dma_i] * 3.3 / 4027 ; } } void Get_adc_value(void) //定时器触发 { //1、等待转换结束 HAL_ADC_PollForConversion(&hadc1,HAL_MAX_DELAY); //2、读取转换结果 uint16_t dr = HAL_ADC_GetValue(&hadc1); //3、转换电压 float voltage = dr * 3.3f / 4095.0f; //4、将数据从串口发送结果 sprintf(adc_text,"%.3f\n",voltage); HAL_UART_Transmit(&huart2,(uint8_t *)adc_text,strlen(adc_text),50); }

#include "stm32f4xx_hal.h" // 硬件引脚定义 (根据实际电路修改) #define TRIG_PIN GPIO_PIN_0 #define TRIG_PORT GPIOA #define ECHO_PIN GPIO_PIN_1 #define ECHO_PORT GPIOA #define RELAY_PIN GPIO_PIN_2 #define RELAY_PORT GPIOB // 阈值定义 #define OBSTACLE_DISTANCE_CM 2 // 障碍物检测阈值2cm #define TIMEOUT_MS 60000 // 60秒超时(1分钟) // 全局变量 TIM_HandleTypeDef htim2; volatile uint32_t pulseStart = 0, pulseEnd = 0; volatile uint32_t lastDetectionTime = 0; volatile uint8_t echoFlag = 0; // 函数声明 void SystemClock_Config(void); void MX_GPIO_Init(void); void MX_TIM2_Init(void); float Get_Distance(void); void Control_Relay(uint8_t state); void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim); int main(void) { // HAL库初始化 HAL_Init(); // 系统时钟配置(168MHz HSE) SystemClock_Config(); // GPIO初始化 MX_GPIO_Init(); // TIM2初始化(用于超声波计时) MX_TIM2_Init(); // 启动TIM2输入捕获 HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); // 使能ECHO引脚的外部中断 HAL_NVIC_SetPriority(EXTI1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI1_IRQn); // 初始化时间戳 lastDetectionTime = HAL_GetTick(); while (1) { float distance = Get_Distance(); // 获取距离 uint32_t currentTime = HAL_GetTick(); if (distance > 0 && distance <= OBSTACLE_DISTANCE_CM) { // 检测到障碍物:闭合继电器并更新时间戳 Control_Relay(1); lastDetectionTime = currentTime; HAL_Delay(100); // 短暂延时避免频繁触发 } else if (currentTime - lastDetectionTime >= TIMEOUT_MS) { // 超时60秒:断开继电器 Control_Relay(0); } HAL_Delay(50); // 主循环延时 } } // 获取超声波距离 float Get_Distance(void) { // 发送10us触发脉冲 HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_SET); HAL_Delay(1); // 延时1us (实际约10us) HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_RESET); // 重置ECHO标志 echoFlag = 0; pulseStart = pulseEnd = 0; // 等待ECHO信号开始 uint32_t timeout = HAL_GetTick(); while (HAL_GPIO_ReadPin(ECHO_PORT, ECHO_PIN) == GPIO_PIN_RESET) { if (HAL_GetTick() - timeout > 50) return -1; // 超时返回错误 } // 启动定时器 __HAL_TIM_SET_COUNTER(&htim2, 0); // 等待ECHO信号结束 timeout = HAL_GetTick(); while (HAL_GPIO_ReadPin(ECHO_PORT, ECHO_PIN) == GPIO_PIN_SET) { if (HAL_GetTick() - timeout > 50) return -1; // 超时返回错误 } // 获取高电平持续时间(us) uint32_t pulseTime = __HAL_TIM_GET_COUNTER(&htim2); // 计算距离(cm): 声速343m/s (34300cm/s) = 0.0343cm/us return (pulseTime * 0.0343) / 2; // 除以2是因为往返时间 } // 继电器控制 void Control_Relay(uint8_t state) { HAL_GPIO_WritePin(RELAY_PORT, RELAY_PIN, state ? GPIO_PIN_SET : GPIO_PIN_RESET); } // 系统时钟配置(168MHz HSE) void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; // 配置主PLL RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 8; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 7; HAL_RCC_OscConfig(&RCC_OscInitStruct); // 配置CPU、APB1、APB2时钟 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5); // 配置Systick 1ms中断 HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); } // GPIO初始化 void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; // 启用时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); // TRIG引脚配置(输出) GPIO_InitStruct.Pin = TRIG_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(TRIG_PORT, &GPIO_InitStruct); // ECHO引脚配置(输入+外部中断) GPIO_InitStruct.Pin = ECHO_PIN; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(ECHO_PORT, &GPIO_InitStruct); // 继电器控制引脚配置(输出) GPIO_InitStruct.Pin = RELAY_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(RELAY_PORT, &GPIO_InitStruct); // 初始状态 HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_RESET); HAL_GPIO_WritePin(RELAY_PORT, RELAY_PIN, GPIO_PIN_RESET); } // TIM2初始化(1us精度) void MX_TIM2_Init(void) { __HAL_RCC_TIM2_CLK_ENABLE(); htim2.Instance = TIM2; htim2.Init.Prescaler = 84-1; // 84MHz/84 = 1MHz (1us) htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 0xFFFFFFFF; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_IC_Init(&htim2); // 输入捕获配置 TIM_IC_InitTypeDef sConfigIC = {0}; sConfigIC.ICPolarity = TIM_ICPOLARITY_RISING; sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; sConfigIC.ICFilter = 0; HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1); // 开启TIM2中断 HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM2_IRQn); } // ECHO引脚外部中断处理 void EXTI1_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(ECHO_PIN); } // 外部中断回调 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == ECHO_PIN) { if (HAL_GPIO_ReadPin(ECHO_PORT, ECHO_PIN) == GPIO_PIN_SET) { // 上升沿:开始计时 __HAL_TIM_SET_COUNTER(&htim2, 0); } else { // 下降沿:标记结束 echoFlag = 1; } } } // Systick错误处理 void HAL_SYSTICK_Callback(void) { // 可添加系统时钟错误处理 } // TIM2中断处理 void TIM2_IRQHandler(void) { HAL_TIM_IRQHandler(&htim2); } 基于这个配置stm32f407的gpio

// GPIO初始化 static void Moto_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; // UartSendString(&huart6, "GPIO初始化\r\n"); // 使能时钟 __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_TIM1_CLK_ENABLE(); // 原点引脚(UHOME)配置(低电平有效,上拉输入) GPIO_InitStruct.Pin = MOTO_UHOME_PIN; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM; HAL_GPIO_Init(MOTO_UHOME_PORT, &GPIO_InitStruct); // 步进脉冲引脚(上升沿触发) GPIO_InitStruct.Pin = MOTO_STEP_PIN; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Alternate = GPIO_AF1_TIM1; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(MOTO_STEP_PORT, &GPIO_InitStruct); // 控制引脚配置 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM; GPIO_InitStruct.Pull = GPIO_NOPULL; // 使能引脚 GPIO_InitStruct.Pin = MOTO_NENBL_PIN; HAL_GPIO_Init(MOTO_NENBL_PORT, &GPIO_InitStruct); // 方向引脚 GPIO_InitStruct.Pin = MOTO_DIR_PIN; HAL_GPIO_Init(MOTO_DIR_PORT, &GPIO_InitStruct); // 细分控制引脚 GPIO_InitStruct.Pin = MOTO_M0_PIN; HAL_GPIO_Init(MOTO_M0_PORT, &GPIO_InitStruct); GPIO_InitStruct.Pin = MOTO_M1_PIN | MOTO_M2_PIN; HAL_GPIO_Init(MOTO_M1_PORT, &GPIO_InitStruct); // 复位引脚 GPIO_InitStruct.Pin = MOTO_NRSET_PIN; HAL_GPIO_Init(MOTO_NRSET_PORT, &GPIO_InitStruct); // 睡眠引脚 GPIO_InitStruct.Pin = MOTO_NSLEEP_PIN; HAL_GPIO_Init(MOTO_NSLEEP_PORT, &GPIO_InitStruct); // 衰减模式引脚(开漏输出) GPIO_InitStruct.Pin = MOTO_DECAY_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; HAL_GPIO_Init(MOTO_DECAY_PORT, &GPIO_InitStruct); // 故障引脚(NFAULT,低电平有效) GPIO_InitStruct.Pin = MOTO_NFAULT_PIN; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(MOTO_NFAULT_PORT, &GPIO_InitStruct); } // 定时器初始化 void Moto_TIM_Init(void) { //UartSendString(&huart6, "TIM1初始化\r\n"); TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; __HAL_RCC_TIM1_CLK_ENABLE(); htim_step.Instance = TIM1; htim_step.Init.Prescaler = 83; // 84MHz / 84 = 1MHz htim_step.Init.Period = 999; // 默认1kHz htim_step.Init.CounterMode = TIM_COUNTERMODE_UP; htim_step.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim_step.Init.RepetitionCounter = 0; htim_step.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; if (HAL_TIM_Base_Init(&htim_step) != HAL_OK) Error_Handler(); sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; HAL_TIM_ConfigClockSource(&htim_step, &sClockSourceConfig); HAL_TIM_PWM_Init(&htim_step); sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim_step, &sMasterConfig); HAL_NVIC_EnableIRQ(TIM1_CC_IRQn); // PWM配置(上升沿触发) sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 700; // 窄脉冲确保上升沿有效 sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_ENABLE; HAL_TIM_PWM_Start_IT(&htim_step, TIM_CHANNEL_1); // 启动PWM并使能中断 __HAL_TIM_MOE_ENABLE(&htim_step); __HAL_TIM_ENABLE_IT(&htim_step, TIM_IT_UPDATE); // 使能更新中断 if (HAL_TIM_PWM_ConfigChannel(&htim_step, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) Error_Handler(); HAL_TIM_PWM_Start(&htim_step, TIM_CHANNEL_1); // 启动通道1 PWM输出 // 注册PWM完成回调 #if defined(HAL_TIM_PWM_REGISTER_CALLBACKS) HAL_TIM_PWM_RegisterCallback(&htim_step, HAL_TIM_PWM_PULSE_FINISHED_CB_ID, HAL_TIM_PWM_PulseFinishedCallback); #endif }

/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * Copyright (c) 2025 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "adc.h" #include "tim.h" #include "gpio.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ #define TRIG_PULSE_WIDTH 10 // 10us触发脉冲 #define MEASURE_TIMEOUT 30 // 30ms测量超时 /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ volatile uint32_t icVal1 = 0, icVal2 = 0; volatile uint8_t isFirstCaptured = 0; volatile float distance_cm = 0; int Turn_Pwm = 0; uint8_t stop_flag = 0; // 停止标志位 uint8_t void_flag = 0; // 停止标志位 float feature_time = 0; // 特征区域经过时间 int baoguang_count=10; float dis = 0; // 存放测距距离 int main_count=5; /* USER CODE BEGIN PV */ typedef enum { US_IDLE, US_TRIGGER_START, US_WAIT_ECHO } US_State_t; volatile US_State_t us_state = US_IDLE; volatile uint32_t us_trigger_time = 0; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ void trigger_ultrasonic_non_blocking() { if (us_state == US_IDLE) { HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_4); // 启动TIM2 PWM触发脉冲 us_state = US_WAIT_ECHO; us_trigger_time = HAL_GetTick(); }} void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim); float calibration(float raw_cm); float median_filter(float new_val); void trigger_ultrasonic(); void delay_us(uint16_t us); void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim); /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* 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_TIM3_Init(); MX_TIM4_Init(); MX_TIM1_Init(); MX_TIM2_Init(); /* USER CODE BEGIN 2 */ HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_4); HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2); HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_4); // 启动TIM2 PWM HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_1); // 启动TIM1输入捕获中断 // HAL_Delay(3000); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { if (us_state == US_WAIT_ECHO) { // 超时检测(30ms未收到回波) if (HAL_GetTick() - us_trigger_time > MEASURE_TIMEOUT) { us_state = US_IDLE; } } static uint32_t last_measure = 0; if (HAL_GetTick() - last_measure >= 100 && us_state == US_IDLE) { trigger_ultrasonic_non_blocking(); last_measure = HAL_GetTick(); } /* 距离数据处理 --------------------------------------- */ static float filtered_distance = 0; filtered_distance = median_filter(distance_cm); filtered_distance = calibration(filtered_distance); if(filtered_distance < 10.0f) {HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET); } // if (main_count>5){ // // // dis = get_distance(); // if(dis < 20.0) { // 距离小于20cm亮灯 // void_flag = 1;} // main_count=0; // } int pwmVal_R = 200; int pwmVal_L = 200; RD_TSL(baoguang_count); Find_CCD_Zhongzhi(); // 计算特征区域经过时间(假设采样频率为100Hz) if (main_count>5){ feature_time = ccd_data_process(ADV, 50.0f); // 检查是否达到积分阈值 if (feature_time >= INTEGRATION_THRESHOLD) { stop_flag = 1; }} if (main_count>50000){ main_count=50000; } if (!stop_flag) { Turn_Pwm = turn(CCD_Zhongzhi, 0); // 右侧电机控制 if (pwmVal_R - Turn_Pwm > 0) { HAL_GPIO_WritePin(GPIOA, R1_Pin, 1); HAL_GPIO_WritePin(GPIOA, R2_Pin, 0); __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2, pwmVal_R - Turn_Pwm); } else if (pwmVal_R - Turn_Pwm < 0) { HAL_GPIO_WritePin(GPIOA, R1_Pin, 0); HAL_GPIO_WritePin(GPIOA, R2_Pin, 1); __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2, -pwmVal_R + Turn_Pwm); } else { HAL_GPIO_WritePin(GPIOA, R1_Pin, 0); HAL_GPIO_WritePin(GPIOA, R2_Pin, 0); } // 左侧电机控制 if (pwmVal_L + Turn_Pwm > 0) { HAL_GPIO_WritePin(GPIOA, L1_Pin, 1); HAL_GPIO_WritePin(GPIOA, L2_Pin, 0); __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_4, pwmVal_L + Turn_Pwm); } else if (pwmVal_L + Turn_Pwm < 0) { HAL_GPIO_WritePin(GPIOA, L1_Pin, 0); HAL_GPIO_WritePin(GPIOA, L2_Pin, 1); __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_4, -pwmVal_L - Turn_Pwm); } else { HAL_GPIO_WritePin(GPIOA, L1_Pin, 0); HAL_GPIO_WritePin(GPIOA, L2_Pin, 0); } } else if(void_flag==1){ HAL_GPIO_WritePin(GPIOA, R1_Pin, 1); HAL_GPIO_WritePin(GPIOA, R2_Pin, 0); HAL_GPIO_WritePin(GPIOA, L1_Pin, 1); HAL_GPIO_WritePin(GPIOA, L2_Pin, 0); __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_4, 350); __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2,100);//右边 HAL_Delay(300); __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2, 350);//右边 __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_4,100); HAL_Delay(300); __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2, 220);//右边 __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_4,200); HAL_Delay(100); __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2, 350);//右边 __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_4,100); HAL_Delay(300); __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_4, 350); __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2,100);//右边 HAL_Delay(290); stop_flag = 0; // __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2, -pwmVal_R); // __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_4, pwmVal_L); } else { static uint8_t is_first_run = 1; // 首次运行标志 if (is_first_run) { HAL_GPIO_WritePin(GPIOA, R1_Pin, 1); HAL_GPIO_WritePin(GPIOA, R2_Pin, 0); HAL_GPIO_WritePin(GPIOA, L1_Pin, 1); HAL_GPIO_WritePin(GPIOA, L2_Pin, 0); __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2, 210);//右边 __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_4,200); HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET); HAL_Delay(400); is_first_run = 0; // 清除首次标志 } // 停止小车 HAL_GPIO_WritePin(GPIOA, R1_Pin, 1); HAL_GPIO_WritePin(GPIOA, R2_Pin, 1); HAL_GPIO_WritePin(GPIOA, L1_Pin, 1); HAL_GPIO_WritePin(GPIOA, L2_Pin, 1); __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_4, 0); __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2, 0); } Dly_us(); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL4; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) { Error_Handler(); } PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC; PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { Error_Handler(); } } /* USER CODE BEGIN 4 */ void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM1 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) { if (us_state == US_WAIT_ECHO) { // 仅处理等待回波状态 if (!isFirstCaptured) { icVal1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); isFirstCaptured = 1; __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING); } else { icVal2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); uint32_t diff = (icVal2 > icVal1) ? (icVal2 - icVal1) : (0xFFFF - icVal1 + icVal2); distance_cm = diff * 0.034f / 2; isFirstCaptured = 0; __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING); us_state = US_IDLE; // 测量完成,回到空闲状态 } } } } /* 精准延时函数 */ void delay_us(uint16_t us) { __HAL_TIM_SET_COUNTER(&htim4, 0); while (__HAL_TIM_GET_COUNTER(&htim4) < us); } /* 中值滤波函数 */ #define FILTER_SIZE 5 float median_filter(float new_val) { static float buffer[FILTER_SIZE] = {0}; static uint8_t index = 0; float temp[FILTER_SIZE]; buffer[index] = new_val; index = (index + 1) % FILTER_SIZE; memcpy(temp, buffer, sizeof(temp)); // 冒泡排序 for(int i=0; i<FILTER_SIZE-1; i++){ for(int j=0; j<FILTER_SIZE-i-1; j++){ if(temp[j] > temp[j+1]){ float swap = temp[j]; temp[j] = temp[j+1]; temp[j+1] = swap; } } } return temp[FILTER_SIZE/2]; } /* 校准函数 */ float calibration(float raw_cm) { // 校准点配置(根据实测数据修改) const float calib_table[2][2] = {{15.0, 15.3}, {50.0, 49.7}}; if(raw_cm <= calib_table[0][0]) return raw_cm + (calib_table[0][1] - calib_table[0][0]); if(raw_cm >= calib_table[1][0]) return raw_cm + (calib_table[1][1] - calib_table[1][0]); float k = (calib_table[1][1]-calib_table[0][1]) / (calib_table[1][0]-calib_table[0][0]); return k * (raw_cm - calib_table[0][0]) + calib_table[0][1]; } /* USER CODE END 4 */ /** * @brief This function is executed in case of error occurrence. * @retval None */ void Error_Handler(void) { /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ __disable_irq(); while (1) { } /* USER CODE END Error_Handler_Debug */ } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t *file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */ /* USER CODE BEGIN Header */ /** ****************************************************************************** * @file tim.c * @brief This file provides code for the configuration * of the TIM instances. ****************************************************************************** * @attention * * Copyright (c) 2025 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "tim.h" /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ TIM_HandleTypeDef htim1; TIM_HandleTypeDef htim2; TIM_HandleTypeDef htim3; TIM_HandleTypeDef htim4; /* TIM1 init function */ void MX_TIM1_Init(void) { /* USER CODE BEGIN TIM1_Init 0 */ /* USER CODE END TIM1_Init 0 */ TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_IC_InitTypeDef sConfigIC = {0}; /* USER CODE BEGIN TIM1_Init 1 */ /* USER CODE END TIM1_Init 1 */ htim1.Instance = TIM1; htim1.Init.Prescaler = 39; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 65535; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter = 0; htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_IC_Init(&htim1) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING; sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; sConfigIC.ICFilter = 0; if (HAL_TIM_IC_ConfigChannel(&htim1, &sConfigIC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM1_Init 2 */ /* USER CODE END TIM1_Init 2 */ } /* TIM2 init function */ void MX_TIM2_Init(void) { /* USER CODE BEGIN TIM2_Init 0 */ /* USER CODE END TIM2_Init 0 */ TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; /* USER CODE BEGIN TIM2_Init 1 */ /* USER CODE END TIM2_Init 1 */ htim2.Instance = TIM2; htim2.Init.Prescaler = 19; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 9; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; if (HAL_TIM_Base_Init(&htim2) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_Init(&htim2) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 10; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_4) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM2_Init 2 */ /* USER CODE END TIM2_Init 2 */ HAL_TIM_MspPostInit(&htim2); } /* TIM3 init function */ void MX_TIM3_Init(void) { /* USER CODE BEGIN TIM3_Init 0 */ /* USER CODE END TIM3_Init 0 */ TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; /* USER CODE BEGIN TIM3_Init 1 */ /* USER CODE END TIM3_Init 1 */ htim3.Instance = TIM3; htim3.Init.Prescaler = 0; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 499; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim3) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_Init(&htim3) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM3_Init 2 */ /* USER CODE END TIM3_Init 2 */ HAL_TIM_MspPostInit(&htim3); } /* TIM4 init function */ void MX_TIM4_Init(void) { /* USER CODE BEGIN TIM4_Init 0 */ /* USER CODE END TIM4_Init 0 */ TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; /* USER CODE BEGIN TIM4_Init 1 */ /* USER CODE END TIM4_Init 1 */ htim4.Instance = TIM4; htim4.Init.Prescaler = 19; htim4.Init.CounterMode = TIM_COUNTERMODE_UP; htim4.Init.Period = 65535; htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim4) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM4_Init 2 */ /* USER CODE END TIM4_Init 2 */ } void HAL_TIM_IC_MspInit(TIM_HandleTypeDef* tim_icHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(tim_icHandle->Instance==TIM1) { /* USER CODE BEGIN TIM1_MspInit 0 */ /* USER CODE END TIM1_MspInit 0 */ /* TIM1 clock enable */ __HAL_RCC_TIM1_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /**TIM1 GPIO Configuration PA8 ------> TIM1_CH1 */ GPIO_InitStruct.Pin = ECHO_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(ECHO_GPIO_Port, &GPIO_InitStruct); /* TIM1 interrupt Init */ HAL_NVIC_SetPriority(TIM1_CC_IRQn, 3, 0); HAL_NVIC_EnableIRQ(TIM1_CC_IRQn); /* USER CODE BEGIN TIM1_MspInit 1 */ /* USER CODE END TIM1_MspInit 1 */ } } void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) { if(tim_baseHandle->Instance==TIM2) { /* USER CODE BEGIN TIM2_MspInit 0 */ /* USER CODE END TIM2_MspInit 0 */ /* TIM2 clock enable */ __HAL_RCC_TIM2_CLK_ENABLE(); /* TIM2 interrupt Init */ HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM2_IRQn); /* USER CODE BEGIN TIM2_MspInit 1 */ /* USER CODE END TIM2_MspInit 1 */ } else if(tim_baseHandle->Instance==TIM3) { /* USER CODE BEGIN TIM3_MspInit 0 */ /* USER CODE END TIM3_MspInit 0 */ /* TIM3 clock enable */ __HAL_RCC_TIM3_CLK_ENABLE(); /* USER CODE BEGIN TIM3_MspInit 1 */ /* USER CODE END TIM3_MspInit 1 */ } else if(tim_baseHandle->Instance==TIM4) { /* USER CODE BEGIN TIM4_MspInit 0 */ /* USER CODE END TIM4_MspInit 0 */ /* TIM4 clock enable */ __HAL_RCC_TIM4_CLK_ENABLE(); /* TIM4 interrupt Init */ HAL_NVIC_SetPriority(TIM4_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM4_IRQn); /* USER CODE BEGIN TIM4_MspInit 1 */ /* USER CODE END TIM4_MspInit 1 */ } } void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(timHandle->Instance==TIM2) { /* USER CODE BEGIN TIM2_MspPostInit 0 */ /* USER CODE END TIM2_MspPostInit 0 */ __HAL_RCC_GPIOA_CLK_ENABLE(); /**TIM2 GPIO Configuration PA3 ------> TIM2_CH4 */ GPIO_InitStruct.Pin = TRIG_Pin; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(TRIG_GPIO_Port, &GPIO_InitStruct); /* USER CODE BEGIN TIM2_MspPostInit 1 */ /* USER CODE END TIM2_MspPostInit 1 */ } else if(timHandle->Instance==TIM3) { /* USER CODE BEGIN TIM3_MspPostInit 0 */ /* USER CODE END TIM3_MspPostInit 0 */ __HAL_RCC_GPIOB_CLK_ENABLE(); /**TIM3 GPIO Configuration PB1 ------> TIM3_CH4 PB5 ------> TIM3_CH2 */ GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); __HAL_AFIO_REMAP_TIM3_PARTIAL(); /* USER CODE BEGIN TIM3_MspPostInit 1 */ /* USER CODE END TIM3_MspPostInit 1 */ } } void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef* tim_icHandle) { if(tim_icHandle->Instance==TIM1) { /* USER CODE BEGIN TIM1_MspDeInit 0 */ /* USER CODE END TIM1_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_TIM1_CLK_DISABLE(); /**TIM1 GPIO Configuration PA8 ------> TIM1_CH1 */ HAL_GPIO_DeInit(ECHO_GPIO_Port, ECHO_Pin); /* TIM1 interrupt Deinit */ HAL_NVIC_DisableIRQ(TIM1_CC_IRQn); /* USER CODE BEGIN TIM1_MspDeInit 1 */ /* USER CODE END TIM1_MspDeInit 1 */ } } void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) { if(tim_baseHandle->Instance==TIM2) { /* USER CODE BEGIN TIM2_MspDeInit 0 */ /* USER CODE END TIM2_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_TIM2_CLK_DISABLE(); /* TIM2 interrupt Deinit */ HAL_NVIC_DisableIRQ(TIM2_IRQn); /* USER CODE BEGIN TIM2_MspDeInit 1 */ /* USER CODE END TIM2_MspDeInit 1 */ } else if(tim_baseHandle->Instance==TIM3) { /* USER CODE BEGIN TIM3_MspDeInit 0 */ /* USER CODE END TIM3_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_TIM3_CLK_DISABLE(); /* USER CODE BEGIN TIM3_MspDeInit 1 */ /* USER CODE END TIM3_MspDeInit 1 */ } else if(tim_baseHandle->Instance==TIM4) { /* USER CODE BEGIN TIM4_MspDeInit 0 */ /* USER CODE END TIM4_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_TIM4_CLK_DISABLE(); /* TIM4 interrupt Deinit */ HAL_NVIC_DisableIRQ(TIM4_IRQn); /* USER CODE BEGIN TIM4_MspDeInit 1 */ /* USER CODE END TIM4_MspDeInit 1 */ } } /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ 有什么问题吗

#include "ic.h" #include "stdio.h" #include "string.h" struct { uint8_t succeed_flag; uint8_t rising_flag; uint8_t falling_flag; uint16_t timout_cnt; } capture_status = {0}; uint16_t last_cnt = 0; TIM_HandleTypeDef ic_handle = {0}; void ic_init(uint16_t arr, uint16_t psc) { TIM_IC_InitTypeDef ic_config = {0}; ic_handle.Instance = TIM2; ic_handle.Init.Prescaler = psc; ic_handle.Init.Period = arr; ic_handle.Init.CounterMode = TIM_COUNTERMODE_UP; HAL_TIM_IC_Init(&ic_handle); ic_config.ICPolarity = TIM_ICPOLARITY_FALLING; ic_config.ICSelection = TIM_ICSELECTION_DIRECTTI; ic_config.ICPrescaler = TIM_ICPSC_DIV1; ic_config.ICFilter = 0; HAL_TIM_IC_ConfigChannel(&ic_handle, &ic_config, TIM_CHANNEL_2); __HAL_TIM_ENABLE_IT(&ic_handle, TIM_IT_UPDATE); HAL_TIM_IC_Start_IT(&ic_handle, TIM_CHANNEL_2); } void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM2) { GPIO_InitTypeDef gpio_initstruct; //打开时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); // 使能GPIOB时钟 __HAL_RCC_TIM2_CLK_ENABLE(); //调用GPIO初始化函数 gpio_initstruct.Pin = GPIO_PIN_1; // 两个LED对应的引脚 gpio_initstruct.Mode = GPIO_MODE_INPUT; // 推挽输出 gpio_initstruct.Pull = GPIO_PULLUP; // 上拉 gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH; // 高速 HAL_GPIO_Init(GPIOA, &gpio_initstruct); HAL_NVIC_SetPriority(TIM2_IRQn, 2, 2); HAL_NVIC_EnableIRQ(TIM2_IRQn); } } void TIM2_IRQHandler(void) { HAL_TIM_IRQHandler(&ic_handle); } void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { //printf("捕获到下降沿\r\n"); if(htim->Instance == TIM2) { if(capture_status.succeed_flag == 0) { if(capture_status.falling_flag == 1) { printf("捕获到上升沿\r\n"); capture_status.succeed_flag = 1; last_cnt = HAL_TIM_ReadCapturedValue(&ic_handle, TIM_CHANNEL_2); TIM_RESET_CAPTUREPOLARITY(&ic_handle, TIM_CHANNEL_2); TIM_SET_CAPTUREPOLARITY(&ic_handle, TIM_CHANNEL_2, TIM_ICPOLARITY_FALLING); //memset(&capture_status, 0, sizeof(capture_status)); } else { printf("捕获到下降沿\r\n"); memset(&capture_status, 0, sizeof(capture_status)); capture_status.falling_flag = 1; __HAL_TIM_DISABLE(&ic_handle); __HAL_TIM_SET_COUNTER(&ic_handle, 0); TIM_RESET_CAPTUREPOLARITY(&ic_handle, TIM_CHANNEL_2); TIM_SET_CAPTUREPOLARITY(&ic_handle, TIM_CHANNEL_2, TIM_ICPOLARITY_RISING); __HAL_TIM_ENABLE(&ic_handle); } } } } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM2) { if(capture_status.succeed_flag == 0) { if(capture_status.falling_flag == 1) capture_status.timout_cnt++; } } } void pressed_time_get(void) { if(capture_status.succeed_flag == 1) { printf("按下时间:%d us\r\n", capture_status.timout_cnt * 65536 + last_cnt); memset(&capture_status, 0, sizeof(capture_status)); } } 我是初学者,以上代码详细解释一下

/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * Copyright (c) 2025 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include <string.h> #include <math.h> /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ TIM_HandleTypeDef htim2; TIM_HandleTypeDef htim3; TIM_HandleTypeDef htim4; UART_HandleTypeDef huart1; /* USER CODE BEGIN PV */ int32_t left_encoder_count = 0; //×óÂÖ±àÂëÆ÷¼ÆÊý int32_t right_encoder_count = 0; //ÓÒÂÖ±àÂëÆ÷¼ÆÊý float left_speed = 0.0f;//×óÂÖʵ¼ÊËÙ¶È float right_speed = 0.0f; //ÓÒÂÖʵ¼ÊËÙ¶È float target_speed = 0.0f; // Ä¿±êËÙ¶È /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_TIM2_Init(void); static void MX_TIM3_Init(void); static void MX_USART1_UART_Init(void); static void MX_TIM4_Init(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ TIM_HandleTypeDef htim2; TIM_HandleTypeDef htim3; TIM_HandleTypeDef htim4; UART_HandleTypeDef huart1; typedef struct { float Kp, Ki, Kd; float integral, prev_error; } PID_TypeDef; PID_TypeDef left_pid = {0.1f, 0.01f, 0.05f, 0, 0}; PID_TypeDef right_pid = {0.1f, 0.01f, 0.05f, 0, 0}; uint8_t rx_data; /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* 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_TIM2_Init(); MX_TIM3_Init(); MX_USART1_UART_Init(); MX_TIM4_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); } } /** * @brief TIM2 Initialization Function * @param None * @retval None */ static void MX_TIM2_Init(void) { /* USER CODE BEGIN TIM2_Init 0 */ /* USER CODE END TIM2_Init 0 */ TIM_Encoder_InitTypeDef sConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; /* USER CODE BEGIN TIM2_Init 1 */ /* USER CODE END TIM2_Init 1 */ htim2.Instance = TIM2; htim2.Init.Prescaler = 0; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 0xFFFF; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; sConfig.EncoderMode = TIM_ENCODERMODE_TI12; sConfig.IC1Polarity = TIM_ICPOLARITY_RISING; sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI; sConfig.IC1Prescaler = TIM_ICPSC_DIV1; sConfig.IC1Filter = 0; sConfig.IC2Polarity = TIM_ICPOLARITY_RISING; sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI; sConfig.IC2Prescaler = TIM_ICPSC_DIV1; sConfig.IC2Filter = 0; if (HAL_TIM_Encoder_Init(&htim2, &sConfig) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM2_Init 2 */ /* USER CODE END TIM2_Init 2 */ } /** * @brief TIM3 Initialization Function * @param None * @retval None */ static void MX_TIM3_Init(void) { /* USER CODE BEGIN TIM3_Init 0 */ /* USER CODE END TIM3_Init 0 */ TIM_Encoder_InitTypeDef sConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; /* USER CODE BEGIN TIM3_Init 1 */ /* USER CODE END TIM3_Init 1 */ htim3.Instance = TIM3; htim3.Init.Prescaler = 0; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 0xFFFF; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; sConfig.EncoderMode = TIM_ENCODERMODE_TI12; sConfig.IC1Polarity = TIM_ICPOLARITY_RISING; sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI; sConfig.IC1Prescaler = TIM_ICPSC_DIV1; sConfig.IC1Filter = 0; sConfig.IC2Polarity = TIM_ICPOLARITY_RISING; sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI; sConfig.IC2Prescaler = TIM_ICPSC_DIV1; sConfig.IC2Filter = 0; if (HAL_TIM_Encoder_Init(&htim3, &sConfig) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM3_Init 2 */ /* USER CODE END TIM3_Init 2 */ } /** * @brief TIM4 Initialization Function * @param None * @retval None */ static void MX_TIM4_Init(void) { /* USER CODE BEGIN TIM4_Init 0 */ /* USER CODE END TIM4_Init 0 */ TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; /* USER CODE BEGIN TIM4_Init 1 */ /* USER CODE END TIM4_Init 1 */ htim4.Instance = TIM4; htim4.Init.Prescaler = 72-1; htim4.Init.CounterMode = TIM_COUNTERMODE_UP; htim4.Init.Period = 1000-1; htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_PWM_Init(&htim4) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM4_Init 2 */ /* USER CODE END TIM4_Init 2 */ HAL_TIM_MspPostInit(&htim4); } /** * @brief USART1 Initialization Function * @param None * @retval None */ static void MX_USART1_UART_Init(void) { /* USER CODE BEGIN USART1_Init 0 */ /* USER CODE END USART1_Init 0 */ /* USER CODE BEGIN USART1_Init 1 */ /* USER CODE END USART1_Init 1 */ huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN USART1_Init 2 */ /* USER CODE END USART1_Init 2 */ } /** * @brief GPIO Initialization Function * @param None * @retval None */ static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* USER CODE BEGIN MX_GPIO_Init_1 */ /* USER CODE END MX_GPIO_Init_1 */ /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOA, MOTOR_IN1_Pin|GPIO_PIN_1|MOTOR_IN3_Pin|MOTOR_IN4_Pin, GPIO_PIN_RESET); /*Configure GPIO pins : MOTOR_IN1_Pin PA1 MOTOR_IN3_Pin MOTOR_IN4_Pin */ GPIO_InitStruct.Pin = MOTOR_IN1_Pin|GPIO_PIN_1|MOTOR_IN3_Pin|MOTOR_IN4_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* USER CODE BEGIN MX_GPIO_Init_2 */ /* USER CODE END MX_GPIO_Init_2 */ } /* USER CODE BEGIN 4 */ /* USER CODE END 4 */ /** * @brief This function is executed in case of error occurrence. * @retval None */ void Error_Handler(void) { /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ __disable_irq(); while (1) { } /* USER CODE END Error_Handler_Debug */ } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t *file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */ 生成的代码在这段代码中的添加位置

#include "main.h" #include "math.h" #include "dac.h" #include "dma.h" #include "tim.h" #include "gpio.h" #define M_PI 3.14159265358979323846f #define SINE_WAVE_POINTS 210 #define HSE_VALUE 8000000U volatile uint32_t freq = 100; volatile uint8_t key0_pressed = 0; volatile uint8_t key_up_pressed = 0; uint16_t sineWave[SINE_WAVE_POINTS]; void Generate_SineWave(void) { float amplitude = 1478.0f; //0.5=1242 float offset = 2048.0f; for(int i=0; i<SINE_WAVE_POINTS; i++) { sineWave[i] = (uint16_t)(offset + amplitude * sin(2 * M_PI * i / SINE_WAVE_POINTS)); } HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)sineWave, SINE_WAVE_POINTS, DAC_ALIGN_12B_R); } void EXTI0_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(KEY0_Pin); } void EXTI4_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(KEY_UP_Pin); } void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { static uint32_t last_key0_time = 0, last_key_up_time = 0; uint32_t current_time = HAL_GetTick(); if (GPIO_Pin == KEY0_Pin) { if ((current_time - last_key0_time) > 30) { key0_pressed = 1; last_key0_time = current_time; } } else if (GPIO_Pin == KEY_UP_Pin) { if ((current_time - last_key_up_time) > 30) { key_up_pressed = 1; last_key_up_time = current_time; } } } void SystemClock_Config(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_TIM6_Init(); HAL_TIM_Base_Start(&htim6); MX_GPIO_Init(); MX_DMA_Init(); MX_DAC_Init(); Generate_SineWave(); while (1) { if (key0_pressed == 1) { key0_pressed = 0; if (freq > 100) freq -= 100; HAL_TIM_Base_Stop(&htim6); __HAL_TIM_SET_AUTORELOAD(&htim6, (84000000.0f / (freq * SINE_WAVE_POINTS)) - 1); __HAL_TIM_SET_COUNTER(&htim6, 0); HAL_TIM_Base_Start(&htim6); HAL_DAC_Stop_DMA(&hdac, DAC_CHANNEL_1); HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)sineWave, SINE_WAVE_POINTS, DAC_ALIGN_12B_R); } if (key_up_pressed == 1) { key_up_pressed = 0; if (freq < 10000) freq += 100; HAL_TIM_Base_Stop(&htim6); __HAL_TIM_SET_AUTORELOAD(&htim6, (84000000.0f / (freq * SINE_WAVE_POINTS)) - 1); __HAL_TIM_SET_COUNTER(&htim6, 0); HAL_TIM_Base_Start(&htim6); HAL_DAC_Stop_DMA(&hdac, DAC_CHANNEL_1); HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)sineWave, SINE_WAVE_POINTS, DAC_ALIGN_12B_R); } } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 8; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 4; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { Error_Handler(); } } void Error_Handler(void) { __disable_irq(); while (1) { } }为什么按键按下,正弦波频率不变

/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * Copyright (c) 2025 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ #define COUNT_MAX 20 /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ TIM_HandleTypeDef htim1; TIM_HandleTypeDef htim4; /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_TIM1_Init(void); static void MX_TIM4_Init(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* 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_TIM1_Init(); MX_TIM4_Init(); /* USER CODE BEGIN 2 */ HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL); HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_3); int count=0; int duty=0; /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { count = __HAL_TIM_GET_COUNTER(&htim1); if (count > 60000) { count = 0; __HAL_TIM_SET_COUNTER(&htim1, 0); } else if (count > COUNT_MAX) { count = COUNT_MAX; __HAL_TIM_SET_COUNTER(&htim1, COUNT_MAX); } duty = (10 * count / (float)COUNT_MAX + 2.5) / 100.0 * 2000; __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, duty); HAL_Delay(10); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); } } /** * @brief TIM1 Initialization Function * @param None * @retval None */ static void MX_TIM1_Init(void) { /* USER CODE BEGIN TIM1_Init 0 */ /* USER CODE END TIM1_Init 0 */ TIM_Encoder_InitTypeDef sConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; /* USER CODE BEGIN TIM1_Init 1 */ /* USER CODE END TIM1_Init 1 */ htim1.Instance = TIM1; htim1.Init.Prescaler = 0; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 65535; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter = 0; htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; sConfig.EncoderMode = TIM_ENCODERMODE_TI1; sConfig.IC1Polarity = TIM_ICPOLARITY_RISING; sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI; sConfig.IC1Prescaler = TIM_ICPSC_DIV1; sConfig.IC1Filter = 0; sConfig.IC2Polarity = TIM_ICPOLARITY_RISING; sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI; sConfig.IC2Prescaler = TIM_ICPSC_DIV1; sConfig.IC2Filter = 0; if (HAL_TIM_Encoder_Init(&htim1, &sConfig) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM1_Init 2 */ /* USER CODE END TIM1_Init 2 */ } /** * @brief TIM4 Initialization Function * @param None * @retval None */ static void MX_TIM4_Init(void) { /* USER CODE BEGIN TIM4_Init 0 */ /* USER CODE END TIM4_Init 0 */ TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; /* USER CODE BEGIN TIM4_Init 1 */ /* USER CODE END TIM4_Init 1 */ htim4.Instance = TIM4; htim4.Init.Prescaler = 720-1; htim4.Init.CounterMode = TIM_COUNTERMODE_UP; htim4.Init.Period = 2000-1; htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim4) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_Init(&htim4) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM4_Init 2 */ /* USER CODE END TIM4_Init 2 */ HAL_TIM_MspPostInit(&htim4); } /** * @brief GPIO Initialization Function * @param None * @retval None */ static void MX_GPIO_Init(void) { /* USER CODE BEGIN MX_GPIO_Init_1 */ /* USER CODE END MX_GPIO_Init_1 */ /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /* USER CODE BEGIN MX_GPIO_Init_2 */ /* USER CODE END MX_GPIO_Init_2 */ } /* USER CODE BEGIN 4 */ /* USER CODE END 4 */ /** * @brief This function is executed in case of error occurrence. * @retval None */ void Error_Handler(void) { /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ __disable_irq(); while (1) { } /* USER CODE END Error_Handler_Debug */ } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t *file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */ 为什么在keil中报错

#include "stm32f10x.h" #define SPWM_LEVELS 100 uint16_t spwm_table[SPWM_LEVELS] = { 200,212,225,237,249,261,273,285,296,307,317,327,336,345,354,361, 368,375,380,385,390,393,396,398,399,400,399,398,396,393,390,385, 380,375,368,361,354,345,336,327,317,307,296,285,273,261,249,237, 225,212,200,187,174,162,150,138,126,114,103,92,82,72,63,54, 45,38,31,24,19,14,9,6,3,1,0,0,0,1,3,6, 9,14,19,24,31,38,45,54,63,72,82,92,103,114,126,138, 150,162,174,187 }; void TIM2_PWM_Config(void) { TIM_OCInitTypeDef TIM_OC_InitStruct; TIM_TimeBaseInitTypeDef TIM_TimeBase_InitStruct; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBase_InitStruct.TIM_Period = 7199; // ARR TIM_TimeBase_InitStruct.TIM_Prescaler = 71; // PSC TIM_TimeBase_InitStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBase_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(TIM2, &TIM_TimeBase_InitStruct); TIM_OC_InitStruct.TIM_OCMode = TIM_OCMode_PWM1; TIM_OC_InitStruct.TIM_OutputState = TIM_OutputState_Enable; TIM_OC_InitStruct.TIM_Pulse = spwm_table[0]; // 初始占空比 TIM_OC_InitStruct.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM2, &TIM_OC_InitStruct); TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM2, ENABLE); TIM_Cmd(TIM2, ENABLE); TIM_CtrlPWMOutputs(TIM2, ENABLE); } void TIM3_IT_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBase_InitStruct; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBase_InitStruct.TIM_Period = 999; // 100Hz 更新频率 TIM_TimeBase_InitStruct.TIM_Prescaler = 7199; // 1ms 中断一次 TIM_TimeBase_InitStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBase_InitStruct); TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); TIM_Cmd(TIM3, ENABLE); // NVIC 配置 NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); } // TIM3 中断服务函数 volatile uint16_t spwm_index = 0; uint8_t update_counter = 0; void TIM3_IRQHandler(void) { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { // 每 10 次中断更新一次,即每 1ms 更新一次 update_counter++; if (update_counter >= 10) { TIM_SetCompare1(TIM2, spwm_table[spwm_index]); spwm_index = (spwm_index + 1) % SPWM_LEVELS; update_counter = 0; // 重置计数器 } TIM_ClearITPendingBit(TIM3, TIM_IT_Update); } } void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct); } 用高级定时器优化一些代码,并留有死区区间

大家在看

recommend-type

A5V2R2刷机工具_idata95w刷机_idata95v刷机_iData95刷机_iData95刷机_pda刷机软件_

pda刷机工具,用于idata95w/v刷机,内含说明,使用看型号说明
recommend-type

微信小程序通过Onenet获取ESP32-C3的温湿度数据并控制灯亮灭.zip

微信小程序通过Onenet获取ESP32-C3的温湿度数据并控制灯亮灭,也实现了获取设备数据并控制开关,附这个项目界面设计的设计和数据交互文档
recommend-type

WebServerApp

WebServerApp,采用http 1.1协议,使用mfc开发,vs2008.
recommend-type

华为逆变器SUN2000-(33KTL, 40KTL) MODBUS接口定义描述

ModBus-RTU 协议是工业领域广泛使用的通讯协议,是应用于电气通信终端上的一种通用语言。通过此协议,逆变器相互之间、逆变器经由网络(例如 RS485 总线)和其它设备之间可以通信。它已经成为一通用工业标准。有了它,不同厂商生产的逆变器设备可以连成工业网络,进行集中监控。协议中描述了主从节点定义方式,主节点使用各种请求方式访问其它设备的过程,从节点如何响应来自其它设备的请求,以及双方如何侦测错误并记录。它制定了消息域格局和数据内容的详细定义。 随着华为逆变器业务的不断拓展,越来越多的通用或定制逆变器采用 ModBus 协议进行通讯,本文对华为逆变器的 ModBus 协议进行了描述和说明,用于规范和约束后续的第三方集成开发和定制。
recommend-type

MMC.rar_NEC mmc-1_nec-m

NEC控制芯片,09电子设计大赛必用,很好的资料,虽然不是我写的,但是肯定有用

最新推荐

recommend-type

研究Matlab影响下的神经数值可复制性

### Matlab代码影响神经数值可复制性 #### 标题解读 标题为“matlab代码影响-neural-numerical-replicability:神经数值可复制性”,该标题暗示了研究的主题集中在Matlab代码对神经数值可复制性的影响。在神经科学研究中,数值可复制性指的是在不同计算环境下使用相同的算法与数据能够获得一致或相近的计算结果。这对于科学实验的可靠性和结果的可验证性至关重要。 #### 描述解读 描述中提到的“该项目”着重于提供工具来分析不同平台下由于数值不精确性导致的影响。项目以霍奇金-赫克斯利(Hodgkin-Huxley)型神经元组成的简单神经网络为例,这是生物物理神经建模中常见的模型,用于模拟动作电位的产生和传播。 描述中提及的`JCN_2019_v4.0_appendix_Eqs_Parameters.pdf`文件详细描述了仿真模型的参数与方程。这些内容对于理解模型的细节和确保其他研究者复制该研究是必不可少的。 该研究的实现工具选用了C/C++程序语言。这表明了研究的复杂性和对性能的高要求,因为C/C++在科学计算领域内以其高效性和灵活性而广受欢迎。 使用了Runge–Kutta四阶方法(RK4)求解常微分方程(ODE),这是一种广泛应用于求解初值问题的数值方法。RK4方法的精度和稳定性使其成为众多科学计算问题的首选。RK4方法的实现借助了Boost C++库中的`Boost.Numeric.Odeint`模块,这进一步表明项目对数值算法的实现和性能有较高要求。 #### 软件要求 为了能够运行该项目,需要满足一系列软件要求: - C/C++编译器:例如GCC,这是编译C/C++代码的重要工具。 - Boost C++库:一个强大的跨平台C++库,提供了许多标准库之外的组件,尤其是数值计算相关的部分。 - ODEint模块:用于求解常微分方程,是Boost库的一部分,已包含在项目提供的文件中。 #### 项目文件结构 从提供的文件列表中,我们可以推测出项目的文件结构包含以下几个部分: - **项目树源代码目录**:存放项目的主要源代码文件。 - `checkActualPrecision.h`:一个头文件,可能用于检测和评估实际的数值精度。 - `HH_BBT2017_allP.cpp`:源代码文件,包含用于模拟霍奇金-赫克斯利神经元网络的代码。 - `iappDist_allP.cpp` 和 `iappDist_allP.h`:源代码和头文件,可能用于实现某种算法或者数据的分布。 - `Makefile.win`:针对Windows系统的编译脚本文件,用于自动化编译过程。 - `SpikeTrain_allP.cpp` 和 `SpikeTrain_allP.h`:源代码和头文件,可能与动作电位的生成和传播相关。 - **人物目录**:可能包含项目成员的简介、联系方式或其他相关信息。 - **Matlab脚本文件**: - `图1_as.m`、`图2_as.m`、`图2_rp`:这些文件名中的"as"可能表示"assembled",而"rp"可能指"reproduction"。这些脚本文件很可能用于绘制图表、图形,以及对模拟结果进行后处理和复现实验。 #### 开源系统标签 标签“系统开源”指的是该项目作为一个开源项目被开发,意味着其源代码是公开的,任何个人或组织都可以自由获取、修改和重新分发。这对于科学计算来说尤为重要,因为开放代码库可以增进协作,加速科学发现,并确保实验结果的透明度和可验证性。 #### 总结 在理解了文件中提供的信息后,可以认识到本项目聚焦于通过提供准确的数值计算工具,来保证神经科学研究中模型仿真的可复制性。通过选择合适的编程语言和算法,利用开源的库和工具,研究者们可以确保其研究结果的精确性和可靠性。这不仅有助于神经科学领域的深入研究,还为其他需要高精度数值计算的科研领域提供了宝贵的经验和方法。
recommend-type

MySQL数据库索引失效案例分析与解决方案(索引失效大揭秘)

# 摘要 MySQL索引失效是数据库性能优化中的关键问题,直接影响查询效率与系统响应速度。本文系统分析了索引的基本机制与失效原理,包括B+树结构、执行计划解析及查询优化器的工作逻辑,深入探讨了索引失效的典型场景,如不规范SQL写法、复合索引设计不当以及统
recommend-type

TS语言

### TypeScript 简介 TypeScript 是一种由 Microsoft 开发的开源编程语言,它是 JavaScript 的超集,这意味着所有的 JavaScript 代码都是合法的 TypeScript 代码。TypeScript 扩展了 JavaScript 的语法,并通过类型注解提供编译时的静态类型检查,从而使得代码更易于维护、理解和调试。TypeScript 可以在任何操作系统上运行,并且可以编译出纯净、简洁的 JavaScript 代码,这些代码可以在任何浏览器上、Node.js 环境中,或者任何支持 ECMAScript 3(或更高版本)的 JavaScript 引
recommend-type

Leaflet.Graticule插件:创建经纬度网格刻度

标题“Leaflet.Graticule:经纬线网格”指向的是Leaflet.js的一个插件,它用于在地图上生成经纬度网格线,以辅助进行地图定位与参考。从描述中,我们可以提取到几个关键知识点: 1. Leaflet.Graticule插件的使用目的和功能:该插件的主要作用是在基于Leaflet.js库的地图上绘制经纬度网格线。这可以帮助用户在地图上直观地看到经纬度划分,对于地理信息系统(GIS)相关工作尤为重要。 2. 插件的构造函数和参数:`L.graticule(options)`是创建Graticule图层的JavaScript代码片段。其中`options`是一个对象,可以用来设置网格线的显示样式和间隔等属性。这表明了插件的灵活性,允许用户根据自己的需求调整网格线的显示。 3. interval参数的含义:`interval`参数决定了网格线的间隔大小,以度为单位。例如,若设置为20,则每20度间隔显示一条网格线;若设置为10,则每10度显示一条网格线。这一参数对于调节网格线密度至关重要。 4. style参数的作用:`style`参数用于定义网格线的样式。插件提供了自定义线的样式的能力,包括颜色、粗细等,使得开发者可以根据地图的整体风格和个人喜好来定制网格线的外观。 5. 实例化和添加到地图上的例子:提供了两种使用插件的方式。第一种是直接创建一个基本的网格层并将其添加到地图上,这种方式使用了插件的默认设置。第二种是创建一个自定义间隔的网格层,并同样将其添加到地图上。这展示了如何在不同的使用场景下灵活运用插件。 6. JavaScript标签的含义:标题中“JavaScript”这一标签强调了该插件是使用JavaScript语言开发的,它是前端技术栈中重要的部分,特别是在Web开发中扮演着核心角色。 7. 压缩包子文件的文件名称列表“Leaflet.Graticule-master”暗示了插件的项目文件结构。文件名表明,这是一个典型的GitHub仓库的命名方式,其中“master”可能代表主分支。通常,开发者可以在如GitHub这样的代码托管平台上找到该项目的源代码和文档,以便下载、安装和使用。 综上所述,可以得知,Leaflet.Graticule插件是一个专为Leaflet地图库设计的扩展工具,它允许用户添加自定义的经纬度网格线到地图上,以帮助进行地图的可视化分析。开发者可以根据特定需求通过参数化选项来定制网格线的属性,使其适应不同的应用场景。通过学习和使用该插件,可以增强地图的交互性和信息的传递效率。
recommend-type

【MySQL数据库性能提升秘籍】:揭秘性能下降幕后真凶及解决策略

# 摘要 MySQL性能问题在实际应用中普遍存在,但其表象复杂且易引发认知误区。本文系统分析了导致MySQL性能下降的核心原因,涵盖查询语句结构、数据库配置、表结构设计等多个技术层面,并结合性能监控工具与执行计划解析,提供了全面的问题诊断方法。在此基础上,文章深入探讨了索引优化、查询重写、分库分表等高级调优策略,并通过真实案例总结了可行的最佳实践
recommend-type

51小车循迹红外

基于51单片机的红外循迹小车的实现方法,主要涉及硬件连接、传感器模块的使用以及程序设计三个方面。 ### 红外循迹模块的选择与连接 红外循迹模块通常由多个红外发射和接收对管组成,用于检测地面上的黑线。常见的模块有四路红外循迹模块,其工作原理是通过检测红外光的反射强度来判断是否处于黑线上。红外模块的VCC和GND分别连接到51单片机的+5V和GND端,而IN1至IN4则连接到单片机的对应引脚上。红外发射接收器应安装在小车前方下端,并且离地面的距离不宜过远,以确保能够有效检测到黑线[^2]。 ### 硬件电路设计 在硬件设计方面,需要考虑电机驱动、电源管理、以及红外传感器的接口设计。51单片机
recommend-type

AMEF图像去雾技术:Matlab实现与应用

AMEF(Artificial Multi-Exposure Fusion)方法是一种用于图像去雾的技术,其核心思想是将多张曝光不足的图像融合成一张清晰无雾的图片。在讨论这个技术的Matlab实现之前,让我们先了解图像去雾和多重曝光融合的背景知识。 图像去雾技术的目标是恢复在雾中拍摄的图像的清晰度,增强图像的对比度和颜色饱和度,使得原本因雾气影响而模糊的图像变得清晰。这种技术在自动驾驶、无人机导航、视频监控、卫星图像处理等领域有着重要的应用。 多重曝光技术源自摄影领域,通过拍摄同一场景的多张照片,再将这些照片通过特定算法融合,获得一张综合了多张照片信息的图像。多重曝光融合技术在提高图像质量方面发挥着重要作用,例如增加图片的动态范围,提升细节和亮度,消除噪点等。 在介绍的AMEF去雾方法中,该技术被应用于通过人工创建的多重曝光图像进行融合,以产生清晰的无雾图像。由于单一图像在光照不均匀或天气条件不佳的情况下可能会产生图像质量低下的问题,因此使用多重曝光融合可以有效地解决这些问题。 在Matlab代码实现方面,AMEF的Matlab实现包括了一个名为amef_demo.m的演示脚本。用户可以通过修改该脚本中的图像名称来处理他们自己的图像。在该代码中,clip_range是一个重要的参数,它决定了在去雾处理过程中,对于图像像素亮度值的裁剪范围。在大多数实验中,该参数被设定为c=0.010,但用户也可以根据自己的需求进行调整。较大的clip_range值会尝试保留更多的图像细节,但同时也可能引入更多噪声,因此需要根据图像的具体情况做出适当选择。 AMEF方法的理论基础和实验过程均来自于Adrian Galdran在2018年发表于《信号处理》期刊的文章,题为“Image Dehazing by Artificial Multi-Exposure Image Fusion”。同时,该Matlab代码的融合部分的理论基础则来自于2007年Pacific Graphics会议记录中由Tom Mertens, Jan Kautz和Frank Van Reeth提出的工作,题目为“Exposure Fusion”。因此,如果读者在实际应用中使用了这段代码,适当的引用这些工作是必要的学术礼仪。 此外,标签“系统开源”表明了该项目遵循开源精神,允许研究者、开发者及用户自由地访问、使用、修改和共享源代码。这一特点使得AMEF方法具有广泛的可访问性和可扩展性,鼓励了更广泛的研究和应用。 从压缩包子文件的文件名称列表中,我们可以看到AMEF去雾方法的Matlab实现的项目名为“amef_dehazing-master”。这表明了这是一个有主分支的项目,其主分支被标识为“master”,这通常意味着它是项目维护者认可的稳定版本,也是用户在使用时应该选择的版本。 总的来说,AMEF去雾方法及其Matlab实现为图像处理领域提供了快速且有效的解决方案,能够在图像被雾气影响时恢复出高质量的清晰图像,这对于相关领域的研究和应用具有重要的意义。
recommend-type

泵浦光匹配建模全解析:MATLAB中耦合效率提升的4个关键点(实战案例)

# 摘要 泵浦光匹配建模在光纤激光器与光学系统设计中具有关键作用,直接影响光束耦合效率与系统整体性能。本文系统阐述了泵浦光匹配建模的基本概念与研究意义,深入分析其理论基础,包括光纤耦合原理、高斯光束传播特性及耦合效率的数学建模。基于MATLAB平台,介绍了光学仿真工具的使用与建模环境搭建方法,并提出四种关键建模策略以提升耦合效率。通过典型实例验证模型有效性
recommend-type

openshift跟k8s和docker之间的关系

### OpenShift 与 Kubernetes 和 Docker 的关系 OpenShift 是基于 Kubernetes 和 Docker 构建的一个企业级应用云平台。它通过整合 Kubernetes 的容器编排能力和 Docker 的容器引擎,提供了一套完整的云原生解决方案。 #### OpenShift 与 Kubernetes 的关系 Kubernetes 是 OpenShift 的核心组件之一,负责容器编排任务。OpenShift 基于 Kubernetes 构建,并在其基础上扩展了更多企业级功能。例如,OpenShift 引入了 BuildConfig、ImageStre
recommend-type

VK-Apps-SDK-JS:JavaScript SDK for VKontakte Apps开发

根据提供的信息,我们可以推断出以下知识点: 标题“vk-apps-sdk-js”指出了这是一个与VK(VKontakte,俄罗斯的一个主要社交媒体平台)应用程序开发相关的JavaScript软件开发工具包(SDK)。 描述中提到的信息涵盖以下知识点: 1. 安装过程:描述了如何使用npm(Node.js的包管理器)来安装这个SDK。具体地,通过npm可以安装两个包:`@happysanta/vk-apps-sdk` 和 `@vkontakte/vk-connect`。这表明了开发者需要安装这两个依赖来开始使用VK的JavaScript SDK。 2. 引入SDK:描述中展示了如何在JavaScript文件中导入`VkSdk`模块,使用`import`语句从`@happysanta/vk-apps-sdk`包中导入。 3. 方法列表:描述中列出了一系列的方法名称,这些是SDK提供的功能函数,它们允许开发者执行特定的动作,比如分享内容、打开支付表单、允许通知等。每个方法对应一个功能,下面将详细阐述这些方法可能的功能和用途: - `分享()`:此方法可能允许用户在VK上分享内容到他们的个人页面或群组。 - `showWallPostBox()`:此方法可能用于显示一个弹出框,让用户能够在VK上发表新的帖子到自己的墙(wall)或群组。 - `getClientVersion()`:此方法可能用于获取当前安装在客户端的SDK版本信息。 - `openPayForm()`:此方法可能用于打开VK的支付表单,允许用户进行支付操作。 - `allowNotifications()` 和 `denyNotifications()`:这些方法可能用于处理应用内的通知,允许或拒绝接收来自VK的通知。 - `setLocation()`:此方法可能用于设置用户的地理位置信息,这对于基于位置的应用功能很重要。 - `allowMessagesFromGroup()`:此方法可能允许从特定的VK群组接收消息。 - `加入组()`:此方法可能用于让用户加入一个特定的VK群组。 - `openQR()`:此方法可能用于生成并显示一个二维码,用户通过扫描它来进行操作,比如快速加入群组或访问特定页面。 - `openApp()`:此方法可能用于打开VK应用内的其他应用或功能。 - `setViewSettings()`:此方法可能用于设置应用的视图设置,比如UI样式或布局。 - `scroll()`:此方法可能用于在应用内部滚动内容。 - `resizeWindow()`:此方法可能用于调整应用窗口的大小。 - `getPersonalCard()`:此方法可能用于获取用户在VK上的个人信息卡。 4. API调用:描述的最后部分提到了可以调用vk的API。这表明`vk-apps-sdk-js`可能封装了VK API的某些部分,以便于JavaScript开发者能够更加方便地与VK平台进行交互。 标签“JavaScript”揭示了这个SDK是专门为使用JavaScript语言开发的VK应用程序而设计的。 文件名称列表“vk-apps-sdk-js-master”暗示了这个SDK的源代码或项目结构存储在一个名为“vk-apps-sdk-js-master”的文件夹或仓库中。通常这种命名意味着代码被托管在像是GitHub之类的代码托管平台上,而“-master”通常指代主分支,意味着这是开发中的主线。 综合以上信息,可以看出“vk-apps-sdk-js”是一个帮助开发者快速实现VK应用中常见功能的SDK,简化了与VK平台接口的交互过程,为JavaScript开发人员提供了一套丰富的API和方法,从而可以专注于开发具有吸引力和功能性VK应用程序。