NUCLEO-L4R5ZI的PWM实现
NUCLEO-L4R5ZI用HAL库实现pwm
**首先创建PWM.C文件**
#include "pwm.h"
#include "stm32l4xx_hal.h"
TIM_HandleTypeDef htim3;
//函数说明:使用TIM3因为是16位预分频器
//咱这块使用的就是TIM3的定时器通道
void TIM3_Init()
{
/*初始化TIM*/
TIM_OC_InitTypeDef pwm_Init;
GPIO_InitTypeDef GPIO_Init;
//开启时钟
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_TIM3_CLK_ENABLE();
GPIO_Init.Pin=GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6;
GPIO_Init.Mode=GPIO_MODE_AF_PP;//复用输出
GPIO_Init.Pull=GPIO_PULLUP;
GPIO_Init.Speed=GPIO_SPEED_FREQ_HIGH; //25mHZ到50Mhz 这里我们使用这些也够用了
GPIO_Init.Alternate=GPIO_AF2_TIM3;
HAL_GPIO_Init(GPIOE,&GPIO_Init);
//基本定时器配置 BASE
htim3.Instance= TIM3; //设置时基单元
htim3.Init.Prescaler=1199;
htim3.Init.CounterMode=TIM_COUNTERMODE_UP;
htim3.Init.Period=99; //计数周期 1khz的重装频率 这块可以根据需要进行更改CCR寄存器值
htim3.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1 ; //120MHZ /1199+1 =100khz 100khz/99+1=1khz 也就是周期为1ms
pwm_Init.OCMode=TIM_OCMODE_PWM1;//定义为 pwm1模式
pwm_Init.Pulse=90; //占空比 在ARR寄存器上进行比较 50/99+1 也就是50%电压
pwm_Init.OCPolarity=TIM_OCPOLARITY_HIGH ; //输出极性高 也就是有效电平为高电平
HAL_TIM_PWM_ConfigChannel(&htim3,&pwm_Init,TIM_CHANNEL_1); //pwm使能tim通道
HAL_TIM_PWM_ConfigChannel(&htim3,&pwm_Init,TIM_CHANNEL_2);
HAL_TIM_PWM_ConfigChannel(&htim3,&pwm_Init,TIM_CHANNEL_3);
HAL_TIM_PWM_ConfigChannel(&htim3,&pwm_Init,TIM_CHANNEL_4);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);//开启pwm 通道一 pc6
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);//开启pwm 通道二 pc7
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);//开启pwm 通道三 pc8
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);//开启pwm 通道四 pc9
}
现在初始化PWM.h文件内容
#ifndef __pwm_H
#define __pwm_H
void TIM3_Init(void);
#endif
main函数
#include "stm32l4xx_hal.h"
#include "pwm.h"
#include "stm32l4xx_hal_conf.h"
extern TIM_HandleTypeDef htim3;
int main(void)
{
HAL_Init();
SystemClock_Config_120();//这块一定不要忘记,出现错误不用管,好像就是一个BUG
TIM3_Init();
}
//创建系统时钟配置 NUCLEO_L4R5ZI 是120MHZ得单独配置
void SystemClock_Config_120(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_PeriphCLKInitTypeDef PeriphClkInit;
/**Configure the main internal regulator output voltage
*/
if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1_BOOST) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
/**Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
RCC_OscInitStruct.MSIState = RCC_MSI_ON;
RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
RCC_OscInitStruct.PLL.PLLM = 1;
RCC_OscInitStruct.PLL.PLLN = 60;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
/**Initializes the CPU, AHB and APB busses 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_5) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
PeriphClkInit.AdcClockSelection = RCC_ADCCLKSOURCE_PLLSAI1;
PeriphClkInit.PLLSAI1.PLLSAI1Source = RCC_PLLSOURCE_MSI;
PeriphClkInit.PLLSAI1.PLLSAI1M = 1;
PeriphClkInit.PLLSAI1.PLLSAI1N = 60;
PeriphClkInit.PLLSAI1.PLLSAI1P = RCC_PLLP_DIV2;
PeriphClkInit.PLLSAI1.PLLSAI1Q = RCC_PLLQ_DIV2;
PeriphClkInit.PLLSAI1.PLLSAI1R = RCC_PLLR_DIV2;
PeriphClkInit.PLLSAI1.PLLSAI1ClockOut = RCC_PLLSAI1_ADC1CLK;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
/**Configure the Systick interrupt time
*/
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
/**Configure the Systick
*/
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
/* SysTick_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
void _Error_Handler(char * file, int line)
{
while(1) {}
}
必不可少的易忘项
在stm32l4xx_hal_conf.h里面一定要打开
#define HAL_TIM_MODULE_ENABLED