用STM32cube配置TIM1捕获模式,启动定时器后无法修改psc和arr寄存器,修改之后定时器还按照原来的参数计数

2019-07-14 13:09发布

tiM1捕获模式正常工作后,用__HAL_TIM_SET_PRESCALER(&htim1,psc);函数修改psc;__HAL_TIM_SET_AUTORELOAD()函数设置定时周期,修改后没有按照新的参数计数;

  1. int main(void)
  2. {
  3.   /* USER CODE BEGIN 1 */
  4.         unsigned short psc = 143;
  5.   /* USER CODE END 1 */

  6.   /* MCU Configuration--------------------------------------------------------*/

  7.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  8.   HAL_Init();

  9.   /* USER CODE BEGIN Init */

  10.   /* USER CODE END Init */

  11.   /* Configure the system clock */
  12.   SystemClock_Config();

  13.   /* USER CODE BEGIN SysInit */

  14.   /* USER CODE END SysInit */

  15.   /* Initialize all configured peripherals */
  16.   MX_GPIO_Init();
  17.   MX_USART1_UART_Init();
  18.   MX_TIM1_Init();
  19.   /* USER CODE BEGIN 2 */
  20.         printf("³õʼ»¯... ");
  21.         HAL_TIM_Base_Start_IT(&htim1);
  22.         HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_1);
  23.   /* USER CODE END 2 */

  24.   /* Infinite loop */
  25.   /* USER CODE BEGIN WHILE */
  26.   while (1)
  27.   {
  28.     /* USER CODE END WHILE */

  29.     /* USER CODE BEGIN 3 */
  30.                 if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)==GPIO_PIN_RESET)
  31.                 {
  32.                         HAL_Delay(20);                                
  33.                         if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)==GPIO_PIN_RESET)
  34.                         {
  35.                                 printf("°´¼ü°´Ï£¡ ");
  36. //                                cap_time = 1;
  37. //                                HAL_TIM_IC_Start_IT(&htim1,TIM_CHANNEL_1);
  38.                                 //HAL_TIM_IC_Start(&htim5,TIM_CHANNEL_1);
  39.                                 psc = psc - 10;
  40.                                 if(psc < 20)
  41.                                 {
  42.                                         psc = 143;
  43.                                 }
  44.                                 __HAL_TIM_SET_PRESCALER(&htim1,psc);
  45.                                 
  46.                         }
  47.                         while(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)==GPIO_PIN_RESET);
  48.                 }        
  49.                
  50.                 if(fre.flag == 1)
  51.                 {
  52.                         printf("fre = %f ",fre.result);
  53.                         fre.result = 0;
  54.                         fre.flag = 0;
  55.                 }
  56.   }
  57.   /* USER CODE END 3 */
  58. }
复制代码
  1. void MX_TIM1_Init(void)
  2. {
  3.   TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  4.   TIM_MasterConfigTypeDef sMasterConfig = {0};
  5.   TIM_IC_InitTypeDef sConfigIC = {0};

  6.   htim1.Instance = TIM1;
  7.   htim1.Init.Prescaler = 143;
  8.   htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  9.   htim1.Init.Period = 50000;
  10.   htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  11.   htim1.Init.RepetitionCounter = 0;
  12.   htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  13.   if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
  14.   {
  15.     Error_Handler();
  16.   }
  17.   sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  18.   if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
  19.   {
  20.     Error_Handler();
  21.   }
  22.   if (HAL_TIM_IC_Init(&htim1) != HAL_OK)
  23.   {
  24.     Error_Handler();
  25.   }
  26.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  27.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  28.   if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  29.   {
  30.     Error_Handler();
  31.   }
  32.   sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
  33.   sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
  34.   sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
  35.   sConfigIC.ICFilter = 0;
  36.   if (HAL_TIM_IC_ConfigChannel(&htim1, &sConfigIC, TIM_CHANNEL_1) != HAL_OK)
  37.   {
  38.     Error_Handler();
  39.   }

  40. }
复制代码
  1. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
  2. {
  3.         if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_9) == GPIO_PIN_SET)
  4.         {
  5.                 if(fre.times == 1)
  6.                 {
  7.                         //cap_value1 = HAL_TIM_ReadCapturedValue(&htim1,TIM_CHANNEL_1);
  8.                         fre.times = 2;
  9.                         fre.period = 0;
  10.                         __HAL_TIM_SET_COUNTER(&htim1,0);
  11.                         // Çå³ýÖжϱê־λ
  12.                         __HAL_TIM_CLEAR_IT(&htim1, TIM_IT_CC1);
  13.                         
  14.                         HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_1);
  15.                         
  16.                         printf("µÚÒ»¸öÉÏÉýÑØ£¬fre.period = %d ",fre.period);
  17.                         
  18.                 }
  19.                 else
  20.                 {
  21.                         fre.velue = HAL_TIM_ReadCapturedValue(&htim1,TIM_CHANNEL_1);
  22.                         fre.times = 1;
  23.                         //HAL_TIM_IC_Stop_IT(&htim1, TIM_CHANNEL_1);
  24.                         __HAL_TIM_CLEAR_IT(&htim1, TIM_IT_CC1);
  25.                         HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_1);
  26.                         
  27.                         printf("µÚ¶þ¸öÉÏÉýÑØ£¬fre.period = %d ",fre.period);
  28.                         fre.result = 1000000.0 / (fre.velue + fre.period * 1000);
  29.                         fre.period = 0;
  30.                         fre.flag = 1;
  31.                 }
  32.         }
  33.         
  34.         
  35.         
  36. }
复制代码
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  2. {
  3.   /* USER CODE BEGIN Callback 0 */

  4.   /* USER CODE END Callback 0 */
  5.   if (htim->Instance == TIM6) {
  6.     HAL_IncTick();
  7.   }
  8.   /* USER CODE BEGIN Callback 1 */
  9.         if (htim->Instance == TIM1) {
  10.    
  11.   }
  12.         fre.period++;
  13.   /* USER CODE END Callback 1 */
  14. }
复制代码


0条回答

一周热门 更多>