OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2590|回复: 1

我要使用io读取波形的值,通过时序来读取另外IO的值,并把IO的值输出

[复制链接]

19

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2018-10-8
在线时间
75 小时
发表于 2020-7-22 11:46:13 | 显示全部楼层 |阅读模式
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左右的波形,这里读取他会读到错误的计数读取最快能读取多少频率的波形

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

412

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2718
金钱
2718
注册时间
2019-8-14
在线时间
415 小时
发表于 2020-7-22 15:29:55 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 00:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表