#include "Etg.h"
#include <rtthread.h>
#include "stm32f10x.h"
//输入为c4
void GPIOconfiguration(void);//配置频率输出端口
void RCC_Configuration(void);
void TIM_PWMconf(int,int);
void TIM4_conf(void);
void TIM4_IRQHandler(void);//溢出中断服务程序
void EXIT_fre(void);//配置按键的外部中断
void EXTI0_IRQHandler(void);//甲按键
void EXTI1_IRQHandler(void);//乙按键
void TIM3_IRQHandler(void);//溢出中断服务程序
void TIM3scamconf(void);//配置一百分之一秒数码管扫描时钟3及其中断
void Display(int );//数码管显示一位数
int Channel1Pulse=0, Channel2Pulse=0,flag,countA=0,countB=0,scani=1,timeA=0,timeB=0;//flag为1 x往正方向 为0 x往负方向
//const unsigned char led_change[8]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07} ;
rt_thread_t ETG_main_tid = RT_NULL; //主线程ID
//主线程入口点
//在此编写自己的程序
void ETG_main_thread_entry(void* parameter)
{
flag=1;
RCC_Configuration();
GPIOconfiguration();
EXIT_fre();
TIM_PWMconf(Channel1Pulse,Channel2Pulse);
TIM4_conf();
TIM3scamconf();
while(1);
}
void RCC_Configuration(void)
{
RCC_AHBPeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//打开TM3外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //输入组
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //输入按键
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); //数码管显示
}
void GPIOconfiguration(void)//配置频率输出端口
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;//pa0(tim2_chi) pa1(itm2_ch2)
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//模拟输入
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);//一用于输入方波,二用于输入放大后的正弦波
//按键输入
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC, &GPIO_InitStruct);
//数码管
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStruct);//用于数码管显示
}
void TIM4_IRQHandler(void)//溢出中断服务程序
{
TIM_OCInitTypeDef TIM_OCInitStructure;
//rt_kprintf("asfghjsdfghj");
if(TIM_GetITStatus(TIM4,TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
//rt_kprintf("%d\n",count);
if(flag==1)
{
if(Channel1Pulse==200)
{
timeB=0;
timeA=0;
flag=0;
countA++;
}
else
{
Channel1Pulse=Channel1Pulse+5;
Channel2Pulse=(-(Channel1Pulse*Channel1Pulse)/50)+4*Channel1Pulse;
if(timeB>1)//击两次高抛
TIM_PWMconf(Channel1Pulse,Channel2Pulse);
else if(timeB==1) //低抛
TIM_PWMconf(Channel1Pulse,Channel2Pulse/3);//?????????????????????
}
}
else if(flag==0)
{
if(Channel1Pulse==0)
{
timeA=0;
timeB=0;
flag=1;
countB++;
}
else
{
//y+ x-
Channel1Pulse=Channel1Pulse-5;
Channel2Pulse=(-(Channel1Pulse*Channel1Pulse)/50)+4*Channel1Pulse;
if(timeA>1)//击两次高抛
TIM_PWMconf(Channel1Pulse,Channel2Pulse);
else if(timeA==1) //低抛
TIM_PWMconf(Channel1Pulse,Channel2Pulse/3);//?????????????????????
//TIM_PWMconf(Channel1Pulse,Channel2Pulse);
}
}
}
}
void TIM_PWMconf(int Channel1Pulse,int Channel2Pulse)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//定时器2配置为1khz 向上计数
TIM_TimeBaseStructure.TIM_Prescaler = 359;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = 199;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
//TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
//通道1为x 通道2为y
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_Pulse = Channel1Pulse; //?????
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);
TIM_OCInitStructure.TIM_Pulse = Channel2Pulse;
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);
TIM_ClearFlag(TIM2,TIM_FLAG_Update);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //打开中断溢出中断
TIM_ARRPreloadConfig(TIM2,ENABLE);
TIM_Cmd(TIM2, ENABLE);
// TIM_CtrlPWMOutputs(TIM2, ENABLE);
}
void TIM4_conf(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;//配置中断向量
//定时器2配置为1khz 向上计数
TIM_TimeBaseStructure.TIM_Prescaler =719;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = 12500;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
//使能TM4溢出中断 在中断配置中,使能了TM4高优先级中断
NVIC_InitStructure.NVIC_IRQChannel= TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_ClearFlag(TIM4,TIM_FLAG_Update);
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); //打开中断溢出中断
TIM_Cmd(TIM4, ENABLE);
// TIM_CtrlPWMOutputs(TIM2, ENABLE);
}
void EXIT_fre(void)//配置按键的外部中断
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;//配置中断向量
/* Connect EXTI0 Line to PC.00 pin 为甲 PC1为乙*/
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource0);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource1);
/* Configure EXTI0 line */
EXTI_InitStructure.EXTI_Line = EXTI_Line0|EXTI_Line1;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
/* Enable and set EXTI0 Interrupt to the lowest priority */
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI0_IRQHandler(void) //甲按键
{
rt_kprintf("jia ");
if(EXTI_GetITStatus(EXTI_Line0) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line0);
if(flag==0&&Channel1Pulse<100) //第一次
{
if(timeA==0) //???????????????????
flag=1;
timeA++;
timeB=0;
}
if(flag==1&&Channel1Pulse<100&&timeA>0)
timeA++;
}
}
void EXTI1_IRQHandler(void)//乙按键
{
rt_kprintf("yi ");
if(EXTI_GetITStatus(EXTI_Line1) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line1);
if(flag==1&&Channel1Pulse>100) //第一次
{
if(timeB==0) //???????????????????
flag=0;
timeB++;
timeA=0;
}
if(flag==0&&Channel1Pulse<100&&timeB>0)
timeB++;
}
}
void TIM3scamconf(void)//配置一百分之一秒数码管扫描时钟3及其中断
{
NVIC_InitTypeDef NVIC_InitStructure;//配置中断向量
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //配置时基
TIM_