当前位置: 代码迷 >> 综合 >> NUCLEO-L4R5ZI的PWM实现
  详细解决方案

NUCLEO-L4R5ZI的PWM实现

热度:98   发布时间:2024-03-09 08:55:12.0

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);//基本定时器配置 BASEhtim3.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 也就是周期为1mspwm_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 通道一 pc6HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);//开启pwm 通道二 pc7HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);//开启pwm 通道三 pc8HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);//开启pwm 通道四 pc9}

现在初始化PWM.h文件内容

#ifndef __pwm_H
#define __pwm_Hvoid 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();//这块一定不要忘记,出现错误不用管,好像就是一个BUGTIM3_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