中科深谷stm32f4pwm

中科深谷stm32f4pwm

#include "stm32f4xx.h"
#include "sys.h"

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;

void delay_us(uint32_t nus)
{
	SysTick->CTRL = 0; // 关闭滴答定时器
	SysTick->LOAD = (SystemCoreClock/8/1000000)*nus; // 计数值
	SysTick->VAL = 0; // 清空当前值和状态标志位
	SysTick->CTRL = 1; // 启动定时器工作
	// 检测CTRL的第16位是否为0,如果为0表示定时时间到达
	while ((SysTick->CTRL & 0x00010000)==0);
	
	SysTick->CTRL = 0; //失能(关闭)滴答定时器
}

void delay_ms(uint32_t nms)
{	
	while(nms--)
	{
		SysTick->CTRL = 0; // 关闭滴答定时器
		SysTick->LOAD = (SystemCoreClock/8/1000); // 计数值
		SysTick->VAL = 0; // 清空当前值和状态标志位
		// 选择时钟源(如果是5表示选择168M工作,如果是1选择21M工作)并启动定时器工作
		SysTick->CTRL = 1; 
		// 检测CTRL的第16位是否为0,如果为0表示定时时间到达
		while ((SysTick->CTRL & 0x00010000)==0);
		
		SysTick->CTRL = 0; //失能(关闭)滴答定时器
	}
	
}

void init_timer14(void)
{
	// 使能定时器14,时钟确定是APB1等于42MHZ,TIM3时钟源为 42M*2 = 84M
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);
	

	// 配置定时时间
	TIM_TimeBaseStructure.TIM_Period = (100)-1; //ARR寄存器,重装载值
	TIM_TimeBaseStructure.TIM_Prescaler = 8400-1; // 预分频器
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; // 二次分频,没有
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数
	TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure);
	
	// 讲定时器14配置为pwm1
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // PWM模式1,只要TIMX_CNT < TIMX_CCR1,通道1为有效电平
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;// PWM输出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 高电平有效
	
	TIM_OC1Init(TIM14, &TIM_OCInitStructure);
	
	TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable); // 自动重载使能

	
	TIM_Cmd(TIM14, ENABLE);

}

void init_timer13(void)
{
	// 使能定时器13,时钟确定是APB1等于42MHZ,TIM3时钟源为 42M*2 = 84M
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM13, ENABLE);
	

	// 配置定时时间
	TIM_TimeBaseStructure.TIM_Period = (100)-1; //ARR寄存器,重装载值
	TIM_TimeBaseStructure.TIM_Prescaler = 8400-1; // 预分频器
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; // 二次分频,没有
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数
	TIM_TimeBaseInit(TIM13, &TIM_TimeBaseStructure);
	
	// 讲定时器13配置为pwm1
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // PWM模式1,只要TIMX_CNT < TIMX_CCR1,通道1为有效电平
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;// PWM输出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 高电平有效
	
	TIM_OC1Init(TIM13, &TIM_OCInitStructure);
	
	TIM_OC1PreloadConfig(TIM13, TIM_OCPreload_Enable); // 自动重载使能

	
	TIM_Cmd(TIM13, ENABLE);
	
}


void init_led(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // 复用模式
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOF, &GPIO_InitStructure);
	
	// 将GPIOF9绑定定时器14
	GPIO_PinAFConfig(GPIOF, GPIO_PinSource9, GPIO_AF_TIM14);

	
	PFout(9) = 1;
	PFout(10) = 1;

}

//初始化蜂鸣器
void init_bee(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // 复用模式
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
	GPIO_Init(GPIOF, &GPIO_InitStructure);
	
	// 将GPIOF9绑定定时器13
	GPIO_PinAFConfig(GPIOF, GPIO_PinSource8, GPIO_AF_TIM13);
	
	PFout(8)=0;
	
}

int main(void)
{
	uint32_t pwm_cmp;
	// 设置系统时钟源8分频,21M
	SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
	init_led();
	init_timer14();
	init_bee();
	init_timer13();
	
	while(1)
	{
		// 注意100是ARR的值,不要大于ARR
//		for(pwm_cmp = 1; pwm_cmp < 100; pwm_cmp++)
//		{
		while(1)
		{
			pwm_cmp=10;
			TIM_SetCompare1(TIM13,pwm_cmp);
			//TIM_SetCompare1(TIM13,pwm_cmp);
			// 延时20ms
			delay_ms(20);
		}

//		}
//		for(pwm_cmp = 100; pwm_cmp >0; pwm_cmp--)
//		{
//			TIM_SetCompare1(TIM14,pwm_cmp);
//			delay_ms(20);
//		}
		
	}
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值