你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F030 定时器通道设置问题

[复制链接]
baotun050320 提问时间:2021-1-13 21:57 /
  1. void bsp_StartHardTimer(uint8_t _CC, uint32_t _uiTimeOut, void * _pCallBack)
  2. {
  3.        
  4.    uint32_t cnt_now;
  5.    uint32_t cnt_tar;
  6.    TIM_TypeDef* TIMx = TIM3;
  7.            
  8.    cnt_now = TIMx->CNT;
  9.    cnt_tar = cnt_now + 5000;            /* 计算捕获的计数器值 */
  10.    if (_CC == 1)
  11.     {
  12.       s_TIM_CallBack1 = (void (*)(void))_pCallBack;
  13.    
  14.       TIMx->CCR1 = cnt_tar;                 /* 设置捕获比较计数器CC1 */
  15.       TIMx->SR = (uint16_t)~TIM_IT_CC1;   /* 清除CC1中断标志 */
  16.       TIMx->DIER |= TIM_IT_CC1;            /* 使能CC1中断 */
  17.                         Set_T1M3_CC1_Count = _uiTimeOut;
  18.     }       
  19.                
  20.    else if (_CC == 2)
  21.     {
  22.       s_TIM_CallBack2 = (void (*)(void))_pCallBack;
  23.    
  24.       TIMx->CCR2 = cnt_tar;                 /* 设置捕获比较计数器CC1 */
  25.       TIMx->SR = (uint16_t)~TIM_IT_CC2;   /* 清除CC1中断标志 */
  26.       TIMx->DIER |= TIM_IT_CC2;            /* 使能CC1中断 */
  27.                         Set_T1M3_CC2_Count = _uiTimeOut;
  28.     }
  29. }
复制代码

  1. void TIM3_IRQHandler()
  2. {

  3.         if(TIM_GetITStatus(TIM3,TIM_IT_CC1) != RESET)
  4.         {
  5.                 T1M3_CC1_Count++;
  6.                 TIM_ClearITPendingBit(TIM3,TIM_IT_CC1);
  7.                
  8.                 if(Set_T1M3_CC1_Count == T1M3_CC1_Count)
  9.                 {
  10.                        
  11.                         TIM_ITConfig(TIM3,TIM_IT_CC1,DISABLE);       
  12.                         Set_T1M3_CC1_Count=0;               
  13.                         T1M3_CC1_Count= 0;
  14.                         s_TIM_CallBack1();
  15.                 }               
  16.         }
  17.                
  18.                

  19.        
  20.         if(TIM_GetITStatus(TIM3,TIM_IT_CC2) != RESET)
  21.         {
  22.                 T1M3_CC2_Count++;
  23.                 TIM_ClearITPendingBit(TIM3,TIM_IT_CC2);
  24.                
  25.                 if(Set_T1M3_CC2_Count == T1M3_CC2_Count)
  26.                 {
  27.                        
  28.                         TIM_ITConfig(TIM3,TIM_IT_CC2,DISABLE);       
  29.                         Set_T1M3_CC2_Count=0;               
  30.                         T1M3_CC2_Count= 0;
  31.                         s_TIM_CallBack2();
  32.                 }               
  33.         }
  34. }
复制代码


上面代码是网上抄的,经过我修改
我同一时间只需要调用1个通道,1个指针函数就可以了。后面指针函数越写越多。4个通道不够用了,我想直接在形参void * _pCallBack调用就可以了,
然后都用CC1.后来发现会进入HardFault_Handler。这是为什么了?



收藏 评论3 发布时间:2021-1-13 21:57

举报

3个回答
水晶之泪0517 回答时间:2021-1-14 09:19:30
中断里边执行的函数,栈溢出了吧
zsdonline 回答时间:2021-1-14 11:27:28
学习
baotun050320 回答时间:2021-1-14 19:02:04
水晶之泪0517 发表于 2021-1-14 09:19
中断里边执行的函数,栈溢出了吧

为什么会栈溢出?我是用指针函数

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版