OpenEdv-开源电子网

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

H7实验9 输入捕获实验 神奇的问题求解答啊!!

[复制链接]

15

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
348
金钱
348
注册时间
2015-5-2
在线时间
29 小时
发表于 2018-7-9 00:35:41 | 显示全部楼层 |阅读模式
15金钱
1.jpg
在CUBEMX中对于定时器TIM5,勾选使用内部时钟源,生成的代码中有如下标红色的一段代码,致使H7的该捕获实验无法成功。但是屏蔽这段标红的实验正常,请问这是什么情况????非常不理解。按理说使用到TIM5时候就应该选择该定时器的时钟源啊?为什么配置了,多了这段代码反而串口打印不出来了呢?

//  if (HAL_TIM_Base_Init(&htim5) != HAL_OK)
//  {
//    _Error_Handler(__FILE__, __LINE__);
//  }


//  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
//  if (HAL_TIM_ConfigClockSource(&htim5, &sClockSourceConfig) != HAL_OK)
//  {
//    _Error_Handler(__FILE__, __LINE__);
//  }




//定时器5通道1输入捕获配置
//arr:自动重装值(TIM2,TIM5是32位的!!)
//psc:时钟预分频数
void TIM5_CH1_Cap_Init(u32 arr,u16 psc)
{  
  TIM_ClockConfigTypeDef sClockSourceConfig;
        TIM_MasterConfigTypeDef sMasterConfig;
  TIM_IC_InitTypeDef sConfigIC;
       

  htim5.Instance = TIM5;
  htim5.Init.Prescaler = psc;
  htim5.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim5.Init.Period = arr;
  htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim5.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;


//  if (HAL_TIM_Base_Init(&htim5) != HAL_OK)
//  {
//    _Error_Handler(__FILE__, __LINE__);
//  }


//  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
//  if (HAL_TIM_ConfigClockSource(&htim5, &sClockSourceConfig) != HAL_OK)
//  {
//    _Error_Handler(__FILE__, __LINE__);
//  }

  if (HAL_TIM_IC_Init(&htim5) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim5, &sMasterConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
  sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
  sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
  sConfigIC.ICFilter = 0;
  if (HAL_TIM_IC_ConfigChannel(&htim5, &sConfigIC, TIM_CHANNEL_1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

       
    HAL_TIM_IC_Start_IT(&htim5,TIM_CHANNEL_1);   //开始捕获TIM5的通道1
    __HAL_TIM_ENABLE_IT(&htim5,TIM_IT_UPDATE);   //使能更新中断
}




最佳答案

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

问题已经解决,回答如下: 1、3#楼所说的问题,寄存器为0是因为该函数void TIM5_CH1_Cap_Init(u32 arr,u16 psc)末尾没有调用IO口配置函数HAL_TIM_IC_MspInit(&htim5); 加上后寄存器debug中就不会全部是0了。 2、5#、6#楼所说的神奇的现象 我只要把这个判断语句屏蔽掉 就能正常捕获 if (HAL_TIM_Base_Init(&htim5) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); }是因为使能TIM5时钟和配置优先级配置在了HAL_ ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
348
金钱
348
注册时间
2015-5-2
在线时间
29 小时
 楼主| 发表于 2018-7-9 00:35:42 | 显示全部楼层
问题已经解决,回答如下:
1、3#楼所说的问题,寄存器为0是因为该函数void TIM5_CH1_Cap_Init(u32 arr,u16 psc)末尾没有调用IO口配置函数HAL_TIM_IC_MspInit(&htim5);  加上后寄存器debug中就不会全部是0了。
2、5#、6#楼所说的神奇的现象  我只要把这个判断语句屏蔽掉  就能正常捕获  if (HAL_TIM_Base_Init(&htim5) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }是因为使能TIM5时钟和配置优先级配置在了HAL_TIM_IC_MspInit(&htim5);位于 if (HAL_TIM_Base_Init(&htim5) != HAL_OK)之后,造成if (HAL_TIM_Base_Init(&htim5) != HAL_OK)调用的HAL_TIM_Base_Init(&htim5)调用的void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)为空。如图1
1.jpg

图1 tim5和中断设置太靠后

解决方式是在if (HAL_TIM_Base_Init(&htim5) != HAL_OK)调用的void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)中加入使能TIM5时钟和配置优先级,这样不屏蔽if (HAL_TIM_Base_Init(&htim5) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }也能正常工作了,如图2。修正后源码见附件。 h7-temp(修正后代码).zip (2.91 MB, 下载次数: 43)
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-7-9 01:41:35 | 显示全部楼层
对比,看寄存器差异。就知道了。
回复

使用道具 举报

15

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
348
金钱
348
注册时间
2015-5-2
在线时间
29 小时
 楼主| 发表于 2018-7-9 19:34:18 | 显示全部楼层
正点原子 发表于 2018-7-9 01:41
对比,看寄存器差异。就知道了。

您提供的思路 让我比较  屏蔽和不屏蔽的寄存器数值,这个是我屏蔽该语句后寄存器值,正常
2.png

去掉屏蔽后,再次下载debug,发现寄存器数值都为0,请问这是什么情况?我这个代码可是cbuemx生成的   为什么一句话就能死机?
1.png


回复

使用道具 举报

15

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
348
金钱
348
注册时间
2015-5-2
在线时间
29 小时
 楼主| 发表于 2018-7-9 19:59:11 | 显示全部楼层
正点原子 发表于 2018-7-9 01:41
对比,看寄存器差异。就知道了。

捕获模式不能使能tim的内部时钟吗?图形配置中,使能了TIM5的内部时钟 就会多生成我屏蔽部分的代码,然后程序就无法运行了
回复

使用道具 举报

15

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
348
金钱
348
注册时间
2015-5-2
在线时间
29 小时
 楼主| 发表于 2018-7-9 21:52:05 | 显示全部楼层
我在该函数后面加上HAL_TIM_IC_MspInit(&htim5);  定时器5调试时候寄存器就有了值。但问题是,如果我取消屏蔽的语句,串口还是打印不出捕获的数值。对比屏蔽语句的寄存器值,发现,屏蔽后,CCMR1_Out  CCMR1_Input PSC这三个寄存器没有数值。请问 这个问题出在哪里呢

程序能正常运行(串口不能打印)的TIM5寄存器值
1.png

程序不能正常运行(串口不能打印)的TIM5寄存器值
2.png

求解决啊!!!!50元话费或者支付宝作为一点点心意!

回复

使用道具 举报

15

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
348
金钱
348
注册时间
2015-5-2
在线时间
29 小时
 楼主| 发表于 2018-7-9 22:03:27 | 显示全部楼层
正点原子 发表于 2018-7-9 01:41
对比,看寄存器差异。就知道了。

神奇的现象  我只要把这个判断语句屏蔽掉  就能正常捕获  if (HAL_TIM_Base_Init(&htim5) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }这个应该有无对程序是没有影响的啊  为什么出现这么神奇的现象???

求原子一定看看这个神奇的现象啊
回复

使用道具 举报

15

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
348
金钱
348
注册时间
2015-5-2
在线时间
29 小时
 楼主| 发表于 2018-7-9 22:13:14 | 显示全部楼层
正点原子 发表于 2018-7-9 01:41
对比,看寄存器差异。就知道了。

h7定时器捕获实验.zip (2.91 MB, 下载次数: 50)
回复

使用道具 举报

15

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
348
金钱
348
注册时间
2015-5-2
在线时间
29 小时
 楼主| 发表于 2018-7-10 12:21:10 | 显示全部楼层
请原子哥或者其他朋友帮忙找下问题啊!给与电话费或者支付宝50元的心意报酬啊!!!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-7 12:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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