蓝桥杯嵌入式入坑系列 ----省赛第五届:双通道方波频率检测与倍频输出

/*赛题:第五届:双通道方波频率检测与倍频输出
**时间:2020-2-10
**注意:输入捕获的配置多理解  输出比较模式
**提醒:由于本题没有让LCD显示串口打印的内容,所以自己根据题意设置CH1  CH2显示不同的通道
*/

#include "stm32f10x.h"
#include "lcd.h"
#include "led.h"
#include "key.h"
#include "stdio.h"
#include "i2c.h"
#include "pwm.h"
#include "usart.h"

**第一部分**
/***************函数名的定义**** *****************/
u32 TimingDelay = 0;   //滴答定时器计数变量

u8 RXCOUNT = 0;        //串口接收计数变量
u8 RXBUF[20];          //串口接收数组变量
u8 RXOVER = 0;         //串口接收完成变量
u8 count = 0;          //串口接收位数变量
u8 i;                  //串口接收清除变量
u8 usart_flag =0;      //串口使能切换变量

u8 text1[20];          //LCD输出字符串变量1
u8 text2[20];          //LCD输出字符串变量2
u8 text3[20];          //LCD输出字符串变量3
u8 text4[20];          //LCD输出字符串变量4
u16 fre_1 = 0;       //通道1的频率
u16 fre_2 = 0;       //通道2的频率
u8 per_1 = 2;          //通道1的倍频
u8 per_2 = 2;          //通道2的倍频
u8 key1_temp = 0;      //“K1”按键:用于切换“本地设定”和“串口设定”。
u8 key2_temp = 0;      //“K2”按键:用于在两个通道之间来回切换
//u8 key3_temp = 0;      //“K3”按键:对当前通道的倍频数减 1,减到 1 时停止减数
//u8 key4_temp = 0;      //“K4”按键:对当前通道的倍频数加 1,加到 10 时停止加数;


/***************变量名的声明*********************/
extern u8 TIM2_CH2_CAPTURE_MODE;    //用来记录当前捕获在哪个位置
extern u32 TIM2_CH2_CAPTURE_HL;     //用来记录第二次捕获的时间
extern u8 TIM2_CH3_CAPTURE_MODE;    //用来记录当前捕获在哪个位置
extern u32 TIM2_CH3_CAPTURE_HL;     //用来记录第二次捕获的时间

/***************函数名的声明*********************/
void Delay_Ms(u32 nTime);
void RCC_Configuration(void);
void Scan_Key(void);
void LCD_Init(void);
void LCD_Display(void);
void PWM_IN_Frequency(void);
void _24c02_Write(u16 adr,u16 data);
u16 _24c02_Read(u16 adr);

/***************Main Body*********************/
int main(void)
{
	i2c_init();	
	LCD_Init();   
	RCC_Configuration();                //先外设开启时钟
	USART2_Configuration();
	TIM2_Configuration();
	TIM3_Configuration(1000,300);
	KEY_Configuration();
	LED_Configuration();
	while(1)
	{
		PWM_IN_Frequency();     
		LCD_Display();
		Scan_Key();
	}
}

/***************LCD_Init*********************/
void LCD_Init(void)
{
	SysTick_Config(SystemCoreClock/1000);	
	STM3210B_LCD_Init();
	LCD_Clear(Blue);
	LCD_SetBackColor(Blue);
	LCD_SetTextColor(White);	
//	_24c02_Write(0x01,2);
//	Delay_Ms(10);          //写函数之后间隔一段时间,确保写入完成
//	_24c02_Write(0x02,2);
//	Delay_Ms(10);
	per_1 = _24c02_Read(0x01);
	Delay_Ms(10);
	per_2 = _24c02_Read(0x02);	
	Delay_Ms(10);
}

/***************LCD_Display*********************/
void LCD_Display(void)
{
	sprintf((char*)text1,"Channel(1): %dHz    ",fre_1);
	LCD_DisplayStringLine(Line2,text1);
	sprintf((char*)text2,"N(1): %d            ",per_1);
	LCD_DisplayStringLine(Line3,text2);
	sprintf((char*)text3,"Channel(2): %dHz    ",fre_2);
	LCD_DisplayStringLine(Line4,text3);
	sprintf((char*)text4,"N(2): %d            ",per_2);
	LCD_DisplayStringLine(Line5,text4);
	
	if(usart_flag == 1)
	{
		if(RXOVER == 1)
		{
			RXOVER = 0;					
//			LCD_ClearLine(Line7);
//			LCD_DisplayStringLine(Line7,RXBUF);	  //本题没让显示发送的内容
			switch(RXBUF[4] - 48)  //判断是哪个通道
			{
				case   1:per_1 = (RXBUF[6] - 0x30);
								 if((RXBUF[6] - 0x30) == 1) per_1 =10;  //根据题意判断是否是10
								 LED_Control(LED1,0);
								 LED_Control(LED2,1);
								 break;
				
				case   2:per_2 = (RXBUF[6] - 0x30);
								 if((RXBUF[6] - 0x30) == 1) per_2 =10;  //根据题意判断是否是10
								 LED_Control(LED1,1);
								 LED_Control(LED2,0);
								 break;	
				default: break;			
			}	
			for(i=0;i<20;i++)
			{
				RXBUF[i]=0;
			}			
			USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
		}	
	}
}
/***************Delay_Ms*********************/
//入口参数:延时时间
void Delay_Ms(u32 nTime)
{
	TimingDelay = nTime;
	while(TimingDelay != 0);	
}
/***************Scan_Key*********************/
void Scan_Key(void)
{
	if(K1 == 0)
	{
		Delay_Ms(10);
		if(K1 == 0)
		{
			key1_temp++;
		  if(key1_temp == 1)    //表示按键按下一次 切换到串口设置
			{
				usart_flag = 1;
        LED_Control(LED1,1);
				LED_Control(LED2,1);
				LED_Control(LED3,0);
			}
			else
			{
				key1_temp = 0;
				usart_flag = 0;
				LED_Control(LED3,1);
			}		
		}
		while(K1 == 0);
	}
	if((K2 == 0) && (key1_temp == 0))
	{
		Delay_Ms(10);
		if((K2 == 0) && (key1_temp == 0))
		{
			if(key2_temp == 0)           //用于通道1
			{
				key2_temp =1;
				LED_Control(LED1,1);
				LED_Control(LED2,0);
			}
			else if(key2_temp == 1)      //用于通道2
			{
				key2_temp =0;
				LED_Control(LED1,0);
				LED_Control(LED2,1);
			}						
		}
		while(K2 == 0);
	}
	if((K3 == 0) && (key1_temp == 0))
	{
		Delay_Ms(10);
		if((K3 == 0) && (key1_temp == 0))
		{
      if(key2_temp == 0)   //通道1
			{
				if(1<per_1)
				per_1--;
				else
				per_1 = 1;
				_24c02_Write(0x01,per_1);
			}
			else if(key2_temp == 1)   //通道2
			{
				if(per_2>1)
				per_2--;
				else 
				per_2 = 1;
				_24c02_Write(0x02,per_2);
			}	
		}
		while(K3 == 0);
	}

	if((K4 == 0) && (key1_temp == 0))
	{
		Delay_Ms(10);
		if((K4 == 0) && (key1_temp == 0))
		{
      if(key2_temp == 0)   //通道1
			{
				if(per_1<10)
				per_1++;
				else 
				per_1 = 10;
				_24c02_Write(0x01,per_1);
			}
			else if(key2_temp == 1)   //通道2
			{
				if(per_2<10)
				per_2++;
				else 
				per_2 = 10;
				_24c02_Write(0x02,per_2);
			}	
		}
		while(K4 == 0);
	}
	
}
/***************PWM_IN_Frequency*********************/
void PWM_IN_Frequency(void)
{
	if(TIM2_CH2_CAPTURE_MODE == 3)
	{
		fre_1 = 1000000 / TIM2_CH2_CAPTURE_HL;
		if((fre_1 < 50) || (fre_1 > 50000))
		{
		  Ch1_Enable = 1;
			sprintf((char*)text1,"Channel(1): %dHz    ",fre_1);
			LCD_DisplayStringLine(Line2,text1);
			TIM3_Configuration(fre_1 * per_1,fre_2);
		}
		else
   {
	    Ch1_Enable = 0;
	 }
	 TIM2_CH2_CAPTURE_MODE = 0;
	}
	else if(TIM2_CH3_CAPTURE_MODE == 3)
	{
		fre_2 = 1000000 / TIM2_CH3_CAPTURE_HL;
		if((fre_2 < 50) || (fre_2 > 50000))
		{
		  Ch2_Enable = 1;
			sprintf((char*)text3,"Channel(2): %dHz    ",fre_2);
			LCD_DisplayStringLine(Line4,text3);
			TIM3_Configuration(fre_1,fre_2 * per_2);
		}
		else
   {
	   Ch2_Enable = 0;
	 }
	TIM2_CH2_CAPTURE_MODE = 0;
  }	
}

/***************RCC_Configuration*********************/
void RCC_Configuration(void)
{
	/* GPIOx enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
  /* TIM3 clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	/* USART2 enable */
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
}

/***************_24c02_Write*********************/
//入口参数:写入地址,数据
void _24c02_Write(u16 adr,u16 data)
{
	I2CStart();
	I2CSendByte(0xa0);
	I2CWaitAck();
	I2CSendByte(adr);
	I2CWaitAck();
	I2CSendByte(data);
	I2CWaitAck();
	I2CStop();
}
/***************_24c02_Read*********************/
//入口参数:读取地址
u16 _24c02_Read(u16 adr)
{
	u16 temp;
	I2CStart();
	I2CSendByte(0xa0);
	I2CWaitAck();
	I2CSendByte(adr);
	I2CWaitAck();

	I2CStart();
	I2CSendByte(0xa1);
	I2CWaitAck();
	temp = I2CReceiveByte();
	I2CWaitAck();
	I2CStop();
	return temp;
}
``

**第二部分**
//初始化的配置
#include "led.h"
#define LED1 GPIO_Pin_8
#define LED2 GPIO_Pin_9
#define LED3 GPIO_Pin_10
#define LED4 GPIO_Pin_11
#define LED5 GPIO_Pin_12
#define LED6 GPIO_Pin_13
#define LED7 GPIO_Pin_14
#define LED8 GPIO_Pin_15
#define LEDALL GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15
//led初始化函数
void LED_Configuration(void)
{	
	GPIO_InitTypeDef GPIO_InitStructure;
	
	GPIO_InitStructure.GPIO_Pin = LEDALL;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOC, &GPIO_InitStructure);
	
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOD, &GPIO_InitStructure);
	
	GPIO_SetBits(GPIOD,GPIO_Pin_2);
	GPIO_SetBits(GPIOC,LEDALL);
	GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}



//led控制函数
//输入参数ledx:      GPIO_Pin_x(PC8 - PC15)
//输入参数led_sta:   0:点亮   1;熄灭
void LED_Control(u16 ledx,u16 led_sta)
{
	if(led_sta == 0)
	{
		GPIO_SetBits(GPIOD,GPIO_Pin_2);
		GPIO_ResetBits(GPIOC,ledx);
		GPIO_ResetBits(GPIOD,GPIO_Pin_2);
	}	
	else
	{
		GPIO_SetBits(GPIOD,GPIO_Pin_2);
		GPIO_SetBits(GPIOC,ledx);
		GPIO_ResetBits(GPIOD,GPIO_Pin_2);		
	}
}

#include "key.h"
#define K1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define K2 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)
#define K3 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)
#define K4 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)
//按键初始化函数
void KEY_Configuration(void)
{	
	GPIO_InitTypeDef GPIO_InitStructure;
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_8;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
}

#include "usart.h"

//串口接收配置
void USART2_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	  /* Configure USART2 RTS and USART2 Tx as alternate function push-pull */
//  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
//  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//  GPIO_Init(GPIOA, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
	
  USART_InitStructure.USART_BaudRate = 9600;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No ;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx;                //本题只用接收不用发送,就不会引起和定时器PA2的冲突
  USART_Init(USART2, &USART_InitStructure);
	
	  /* Enable the TIM3 global Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
	
	USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
  /* Enable the USART2 */
  USART_Cmd(USART2, ENABLE);	
}


//串口发送函数
//void USART2_SendString(u8 *str)
//{
//	u8 index = 0;
//	do
//	{
//		USART_SendData(USART2,str[index]);		
//	  while(USART_GetFlagStatus(USART2,USART_FLAG_TXE) == RESET);//等待电平为高电平说明才发送完一字节
//		index++;
//	}
//  while(str[index] != 0);
//}

#include "pwm.h"

u32 TIM3_Ch1_Val =0;    //输出PWM通道1的占空比值
u32 TIM3_Ch2_Val =0;    //输出PWM通道2的占空比值
u8 Ch1_Enable = 1;          //通道1的使能值
u8 Ch2_Enable = 1;          //通道2的使能值


//输入捕获配置
void TIM2_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_ICInitTypeDef  TIM_ICInitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  NVIC_InitTypeDef NVIC_InitStructure;	
	
  /* TIM2 channe2 3 pin (P1.02) configuration */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);	

  /* TIM2 configuration: Input Capture mode ---------------------*/
  TIM_ICInitStructure.TIM_Channel = TIM_Channel_2 ;
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  TIM_ICInitStructure.TIM_ICFilter = 0x0;	
	TIM_ICInit(TIM2, &TIM_ICInitStructure);

  TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  TIM_ICInitStructure.TIM_ICFilter = 0x0;	
	TIM_ICInit(TIM2, &TIM_ICInitStructure);
	
  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 0xffff;
  TIM_TimeBaseStructure.TIM_Prescaler = 71;
  TIM_TimeBaseStructure.TIM_ClockDivision =0x0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
	
  /* Enable the TIM3 global Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  /* TIM enable counter */
  TIM_Cmd(TIM2, ENABLE);
//	TIM_ClearFlag(TIM2, TIM_IT_CC2 | TIM_IT_CC3); //清除中断标志
  /* Enable the CC2 Interrupt Request */
  TIM_ITConfig(TIM2, TIM_IT_CC2 | TIM_IT_CC3, ENABLE);
	
}

//输出比较配置
void TIM3_Configuration(u32 ch2_fre,u32 ch3_fre)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;	
	
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);	
	
  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 0xffff;
  TIM_TimeBaseStructure.TIM_Prescaler = 71;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);	            //一定要注意有通道选择序号时候是不是一致
	

	TIM3_Ch1_Val = 1000000 / ch2_fre;	
	TIM3_Ch2_Val = 1000000 / ch3_fre;
	
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = TIM3_Ch1_Val;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
	if(Ch1_Enable)
	{
	   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	}
	else
	{
	  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
	}
  TIM_OC1Init(TIM3, &TIM_OCInitStructure);	
	
	if(Ch2_Enable)
	{
	   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	}
	else
	{
	  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
	}
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  TIM_OCInitStructure.TIM_Pulse = TIM3_Ch2_Val;
  TIM_OC2Init(TIM3, &TIM_OCInitStructure);
	
  /* Enable the TIM3 global Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

//	TIM_SetCounter(TIM3, 0x0);
//	TIM_SetCompare1(TIM3, 0x0);
//	TIM_SetCompare2(TIM3, 0x0);
	TIM_ITConfig(TIM3, TIM_IT_CC1|TIM_IT_CC2 , ENABLE);   //用到中断处理的方式去
  /* TIM3 enable counter */
  TIM_Cmd(TIM3, ENABLE);
}

 **第三部分**
//中断处理函数
#include "stm32f10x_it.h"
#include "pwm.h"
extern u32 TimingDelay;
u8 CAPTURE_Flag=0;               //TIM2通道获取标志位
u16 capture = 0;                 //TIM3通道获取当前通道的值
u8 TIM2_CH2_CAPTURE_MODE = 0;    //用来记录当前捕获在哪个位置
u32 TIM2_CH2_CAPTURE_H = 0;      //用来记录第一次捕获的时间
u32 TIM2_CH2_CAPTURE_HL = 0;     //用来记录第二次捕获的时间
u8 TIM2_CH3_CAPTURE_MODE = 0;    //用来记录当前捕获在哪个位置
u32 TIM2_CH3_CAPTURE_H = 0;      //用来记录第一次捕获的时间
u32 TIM2_CH3_CAPTURE_HL = 0;     //用来记录第二次捕获的时间

extern u8 count;
extern u8 RXCOUNT;
extern u8 RXBUF[20];
extern u8 RXOVER;

//滴答中断定时
void SysTick_Handler(void)
{
  static u8 CAPTURE_sum = 0;
	TimingDelay--;
	
	if(++CAPTURE_sum == 200)
	{
	  CAPTURE_sum = 0;
		CAPTURE_Flag ^=1;
	}
}

/**********************************只可以计算频率******************************
void TIM2_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM2, TIM_IT_CC2) == 1)
	{
		TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
		if(!CAPTURE_Flag)
		{
			switch(TIM2_CH2_CAPTURE_MODE)
			{
				case 0: TIM2_CH2_CAPTURE_HL = 0;
						    TIM2_CH2_CAPTURE_MODE = 1;
						    TIM_SetCounter(TIM2,0x0);
						    break;
				case 1: TIM2_CH2_CAPTURE_HL = TIM_GetCounter(TIM2);
						    TIM2_CH2_CAPTURE_MODE = 2;
						    break;
				default:break;
			}
		}else
		{
			TIM2_CH2_CAPTURE_MODE = 0;
		}
	}
		
		
	if(TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)
	{
		TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);
		if(CAPTURE_Flag)
		{
			switch(TIM2_CH3_CAPTURE_MODE)
			{
				case 0: TIM2_CH3_CAPTURE_HL = 0;
						    TIM2_CH3_CAPTURE_MODE = 1;
						    TIM_SetCounter(TIM2,0x0);
						    break;
				case 1: TIM2_CH3_CAPTURE_HL = TIM_GetCounter(TIM2);
						    TIM2_CH3_CAPTURE_MODE = 2;
						    break;
				default:break;
			}
		}else
		{
			TIM2_CH3_CAPTURE_MODE = 0;
		}
	}
}
******************************************************/

/****************可以计算频率和占空比***************/
void TIM2_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM2,TIM_IT_CC2) == 1)
	{
		TIM_ClearITPendingBit(TIM2,TIM_IT_CC2);
		if(CAPTURE_Flag)
		{
				switch(TIM2_CH2_CAPTURE_MODE)
				{
					case 0: 
						      TIM2_CH2_CAPTURE_HL = 0;
					        TIM2_CH2_CAPTURE_H = 0;
					        TIM2_CH2_CAPTURE_MODE = 1;
									TIM_SetCounter(TIM2,0x0);
					        TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Falling);  //TIM_ICPolarity_Falling
					        break;					
					case 1: 
						      TIM2_CH2_CAPTURE_H = TIM_GetCounter(TIM2);
					        TIM2_CH2_CAPTURE_MODE = 2;
					        TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Rising);
					        break;
					case 2:
						     TIM2_CH2_CAPTURE_HL = TIM_GetCounter(TIM2);
					       TIM2_CH2_CAPTURE_MODE = 3;
					       TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Rising);
					        break;
          default: break;					
				}
		}
		else
		{
			TIM2_CH2_CAPTURE_MODE = 0;		
		}
	}

	if(TIM_GetITStatus(TIM2,TIM_IT_CC3) == 1)
	{
		TIM_ClearITPendingBit(TIM2,TIM_IT_CC3);
		if(!CAPTURE_Flag)
		{
				switch(TIM2_CH3_CAPTURE_MODE)
				{
					case 0: 
						      TIM2_CH3_CAPTURE_HL = 0;
					        TIM2_CH3_CAPTURE_H = 0;
					        TIM2_CH3_CAPTURE_MODE = 1;
									TIM_SetCounter(TIM2,0x0);
					        TIM_OC3PolarityConfig(TIM2,TIM_ICPolarity_Falling);  //TIM_ICPolarity_Falling
					        break;
					
					case 1: 
						      TIM2_CH3_CAPTURE_H = TIM_GetCounter(TIM2);
					        TIM2_CH3_CAPTURE_MODE = 2;
					        TIM_OC3PolarityConfig(TIM2,TIM_ICPolarity_Rising);
					        break;
					case 2:
						     TIM2_CH3_CAPTURE_HL = TIM_GetCounter(TIM2);
					       TIM2_CH3_CAPTURE_MODE = 3;
					       TIM_OC3PolarityConfig(TIM2,TIM_ICPolarity_Rising);
					        break;
          default: break;					
				}
		}
		else
		{
			TIM2_CH3_CAPTURE_MODE = 0;		
		}
	}	
}


/****************输出PWM比较中断函数***************/
void TIM3_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM3,TIM_IT_CC1) == 1)
	{	
		TIM_ClearITPendingBit(TIM3,TIM_IT_CC1);
		capture = TIM_GetCapture1(TIM3);
		TIM_SetCompare1(TIM3,capture + TIM3_Ch1_Val *1/2);	
	}
	
  if(TIM_GetITStatus(TIM3,TIM_IT_CC2) == 1)
	{	
		TIM_ClearITPendingBit(TIM3,TIM_IT_CC2);
		capture = TIM_GetCapture2(TIM3);
		TIM_SetCompare2(TIM3,capture + TIM3_Ch2_Val *1/2);		
	}
}

/****************USART2通信中断***************/
void USART2_IRQHandler(void)
{
	u8 temp;
	if(USART_GetFlagStatus(USART2, USART_IT_RXNE) == SET)
	{
		USART_ClearITPendingBit(USART2,USART_IT_RXNE);
		temp = USART_ReceiveData(USART2);
		if((temp == '\n') || (RXCOUNT == 20))//回车换行
		{
			count = RXCOUNT-1;
//			RXBUF[RXCOUNT-1] = 0;  //避免\r显示在LCD发生的乱码
			RXCOUNT =0;
			RXOVER = 1;
			USART_ITConfig(USART2,USART_IT_RXNE,DISABLE);
		}
		else 
		{ 
			RXBUF[RXCOUNT] = temp;
		  RXCOUNT++;		
		}
	}
}

逻辑分析仪结果如下:杜邦线连接PA1/PA2 ----PA7 / PA6即可观察输入频率
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200221135257339.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDIzNjMwMg==,size_16,color_FFFFFF,t_70)
输入捕获主要借鉴大佬的思想
[详细可见](https://blog.csdn.net/qq_34952376/article/details/81172774)
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值