1、單片機:STM32L031G6U6
2、使用IO:PA6 TIM22 CH1 PA7 TIM22 CH2
3、時鐘配置:1.048M
TIM22配置頻率:晶振頻率1.048Mhz 預分頻系數為 0,自動重裝載值為 99,定時器溢出頻率,即PWM的周期,就是 1.048MHz/(0+1)/(99+1) = 10.048kHz
4、問題:不能輸出PWM波形,示波器測試的
使能時輸出高電平,不使能時輸出低電平
HAL_TIM_PWM_Start(&htim22,TIM_CHANNEL_1); //開啟PWM輸出
HAL_TIM_PWM_Start(&htim22,TIM_CHANNEL_2); //開啟PWM輸出
TIM22初始化的代碼
- static void MX_TIM22_Init(void)
- {
- /* USER CODE BEGIN TIM22_Init 0 */
- __HAL_RCC_TIM22_CLK_ENABLE();
- /* USER CODE END TIM22_Init 0 */
- __HAL_RCC_TIM22_CLK_ENABLE();
- TIM_ClockConfigTypeDef sClockSourceConfig = {0};
- TIM_MasterConfigTypeDef sMasterConfig = {0};
- TIM_OC_InitTypeDef sConfigOC = {0};
- /* USER CODE BEGIN TIM22_Init 1 */
- /* USER CODE END TIM22_Init 1 */
- htim22.Instance = TIM22;
- htim22.Init.Prescaler = 0;//晶振頻率1.048Mhz 預分頻系數為 0,自動重裝載值為 99,定時器溢出頻率,即PWM的周期,就是 1.048MHz/(0+1)/(99+1) = 10.048kHz
- htim22.Init.CounterMode = TIM_COUNTERMODE_UP;
- htim22.Init.Period = 99;
- htim22.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
- htim22.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;//自動重裝載
- if (HAL_TIM_Base_Init(&htim22) != HAL_OK)
- {
- Error_Handler();
- }
- sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
- if (HAL_TIM_ConfigClockSource(&htim22, &sClockSourceConfig) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_TIM_PWM_Init(&htim22) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_TIM_OnePulse_Init(&htim22, TIM_OPMODE_SINGLE) != HAL_OK)
- {
- Error_Handler();
- }
- sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
- sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
- if (HAL_TIMEx_MasterConfigSynchronization(&htim22, &sMasterConfig) != HAL_OK)
- {
- Error_Handler();
- }
- sConfigOC.OCMode = TIM_OCMODE_PWM1;// PWM模式1
- sConfigOC.Pulse = 60;//初始化占空比
- sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;//當定時器計數值小于CCR1_Val時為高電平*/
- sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
- if (HAL_TIM_PWM_ConfigChannel(&htim22, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_TIM_PWM_ConfigChannel(&htim22, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
- {
- Error_Handler();
- }
- /* USER CODE BEGIN TIM22_Init 2 */
- /* USER CODE END TIM22_Init 2 */
- __HAL_RCC_GPIOA_CLK_ENABLE();
- /**TIM22 GPIO Configuration
- PA6 ------> TIM22_CH1
- PA7 ------> TIM22_CH2
- */
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF5_TIM22;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
-
-
- HAL_TIM_PWM_Start(&htim22,TIM_CHANNEL_1); //開啟PWM輸出
- //HAL_TIM_PWM_Start(&htim22,TIM_CHANNEL_2); //開啟PWM輸出
- __HAL_TIM_SET_COMPARE(&htim22,TIM_CHANNEL_1,50); //設置默認的占空比值
- //__HAL_TIM_SET_COMPARE(&htim22,TIM_CHANNEL_2,50); //設置默認的占空比值
- }
復制代碼 主函數調用初始化
- int main(void)
- {
- static U8 LedTimer;
- U8 temp;
- HAL_Init();
- SystemClock_Config();
- MX_ADC_Init();
- MX_GPIO_Init();
- MX_TIM2_Init();
- MX_TIM21_Init();
- MX_TIM22_Init();
復制代碼 主循環中持續輸出:
- while (1)
- {
- __HAL_TIM_SET_COMPARE(&htim22,TIM_CHANNEL_1,50); //設置默認的占空比值
- led_blink();
復制代碼
|