实验三 STM32的定时器应用实验

#include "stm32f4xx.h"
#include "stm32f4xx_conf.h"


uint32_t msCnt;
void SysTick_Handler(void)
{
  msCnt++;
}
void delayms(uint32_t t)
{
  uint32_t i,j;
  i = j = msCnt;
  while((j - i) < t)j = msCnt;
}

static unsigned char LEDSEG[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
static unsigned char LEDDIG[] = {0x0E,0x0D,0x0B,0x07}; //λѡ
static unsigned char LEDBuffer[4] = {0,0,0,0};         //ѧºÅ
static unsigned char LEDIndex=0;
static unsigned char LED_min1=0;
static unsigned char LED_min2=0;
static unsigned char LED_s1=0;
static unsigned char LED_s2=0;

/***********ÊýÂë¹ÜGPIOʹÄܺ¯Êý************/
void LEDPin_Init(void)
{
	GPIO_InitTypeDef MyGPIO;
	//GPIOE0-12 ʹÄÜ 
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
	MyGPIO.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 |
					          GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 |
					          GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_9 |
					          GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
    
	MyGPIO.GPIO_Mode = GPIO_Mode_OUT;      //Êä³öģʽ
	MyGPIO.GPIO_OType = GPIO_OType_PP;     //ÍÆÍìÊä³ö
	MyGPIO.GPIO_PuPd = GPIO_PuPd_NOPULL;   //²»ÉÏÀ­²»ÏÂÀ­
	MyGPIO.GPIO_Speed = GPIO_Speed_2MHz;   //2MHZËÙÂÊ
	
	GPIO_Init(GPIOE,&MyGPIO);
}

/***********GPIOA9³õʼ»¯º¯Êý************/
void LEDFANZHUAN_Init(void)
{
	GPIO_InitTypeDef MyGPIO;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
	MyGPIO.GPIO_Pin = GPIO_Pin_9;
	MyGPIO.GPIO_Mode = GPIO_Mode_OUT;
	MyGPIO.GPIO_OType = GPIO_OType_PP;
	MyGPIO.GPIO_PuPd = GPIO_PuPd_UP;
	MyGPIO.GPIO_Speed = GPIO_Speed_2MHz;
	
	GPIO_Init(GPIOA,&MyGPIO);
}

/***********°´¼üGPIO³õʼ»¯º¯Êý************/
void AJ_Init(void)   
{
	GPIO_InitTypeDef MyGPIO;

	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
	MyGPIO.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_5;
	MyGPIO.GPIO_Speed = GPIO_Speed_2MHz;
	MyGPIO.GPIO_PuPd = GPIO_PuPd_UP;
	MyGPIO.GPIO_Mode = GPIO_Mode_IN;
	GPIO_Init(GPIOA,&MyGPIO);
}

/***********°´¼üÖжϳõʼ»¯º¯Êý************/
void  Key_EXTI_Init(void)
{
	EXTI_InitTypeDef MyEXTI;
	
	RCC_APB2PeriphClockCmd(RCC_APB2ENR_SYSCFGEN,ENABLE);
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD,EXTI_PinSource1);
	
	MyEXTI.EXTI_Line = EXTI_Line1;              //EXTIÏß1
	MyEXTI.EXTI_Mode = EXTI_Mode_Interrupt;
	MyEXTI.EXTI_Trigger = EXTI_Trigger_Falling; //ϽµÑØ´¥·¢
	MyEXTI.EXTI_LineCmd = ENABLE;
	EXTI_Init(&MyEXTI);
}
void  Key1_EXTI_Init(void)
{
	EXTI_InitTypeDef MyEXTI;
	
	RCC_APB2PeriphClockCmd(RCC_APB2ENR_SYSCFGEN,ENABLE);
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD,EXTI_PinSource5);
	
	MyEXTI.EXTI_Line = EXTI_Line5;
	MyEXTI.EXTI_Mode = EXTI_Mode_Interrupt;
	MyEXTI.EXTI_Trigger = EXTI_Trigger_Falling;
	MyEXTI.EXTI_LineCmd = ENABLE;
	EXTI_Init(&MyEXTI);

}

/***********°´¼üNVICÓÅÏȼ¶³õʼ»¯***************/
void Key_NVIC_Init(void)
{
	NVIC_InitTypeDef MyNVIC;

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	MyNVIC.NVIC_IRQChannel = EXTI1_IRQn;
	MyNVIC.NVIC_IRQChannelPreemptionPriority = 0;
	MyNVIC.NVIC_IRQChannelSubPriority = 1;
	MyNVIC.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&MyNVIC);
}
void Key1_NVIC_Init()
{
	NVIC_InitTypeDef MyNVIC;
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	MyNVIC.NVIC_IRQChannel = EXTI9_5_IRQn;
	MyNVIC.NVIC_IRQChannelPreemptionPriority = 0;
	MyNVIC.NVIC_IRQChannelSubPriority = 0;
	MyNVIC.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&MyNVIC);
}

/***********ÖжÏÏìÓ¦º¯Êý**********/
void EXTI1_IRQHandler(void)    //¸Ä±äÃëÊý
{
	if(RESET != EXTI_GetFlagStatus(EXTI_Line1))
	{
		LED_s1++;
		EXTI_ClearITPendingBit(EXTI_Line1);
	}
}
void EXTI9_5_IRQHandler(void)  
{
	if(RESET != EXTI_GetFlagStatus(EXTI_Line5))
	{
		
		LED_min1++;
		EXTI_ClearITPendingBit(EXTI_Line5);	
	}
}

/***********¶¨Ê±Æ÷1¡¢2¡¢3NVICÓÅÏȼ¶³õʼ»¯***************/
void Timer_NVIC_Init(void)
{
	NVIC_InitTypeDef MyNVIC;
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	MyNVIC.NVIC_IRQChannel = TIM3_IRQn;
	MyNVIC.NVIC_IRQChannelPreemptionPriority =  2;
	MyNVIC.NVIC_IRQChannelSubPriority = 2;
	MyNVIC.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&MyNVIC);

}
void Timer2_NVIC_Init(void)
{
	NVIC_InitTypeDef MyNVIC;
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	MyNVIC.NVIC_IRQChannel = TIM2_IRQn;            //ÖжÏԴΪ¶¨Ê±Æ÷2
	MyNVIC.NVIC_IRQChannelPreemptionPriority = 1;  //¶¨Ê±Æ÷2ÇÀÕ¼ÓÅÏȼ¶Îª1
	MyNVIC.NVIC_IRQChannelSubPriority = 2;         //¶¨Ê±Æ÷2ÏìÓ¦ÓÅÏȼ¶Îª2
	MyNVIC.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&MyNVIC);

}
void Timer3_NVIC_Init(void)
{
	NVIC_InitTypeDef MyNVIC;
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	MyNVIC.NVIC_IRQChannel = TIM5_IRQn;
	MyNVIC.NVIC_IRQChannelPreemptionPriority = 1;
	MyNVIC.NVIC_IRQChannelSubPriority = 1;
	MyNVIC.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&MyNVIC);

}

/***********¶¨Ê±Æ÷3³õʼ»¯***************/
void TIM3_Init(void)
{
	TIM_TimeBaseInitTypeDef MyTIM;
	RCC_APB1PeriphClockCmd(RCC_APB1ENR_TIM3EN,ENABLE);
	
	MyTIM.TIM_Prescaler = 800-1;
	MyTIM.TIM_Period = 1000-1;
	MyTIM.TIM_CounterMode = TIM_CounterMode_Up;  //µÝÔö¼ÆÊý 
	MyTIM.TIM_ClockDivision = 0;
	
	TIM_TimeBaseInit(TIM3,&MyTIM);
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);     //ʹÄÜ
	TIM_Cmd(TIM3,ENABLE);
}

void TIM2_Init(void)
{
	TIM_TimeBaseInitTypeDef MyTIM;
	RCC_APB1PeriphClockCmd(RCC_APB1ENR_TIM2EN,ENABLE);
	
	MyTIM.TIM_Prescaler = 8-1;
	MyTIM.TIM_Period = 1000-1;
	MyTIM.TIM_CounterMode = TIM_CounterMode_Up;
	MyTIM.TIM_ClockDivision = 0;
	
	TIM_TimeBaseInit(TIM2,&MyTIM);
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
	TIM_Cmd(TIM2,ENABLE);
}

void TIM5_Init(void)
{
	TIM_TimeBaseInitTypeDef MyTIM;
	RCC_APB1PeriphClockCmd(RCC_APB1ENR_TIM5EN,ENABLE);
	
	MyTIM.TIM_Prescaler = 8-1;
	MyTIM.TIM_Period = 1000-1;
	MyTIM.TIM_CounterMode = TIM_CounterMode_Up;
	MyTIM.TIM_ClockDivision = 0;
	
	TIM_TimeBaseInit(TIM5,&MyTIM);
	TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);
	TIM_Cmd(TIM5,ENABLE);
}


void TIM1_CH1_PWM_Init(u32 arr,u32 psc)
{             
 
  GPIO_InitTypeDef GPIO_InitStructure;
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);   //TIM1ʱÖÓʹÄÜ    
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //ʹÄÜPORTAʱÖÓ    

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;             //GPIOA8
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;          //¸´Óù¦ÄÜ
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //ËÙ¶È50MHz
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;        //ÍÆÍ츴ÓÃÊä³ö
  GPIO_InitStructure.GPIO_PuPd =  GPIO_PuPd_NOPULL;     //ÉÏÀ­
  GPIO_Init(GPIOA,&GPIO_InitStructure);                 //³õʼ»¯PA8

  GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_TIM1); 
  TIM_DeInit(TIM1);
  TIM_TimeBaseStructure.TIM_Prescaler=psc;  //¶¨Ê±Æ÷·ÖƵ
  TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //ÏòÉϼÆÊýģʽ
  TIM_TimeBaseStructure.TIM_Period=arr;     //×Ô¶¯ÖØ×°ÔØÖµ
  TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
  TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
  TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
  TIM_OCInitStructure.TIM_Pulse = 0;


  TIM_OC1Init(TIM1, &TIM_OCInitStructure);           //¸ù¾ÝTÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIM9 OC2
  TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //ʹÄÜTIM1ÔÚCCR2ÉϵÄԤװÔؼĴæÆ÷
  TIM_CCxCmd(TIM1,  TIM_Channel_2,  TIM_CCx_Enable); //½ûÖ¹TIM1-CH2 Êä³öÐèÒªµ¥¶ÀʹÓÃTIM1-CH2ʱ´Ë´¦ÒòÉèÖÃΪ½ûÖ¹TIM1-CH2N Êä³ö
  TIM_ARRPreloadConfig(TIM1,ENABLE);   //ARPEʹÄÜ     
  TIM_Cmd(TIM1, ENABLE);               //ʹÄÜTIM1
  TIM_CtrlPWMOutputs(TIM1, ENABLE);
  TIM_SetCompare1(TIM1, 200);                                      
}  

void TIM3_IRQHandler (void)
{
	if(RESET != TIM_GetITStatus(TIM3,TIM_IT_Update))
	{
		LED_s1++;

		LEDBuffer[0] = LED_s1;
		LEDBuffer[1] = LED_s2;
		LEDBuffer[2] = LED_min1;
		LEDBuffer[3] = LED_min2;
							
		if(LED_min2==2)
		{
				if(LED_min1==3)
			{
					if(LED_s2==5)
				{
					if(LED_s1==9)
					{
							LED_s1 = 0;
							LED_s2 = 0;
							LED_min1 = 0;
							LED_min2 = 0;
						
					}
				}
			}
		}
		
		if(LED_min1==9)
		{
				if(LED_s2==5)
			{
				if(LED_s1==9)
				{
					LED_min2++;
					LED_min1=0;
				}
			}
		}
		
		if(LED_s2==5)
		{
			if(LED_s1==9)
			{
				LED_min1++;
				LED_s2=0;	
			}	
		}
		
		if(LED_s1==9)
		{

			LED_s2++;
			LED_s1=0;

		}
		
		TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
   	GPIO_Write(GPIOE,(LEDDIG[LEDIndex] << 9) | (LEDSEG[LEDBuffer[LEDIndex]]));
		if(++LEDIndex >= sizeof(LEDBuffer))LEDIndex = 0;	
	}
}

void TIM5_IRQHandler (void)
{
	if(RESET != TIM_GetITStatus(TIM5,TIM_IT_Update))
	{
		TIM_ClearITPendingBit(TIM5,TIM_IT_Update);
//		GPIO_Write(GPIOE,(LEDDIG[LEDIndex] << 9) | (LEDSEG[LEDBuffer[LEDIndex]]));
		if(++LEDIndex >= sizeof(LEDBuffer))LEDIndex = 0;
	}
}

void TIM2_IRQHandler (void)
{
	if(RESET != TIM_GetITStatus(TIM2,TIM_IT_Update))
	{
		GPIO_ToggleBits(GPIOA,GPIO_Pin_9);
		TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
	}
}

int main(void)
{   		
    if(SysTick_Config(SystemCoreClock / 1000)){while(1);} 
		TIM1_CH1_PWM_Init(1000-1,16-1);
		LEDPin_Init();
		Timer_NVIC_Init();
		TIM3_Init();
		AJ_Init();
		Key_EXTI_Init();
		Key1_EXTI_Init();
		Key_NVIC_Init();
		Key1_NVIC_Init();
		LEDFANZHUAN_Init();
		TIM2_Init();
		Timer2_NVIC_Init();
		Timer3_NVIC_Init();
		TIM5_Init();
		while(1)
		{
				
		}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你解答这个问题。 首先,PWM(Pulse-Width Modulation)是一种调制技术,可以用来控制电路中的电压或电流。在呼吸灯实验中,我们可以使用 PWM 技术来控制 LED 的亮度,实现呼吸灯效果。 在 STM32 中,可以使用定时器模块来实现 PWM 功能。具体步骤如下: 1. 选择一个可用的定时器模块,并配置其时钟源和预分频器。 2. 配置定时器模块为 PWM 模式,并设置 PWM 的周期和占空比。 3. 配置定时器模块的输出通道,将其连接到 LED 灯的控制引脚上。 4. 启动定时器模块,开始 PWM 输出。 下面是一个简单的呼吸灯实验代码示例: ```c #include "stm32f10x.h" #define LED_PIN GPIO_Pin_13 #define LED_PORT GPIOC void delay(uint32_t ms) { uint32_t i; while (ms--) { for (i = 0; i < 1000; i++); } } void led_pwm_breath(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; GPIO_InitTypeDef GPIO_InitStructure; // 使能定时器时钟和 GPIO 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 配置 LED 控制引脚为推挽输出 GPIO_InitStructure.GPIO_Pin = LED_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LED_PORT, &GPIO_InitStructure); // 配置定时器基本参数 TIM_TimeBaseStructure.TIM_Period = 1000; TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); // 配置定时器输出通道为 PWM 模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 500; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM1, &TIM_OCInitStructure); // 启动定时器 TIM_Cmd(TIM1, ENABLE); while (1) { // 增加占空比 for (int i = 0; i <= 1000; i += 10) { TIM_SetCompare1(TIM1, i); delay(10); } // 减小占空比 for (int i = 1000; i >= 0; i -= 10) { TIM_SetCompare1(TIM1, i); delay(10); } } } int main(void) { led_pwm_breath(); return 0; } ``` 在上面的代码中,我们使用 TIM1 定时器模块来控制 LED 的亮度。首先,我们配置 TIM1 的时钟源和预分频器,使其时钟频率为 1MHz。然后,我们将 LED 控制引脚 PC13 配置为推挽输出模式,将其连接到 TIM1 的通道 1 上。 接着,我们配置 TIM1 的输出通道 1 为 PWM1 模式,并设置 PWM 的周期为 1000(即 1kHz),占空比为 50%。最后,我们启动 TIM1 定时器,并在一个无限循环中不断增加和减小 PWM 的占空比,实现呼吸灯效果。 希望这个例子对你有帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值