|
说明:
这个之前已经有发过例子,详见:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86445
现在H7的部分定时器是带6个通道的,官方的这个例子是测试了4个通道。
PE.09 (TIM1_Channel1)
PE.11(TIM1_Channel2)
PE.13 (TIM1_Channel3)
PA.11(TIM1_Channel4)
测量下前两个通道效果:
代码:- /* Private typedef -----------------------------------------------------------*/
- #define PERIOD_VALUE (uint32_t)(1000 - 1) /* Period Value */
- #define PULSE1_VALUE (uint32_t)(PERIOD_VALUE/2) /* Capture Compare 1 Value */
- #define PULSE2_VALUE (uint32_t)(PERIOD_VALUE*37.5/100) /* Capture Compare 2 Value */
- #define PULSE3_VALUE (uint32_t)(PERIOD_VALUE/4) /* Capture Compare 3 Value */
- #define PULSE4_VALUE (uint32_t)(PERIOD_VALUE*12.5/100) /* Capture Compare 4 Value */
- /* Private define ------------------------------------------------------------*/
- /* Private macro -------------------------------------------------------------*/
- /* Private variables ---------------------------------------------------------*/
- /* Timer handler declaration */
- TIM_HandleTypeDef TimHandle;
- /* Timer Output Compare Configuration Structure declaration */
- TIM_OC_InitTypeDef sConfig;
- /* Counter Prescaler value */
- uint32_t uhPrescalerValue = 0;
- /* Private function prototypes -----------------------------------------------*/
- static void SystemClock_Config(void);
- static void Error_Handler(void);
- static void CPU_CACHE_Enable(void);
- /* Private functions ---------------------------------------------------------*/
- /**
- * @brief Main program.
- * @param None
- * @retval None
- */
- int main(void)
- {
- /* Enable the CPU Cache */
- CPU_CACHE_Enable();
- /* STM32H7xx HAL library initialization:
- - Systick timer is configured by default as source of time base, but user
- can eventually implement his proper time base source (a general purpose
- timer for example or other time source), keeping in mind that Time base
- duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and
- handled in milliseconds basis.
- - Set NVIC Group Priority to 4
- - Low Level Initialization
- */
- HAL_Init();
- /* Configure the system clock to 400 MHz */
- SystemClock_Config();
- /* Configure LED3 */
- BSP_LED_Init(LED3);
- /* Compute the prescaler value to have TIM1 counter clock equal to 20000000 Hz */
- uhPrescalerValue = (uint32_t)(SystemCoreClock / (2*20000000)) - 1;
- /*##-1- Configure the TIM peripheral #######################################*/
- /* -----------------------------------------------------------------------
- TIM1 Configuration: generate 4 PWM signals with 4 different duty cycles.
- In this example TIM1 input clock (TIM1CLK) is set to APB2 clock (PCLK2),
- since APB2 prescaler is equal to 2.
- TIM1CLK = 2*PCLK2
- PCLK2 = HCLK/2 as AHB Clock divider is set to RCC_HCLK_DIV2
- => TIM1CLK = HCLK = SystemCoreClock/2
- To get TIM1 counter clock at 20 MHz, the prescaler is computed as follows:
- Prescaler = (TIM1CLK / TIM1 counter clock) - 1
- Prescaler = ((SystemCoreClock) /(2*20 MHz)) - 1
- To get TIM1 output clock at 20 KHz, the period (ARR)) is computed as follows:
- ARR = (TIM1 counter clock / TIM1 output clock) - 1
- = 999
- TIM1 Channel1 duty cycle = (TIM1_CCR1/ TIM1_ARR + 1)* 100 = 50%
- TIM1 Channel2 duty cycle = (TIM1_CCR2/ TIM1_ARR + 1)* 100 = 37.5%
- TIM1 Channel3 duty cycle = (TIM1_CCR3/ TIM1_ARR + 1)* 100 = 25%
- TIM1 Channel4 duty cycle = (TIM1_CCR4/ TIM1_ARR + 1)* 100 = 12.5%
- Note:
- SystemCoreClock variable holds HCLK frequency and is defined in system_stm32h7xx.c file.
- Each time the core clock (HCLK) changes, user had to update SystemCoreClock
- variable value. Otherwise, any configuration based on this variable will be incorrect.
- This variable is updated in three ways:
- 1) by calling CMSIS function SystemCoreClockUpdate()
- 2) by calling HAL API function HAL_RCC_GetSysClockFreq()
- 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
- ----------------------------------------------------------------------- */
- /* Initialize TIMx peripheral as follows:
- + Prescaler = (SystemCoreClock / (2*20000000)) - 1
- + Period = (1000 - 1)
- + ClockDivision = 0
- + Counter direction = Up
- */
- TimHandle.Instance = TIMx;
- TimHandle.Init.Prescaler = uhPrescalerValue;
- TimHandle.Init.Period = PERIOD_VALUE;
- TimHandle.Init.ClockDivision = 0;
- TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
- TimHandle.Init.RepetitionCounter = 0;
- if (HAL_TIM_PWM_Init(&TimHandle) != HAL_OK)
- {
- /* Initialization Error */
- Error_Handler();
- }
- /*##-2- Configure the PWM channels #########################################*/
- /* Common configuration for all channels */
- sConfig.OCMode = TIM_OCMODE_PWM1;
- sConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
- sConfig.OCFastMode = TIM_OCFAST_DISABLE;
- sConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH;
- sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;
- sConfig.OCIdleState = TIM_OCIDLESTATE_RESET;
- /* Set the pulse value for channel 1 */
- sConfig.Pulse = PULSE1_VALUE;
- if (HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1) != HAL_OK)
- {
- /* Configuration Error */
- Error_Handler();
- }
- /* Set the pulse value for channel 2 */
- sConfig.Pulse = PULSE2_VALUE;
- if (HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_2) != HAL_OK)
- {
- /* Configuration Error */
- Error_Handler();
- }
- /* Set the pulse value for channel 3 */
- sConfig.Pulse = PULSE3_VALUE;
- if (HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_3) != HAL_OK)
- {
- /* Configuration Error */
- Error_Handler();
- }
- /* Set the pulse value for channel 4 */
- sConfig.Pulse = PULSE4_VALUE;
- if (HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_4) != HAL_OK)
- {
- /* Configuration Error */
- Error_Handler();
- }
- /*##-3- Start PWM signals generation #######################################*/
- /* Start channel 1 */
- if (HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_1) != HAL_OK)
- {
- /* PWM Generation Error */
- Error_Handler();
- }
- /* Start channel 2 */
- if (HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_2) != HAL_OK)
- {
- /* PWM Generation Error */
- Error_Handler();
- }
- /* Start channel 3 */
- if (HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_3) != HAL_OK)
- {
- /* PWM generation Error */
- Error_Handler();
- }
- /* Start channel 4 */
- if (HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_4) != HAL_OK)
- {
- /* PWM generation Error */
- Error_Handler();
- }
- while (1)
- {
- }
- }
复制代码
|
|