OpenEdv-开源电子网

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

STM32CUBEMX做输入捕获的时候,高电平时间不变

[复制链接]

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
发表于 2020-11-3 11:13:52 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 王大爷爱吃鱼 于 2020-11-3 11:15 编辑

如题,我用STM32CUBEMX生成的工程,做输入捕获的时候,高电平时间不变。如下图,高电平时间一直都是192us,但实际我用示波器测量的是300us和400us。
  1. __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 400);//高电平为400us
复制代码

  1. __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 300);//高电平为300us
复制代码
我只改动了上面一句,实际用示波器测量效果和代码可以对得上。可是串口调试助手却一直都是显示192us不变,代码如下,求解。
  1. int main(void)
  2. {
  3.   /* USER CODE BEGIN 1 */

  4.   /* USER CODE END 1 */
  5.   

  6.   /* MCU Configuration--------------------------------------------------------*/

  7.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  8.   HAL_Init();

  9.   /* USER CODE BEGIN Init */

  10.   /* USER CODE END Init */

  11.   /* Configure the system clock */
  12.   SystemClock_Config();

  13.   /* USER CODE BEGIN SysInit */

  14.   /* USER CODE END SysInit */

  15.   /* Initialize all configured peripherals */
  16.   MX_GPIO_Init();
  17.   MX_TIM3_Init();
  18.   MX_TIM5_Init();
  19.   MX_USART1_UART_Init();
  20.   /* USER CODE BEGIN 2 */
  21.           HAL_TIM_IC_Start_IT(&htim5,TIM_CHANNEL_1);        //一定要开启TIM5通道1的捕获中断
  22.   __HAL_TIM_ENABLE_IT(&htim5,TIM_IT_UPDATE);        //一定要开启TIM5的更新中断
  23.                 HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
  24.                 printf("准备开始采集高电平...\r\n");
  25.   /* USER CODE END 2 */

  26.   /* Infinite loop */
  27.   /* USER CODE BEGIN WHILE */
  28.   while (1)
  29.   {
  30.     /* USER CODE END WHILE */

  31.     /* USER CODE BEGIN 3 */
  32.         __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 400);
  33.         HAL_Delay(500);
  34.         if(TIM5CH1_CAPTURE_STA & 0X80)
  35.         {                //完成一次高电平捕获
  36.                 temp = TIM5CH1_CAPTURE_STA & 0X3F;
  37.                 temp *= 65536;                                //溢出总时间
  38.                 temp += TIM5CH1_CAPTURE_STA;        //总的高电平时间
  39.                 printf("高电平时间:%lld us\r\n",temp);
  40.                 TIM5CH1_CAPTURE_STA = 0;                //准备下一次捕获
  41.         }

  42.   }
  43.   /* USER CODE END 3 */
  44. }
复制代码
  1. /* USER CODE BEGIN 1 */
  2. uint8_t  TIM5CH1_CAPTURE_STA=0;                                                        //输入捕获状态                                                   
  3. uint16_t        TIM5CH1_CAPTURE_VAL;                                                        //输入捕获值(TIM5是16位)

  4. //定时器5中断服务函数
  5. //void TIM5_IRQHandler(void)
  6. //{
  7. //        HAL_TIM_IRQHandler(&htim5);                                //定时器共用处理函数
  8. //}

  9. //定时器更新中断(计数溢出)中断处理回调函数, 该函数在HAL_TIM_IRQHandler中会被调用
  10. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//更新中断(溢出)发生时执行
  11. {
  12.         if((TIM5CH1_CAPTURE_STA&0X80)==0)                                //还未成功捕获
  13.         {
  14.                 if(TIM5CH1_CAPTURE_STA&0X40)                                //已经捕获到高电平了
  15.                 {
  16.                         if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)        //高电平太长了
  17.                         {
  18.                                 TIM5CH1_CAPTURE_STA|=0X80;                        //标记成功捕获了一次
  19.                                 TIM5CH1_CAPTURE_VAL=0XFFFF;
  20.                         }else TIM5CH1_CAPTURE_STA++;
  21.                 }         
  22.         }               
  23. }

  24. //定时器输入捕获中断处理回调函数,该函数在HAL_TIM_IRQHandler中会被调用
  25. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//捕获中断发生时执行
  26. {
  27.         if((TIM5CH1_CAPTURE_STA&0X80)==0)                                //还未成功捕获
  28.         {
  29.                 if(TIM5CH1_CAPTURE_STA&0X40)                                //捕获到一个下降沿                 
  30.                 {                                 
  31.                         TIM5CH1_CAPTURE_STA|=0X80;                                //标记成功捕获到一次高电平脉宽
  32.             TIM5CH1_CAPTURE_VAL=HAL_TIM_ReadCapturedValue(&htim5,TIM_CHANNEL_1);//获取当前的捕获值.
  33.                         TIM_RESET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1);   //一定要先清除原来的设置!!
  34.             TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);//配置TIM5通道1上升沿捕获
  35.                 }else                                                                                  //还未开始,第一次捕获上升沿
  36.                 {
  37.                         TIM5CH1_CAPTURE_STA=0;                                        //清空
  38.                         TIM5CH1_CAPTURE_VAL=0;
  39.                         TIM5CH1_CAPTURE_STA|=0X40;                                //标记捕获到了上升沿
  40.                         __HAL_TIM_DISABLE(&htim5);              //关闭定时器5
  41.                         __HAL_TIM_SET_COUNTER(&htim5,0);
  42.                         TIM_RESET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1);   //一定要先清除原来的设置!!
  43.                         TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);//定时器5通道1设置为下降沿捕获
  44.                         __HAL_TIM_ENABLE(&htim5);                //使能定时器5
  45.                 }                    
  46.         }               
  47. }
  48. /* USER CODE END 1 */
复制代码


15.jpg
31537.png
211532.jpg

最佳答案

查看完整内容[请看2#楼]

用CUBEMX最后还是没做好,用库函数可以做
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-11-3 11:13:53 | 显示全部楼层
用CUBEMX最后还是没做好,用库函数可以做
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2020-11-4 02:06:09 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-4 06:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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