Display_Change();//通过读取A3管脚IO口的状态选择打点还是画线
delay_init(); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位u32 temp1=0,temp2=0; u16 i=0,j=0;
响应优先级
uart_init(9600); //串口初始化为9600
//LED端口初始化
LED_Init();
LCD_Init();
TIM3_Int_Init(1999,719);//每5ms进一次定时器3中断,进行液晶屏显示
TIM5_Cap_Init(0XFFFF,72-1); //以1Mhz的频率计数 (每计数一次为1u
秒)
LCD_ShowChar(10,210,'(',16,0); LCD_ShowChar(90,210,')',16,0); LCD_ShowChar(50,210,',',16,0); POINT_COLOR=RED;
LCD_Clear(YELLOW);//背景色为黄色
while(1)
{
//进行400次输入捕获,理论应该执行800ms,
for(i=0;i<400;i++)
待验证
{
if(TIM5CH1_CAPTURE_STA&0X80)//成功完成一次捕获
11
{ cap_num1++;
temp1=TIM5CH1_CAPTURE_STA&0X3F;
temp1*=65536; //溢出时间总和 temp1+=TIM5CH1_CAPTURE_VAL; //得到总的高电平时间 sum1+=temp1;
TIM5CH1_CAPTURE_STA=0; //开启下一次捕获
}
if(TIM5CH2_CAPTURE_STA&0X80)//成功完成一次捕获 { cap_num2++;
temp2=TIM5CH2_CAPTURE_STA&0X3F;
temp2*=65536; //溢出时间总和 temp2+=TIM5CH2_CAPTURE_VAL; //得到总的高电平时间 sum2+=temp2;
TIM5CH2_CAPTURE_STA=0; //开启下一次捕获
}
}
t1=sum1/cap_num1;//求平均值,提高捕获精度 printf(\通道1High:%d us\\r\\n\ sum1=0; cap_num1=0;
t2=sum2/cap_num2;
printf(\通道2High:%d us\\r\\n\
12
sum2=0;
cap_num2=0;
xp=xx/2.5; yp=140-yy/2.5;
if(xp>10&&xp<210&&yp>10&&yp<150)//判断点的坐标是否在正常范pxf(t1,t2);
围内
{
//把点存入数组 if(xp!=xp1 | yp!=yp1) {
pointx[j]=xp; pointy[j]=yp; j++;
if(j==280)//只存280个点的位置 { }
xp1=xp;//将上一次的位置值进行保存,与下一次进行比较,
j=0;
看是否有变化 }
13
}
yp1=yp;
} }
2、定时器部分程序 #include \#include \#include \#include \
extern s32 xx,yy;
extern u8 xp,yp;//注意:对变量声明时不可以同时进行赋值 extern u8 xp1,yp1; extern u8 DrawLine_flag;
//在定时器3中断中进行液晶显示
void TIM3_Int_Init(u16 arr,u16 psc) {
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
//定时器TIM3初始化
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入NVIC_InitTypeDef NVIC_InitStructure;
活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟
频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟
分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM
14
向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初
始化TIMx的时间基数单位
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,
允许更新中断 }
//定时器3中断服务程序(声源位置显示) void TIM3_IRQHandler(void) //TIM3中断 {
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更TIM_Cmd(TIM3, ENABLE); //使能TIMx
//中断优先级NVIC设置
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
新中断发生与否
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新
中断标志
LCD_ShowNum(20,210,xx,3,16);//显示数字
15