OpenEdv-开源电子网

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

参考 原子哥写的两个通道的输入捕获通道2有问题

[复制链接]

15

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
409
金钱
409
注册时间
2017-2-21
在线时间
159 小时
发表于 2019-9-5 08:43:43 | 显示全部楼层 |阅读模式
1金钱
  1. u8 TIM2CH1_CAPTURE_STA=0; //输入捕获状态
  2. u16 TIM2CH1_CAPTURE_VAL; //输入捕获值

  3. u8 TIM2CH2_CAPTURE_STA=0; //输入捕获状态
  4. u16 TIM2CH2_CAPTURE_VAL; //输入捕获值

  5. u8 TIM2CH3_CAPTURE_STA=0; //输入捕获状态
  6. u16 TIM2CH3_CAPTURE_VAL; //输入捕获值

  7. u8 TIM2CH4_CAPTURE_STA=0; //输入捕获状态
  8. u16 TIM2CH4_CAPTURE_VAL; //输入捕获值


  9. //定时器2通道1输入捕获配置

  10. TIM_ICInitTypeDef TIM2_ICInitStructure;

  11. void TIM2_Cap_Init(u16 arr,u16 psc)
  12. {
  13. GPIO_InitTypeDef GPIO_InitStructure;
  14. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  15. NVIC_InitTypeDef NVIC_InitStructure;

  16. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能TIM2时钟
  17. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟

  18. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; //PA0 清除之前设置
  19. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入
  20. GPIO_Init(GPIOA, &GPIO_InitStructure);
  21. GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3); //PA0 下拉

  22. //初始化定时器2 TIM2
  23. TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值
  24. TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频器
  25. TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
  26. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
  27. TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

  28. //初始化TIM通道1输入捕获参数
  29. TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01 选择输入端 IC1映射到TI1上
  30. TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
  31. TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
  32. TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
  33. TIM2_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000 配置输入滤波器 不滤波
  34. TIM_ICInit(TIM2, &TIM2_ICInitStructure);


  35. //初始化TIM通道2输入捕获参数
  36. TIM2_ICInitStructure.TIM_Channel = TIM_Channel_2; //CC1S=01 选择输入端 IC1映射到TI1上
  37. TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
  38. TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
  39. TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
  40. TIM2_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000 配置输入滤波器 不滤波
  41. TIM_ICInit(TIM2, &TIM2_ICInitStructure);


  42. //中断分组初始化
  43. NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM2中断
  44. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级2级
  45. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级0级
  46. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  47. NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

  48. TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3|TIM_IT_CC4,ENABLE); //允许更新中断 ,允许CC1IE捕获中断

  49. TIM_Cmd(TIM2,ENABLE); //使能定时器2

  50. }



  51. //定时器5中断服务程序
  52. void TIM2_IRQHandler(void)
  53. {
  54. //*******************************输入捕获通道1***********************************//

  55. if((TIM2CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
  56. {
  57. if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)

  58. {
  59. if(TIM2CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
  60. {
  61. if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
  62. {
  63. TIM2CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
  64. TIM2CH1_CAPTURE_VAL=0XFFFF;
  65. }else TIM2CH1_CAPTURE_STA++;
  66. }
  67. }
  68. if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
  69. {
  70. if(TIM2CH1_CAPTURE_STA&0X40) //捕获到一个下降沿
  71. {
  72. TIM2CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次上升沿
  73. TIM2CH1_CAPTURE_VAL=TIM_GetCapture1(TIM2);
  74. TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
  75. }else //还未开始,第一次捕获上升沿
  76. {
  77. TIM2CH1_CAPTURE_STA=0; //清空
  78. TIM2CH1_CAPTURE_VAL=0;
  79. TIM_SetCounter(TIM2,0);
  80. TIM2CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿
  81. TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获
  82. }
  83. }
  84. }
  85. //*******************************输入捕获通道2***********************************//
  86. if((TIM2CH2_CAPTURE_STA&0X80)==0)//还未成功捕获
  87. {
  88. if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)

  89. {
  90. if(TIM2CH2_CAPTURE_STA&0X40)//已经捕获到高电平了
  91. {
  92. if((TIM2CH2_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
  93. {
  94. TIM2CH2_CAPTURE_STA|=0X80;//标记成功捕获了一次
  95. TIM2CH2_CAPTURE_VAL=0XFFFF;
  96. }else TIM2CH2_CAPTURE_STA++;
  97. }
  98. }
  99. if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)//捕获2发生捕获事件
  100. {
  101. if(TIM2CH2_CAPTURE_STA&0X40) //捕获到一个下降沿
  102. {
  103. TIM2CH2_CAPTURE_STA|=0X80; //标记成功捕获到一次上升沿
  104. TIM2CH2_CAPTURE_VAL=TIM_GetCapture1(TIM2);
  105. TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Rising); //CC2P=0 设置为上升沿捕获
  106. }else //还未开始,第一次捕获上升沿

  107. {
  108. TIM2CH2_CAPTURE_STA=0; //清空
  109. TIM2CH2_CAPTURE_VAL=0;
  110. TIM_SetCounter(TIM2,0);
  111. TIM2CH2_CAPTURE_STA|=0X40; //标记捕获到了上升沿
  112. TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Falling); //CC2P=1 设置为下降沿捕获
  113. }
  114. }
  115. }

  116. TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3|TIM_IT_CC4|TIM_IT_Update); //清除中断标志位

  117. }
复制代码
暂时没有找到问题,通道1的数据正确,通道2可以进行捕获,但是数据是错误的,请教一下是什么问题导致的

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-9-6 02:48:54 | 显示全部楼层
建议先单独调试每个通道试试
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2019-8-19
在线时间
10 小时
发表于 2019-9-22 17:39:08 | 显示全部楼层
找到问题了吗?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 21:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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