中级会员
 
- 积分
- 354
- 金钱
- 354
- 注册时间
- 2018-10-8
- 在线时间
- 75 小时
|
10金钱
通过逻辑分析仪我得到我需要读取的波形,第一个波形是CLK,第二个波形SYNC,第三和第四分别是需要读取的值(X和Y)

通过CLK信号的下降沿读取X和Y的值
初始化函数
TIM_ICInitTypeDef TIM3_ICInitStructure;
void TIM3_Cap_Init(u16 arr ,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能定时器3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA时钟
//初始化IO口
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_7);
// KEY_Init();
TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频器
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
//初始化TIM2输入捕获参数
TIM3_ICInitStructure.TIM_Channel = TIM_Channel_2; //CLK=02 选择输入端CLK 映射到TI2上
TIM3_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; //下降沿捕获
TIM3_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI2上
TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
TIM3_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
TIM_ICInit(TIM3, &TIM3_ICInitStructure);
//中断分组初始化
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级2级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级0级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
// TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_CC2,ENABLE); //允许更新中断,允许CC1IE,CC2IE,CC3IE,CC4IE捕获中断
// TIM_Cmd(TIM3, ENABLE); //使能定时器3
}
读取IO
#define CLK PAin(7) // GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7) // db25 11
#define SYNC PAin(6) // GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6) // db25 12
#define YCh PBin(1) // GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) // db25 16
#define XCh PBin(0) // GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0) // db25 21
中断函数
void TIM3_IRQHandler(void)
{
//通道2
if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET) //捕获2发生捕获事件
{
if (CLK == 0) //捕获到一个下降沿
{
cnt++;
if(cnt>4)
{
Xzhi=(Xzhi<<1);
Xzhi+=XCh;
}
if(cnt>=20)
{
TIM_Cmd(TIM3, DISABLE);
TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_CC2,DISABLE);
}
}
}
TIM_ClearITPendingBit(TIM3, TIM_IT_CC2|TIM_IT_Update); //清除中断标志位
}
主函数
int main()
{
KEY_Init();
uart_init(115200); //串口初始化,放最后,不然可能串口接收乱数据没有处理,超过接收缓冲区
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
TIM3_Cap_Init(0xffff,71);
//TIM3_Cap_Init(2,1);
TIM_Cmd(TIM3, ENABLE); //使能定时器3
TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_CC2,ENABLE);
while(1)
{
if(SYNC==0)
if(SYNC==0)
{
//CLK是TIM3_CH2
TIM_Cmd(TIM3, ENABLE); //使能定时器3
TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_CC2,ENABLE);
while(1)
{
if(cnt>=20)
{
cnt=0;
printf("Xzhi=%X,Yzhi=%X\n\r",Xzhi,Yzhi);
Xzhi=0;Yzhi=0;
break;
}
}
}
}
}
以上代码只读取Xzhi的值,可以读取2us以上的Xzhi,但是2us以下的值无法读取,我想问下我这个初始化,他初始化的是下降沿触发,但是他不论上升沿和下降沿都会进入这个中断,是不是不论你初始化什么 他只要发生变化就会,进入这个中断,还有就是我要读取0.5us左右的波形,这里读取他会读到错误的计数读取最快能读取多少频率的波形
|
|