NUCLEO-L4R5ZI的PWM实现

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  
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟道xn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值