STM32单片机PWM输出测试

STM32单片机PWM输出测试

 

本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.

 

环境:

主机:XP

开发环境:MDK4.23

MCU:STM32F103CBT6

 

说明:

使用内部8M晶振,倍频到64M供给TIM3定时器,PA6(通道1)上产生640K,50%方波


源代码:

初始化时钟:

//初始化RCC时钟
void init_rcc(void)
{
	//将外设 RCC寄存器重设为缺省值
	RCC_DeInit();
	//内部晶振使能
	RCC_HSICmd(ENABLE);
	//等待工作稳定
	while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);

	//LSI的启动,提供给看门狗时钟
 	RCC_LSICmd(ENABLE);												//打开LSI
 	while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY)==RESET);				//等待直到LSI稳定
 
	if(1)
	{
		//使能预取指缓存
		FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable ) ;
		//设置 FLASH存储器延时时钟周期数。(设置为延时2个时钟周期)
		FLASH_SetLatency( FLASH_Latency_2 ) ;
		//设置AHB时钟(HCLK)(这时设置为=系统时钟)
		RCC_HCLKConfig( RCC_SYSCLK_Div1 ) ;
		//设置SDIO的AHB时钟(HCLK2)(这时设置为=HCLK),64M
		RCC_PCLK2Config( RCC_HCLK_Div1 ) ;
		//设置APB1外设时钟(HCLK1)(这时设置为=HCLK/2),32M
		RCC_PCLK1Config( RCC_HCLK_Div2 ) ;
		// ADCCLK = PCLK2/8,1M
		RCC_ADCCLKConfig( RCC_PCLK2_Div8 ) ;

		//PLL的时钟来源及倍频的倍数,此处设置为64MHz
		RCC_PLLConfig(RCC_PLLSource_HSI_Div2,RCC_PLLMul_16) ;

		//使能PLL
		RCC_PLLCmd( ENABLE ) ;
		//检测PLL是否就绪
		while( RCC_GetFlagStatus( RCC_FLAG_PLLRDY ) == RESET ) ;
		//设置PLL为系统时钟
		RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK ) ;
		//检测系统的时钟源是否是PLL
		while( RCC_GetSYSCLKSource() != 0x08 ) ;
	}
}


初始化IO口和定时器:

//设置IO口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	
GPIO_Init(GPIOA, &GPIO_InitStructure);

//设置定时器3
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
//重新将Timer设置为缺省值
TIM_DeInit(TIM3);
//采用内部时钟给TIM3提供时钟源
TIM_InternalClockConfig(TIM3);

timInitStruct.TIM_ClockDivision = TIM_CKD_DIV2;   			
timInitStruct.TIM_Prescaler = 0;           					//计数频率为64M
timInitStruct.TIM_CounterMode = TIM_CounterMode_Up; 		//向上计数
timInitStruct.TIM_RepetitionCounter = 0;
timInitStruct.TIM_Period = 100; 							//这个值实际上就是TIMX->ARR,延时开始时重新设定即可

TIM_TimeBaseInit(TIM3, &timInitStruct);

//设置PWM输出
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 50;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

//ARR预装载缓冲器使能
TIM_ARRPreloadConfig(TIM3, ENABLE);
//开启定时器
TIM_Cmd(TIM3, ENABLE);				 						


输出波形:


 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
STM32单片机中,可以使用定时器模块来生成PWM信号。下面是一个基本的步骤: 1. 配置GPIO引脚:选择一个支持PWM输出的GPIO引脚,并将其配置为复用功能。可以使用`HAL_GPIO_Init()`函数来完成配置。 2. 配置定时器:选择一个合适的定时器,并进行配置。可以使用CubeMX工具进行可视化配置,或者使用相关的HAL库函数进行手动配置。重点是设置定时器的工作模式、时钟源、预分频器和计数模式。 3. 配置PWM模式:根据需求选择合适的PWM模式(单边或双边对称),并设置相关的参数,如占空比和周期。可以使用`HAL_TIM_PWM_Init()`函数初始化PWM模式。 4. 配置PWM通道:选择一个PWM通道,并设置相关参数,如GPIO引脚映射、通道极性和预分频系数。可以使用`HAL_TIM_PWM_ConfigChannel()`函数进行配置。 5. 启动定时器:使用`HAL_TIM_PWM_Start()`函数启动定时器和PWM输出。 下面是一个简单的示例代码,演示了如何在PA8引脚上输出一个占空比为50%、周期为1ms的PWM信号: ```c #include "stm32f4xx_hal.h" TIM_HandleTypeDef htim; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_TIM_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM_Init(); HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_1); while (1) { } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 25; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 7; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } 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_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { Error_Handler(); } } void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET); GPIO_InitStruct.Pin = GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF1_TIM1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } void MX_TIM_Init(void) { TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; __HAL_RCC_TIM1_CLK_ENABLE(); htim.Instance = TIM1; htim.Init.Prescaler = 83; htim.Init.CounterMode = TIM_COUNTERMODE_UP; htim.Init.Period = 8399; htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim.Init.RepetitionCounter = 0; if (HAL_TIM_PWM_Init(&htim) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 4199; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } } ``` 请注意,以上代码仅供参考,并可能需要根据您的具体情况进行适当的修改。建议参考相关的STM32文档和HAL库函数说明来了解更多细节和配置选项。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值