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

stm32f3标准外设库发现惊天大错之二

[复制链接]
dapan100 发布时间:2017-7-6 18:08
今天配置定时器通道一捕获事件复位并启动计数器,配置如下
        TIM_TimeBaseStructInit(&TIM_TimeBaseInitStructure);
        TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV4;
        TIM_TimeBaseInit(TIM1 , &TIM_TimeBaseInitStructure);
               
        TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Combined_ResetTrigger);
       
        TIM_SelectInputTrigger(TIM1, TIM_TS_TI1FP1);
       
        TIM_ICStructInit(&TIM_ICInitStructure);
        TIM_ICInit(TIM1, &TIM_ICInitStructure);
       

调试发现寄存器值并不是预期结果,单步调试发现bug在TIM_SelectInputTrigger函数。
smcr.png sms.png
从参考手册查到复位并触发计数器需要把sms设为1000,关键在sms[3]。sms[3]又被TIM_SelectInputTrigger函数清掉了
void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource)
{
  uint16_t tmpsmcr = 0;

  /* Check the parameters */
  assert_param(IS_TIM_LIST2_PERIPH(TIMx));
  assert_param(IS_TIM_TRIGGER_SELECTION(TIM_InputTriggerSource));

  /* Get the TIMx SMCR register value */
  tmpsmcr = TIMx->SMCR;

  /* Reset the TS Bits */
  tmpsmcr &= (uint16_t)~TIM_SMCR_TS;

  /* Set the Input Trigger source */
  tmpsmcr |= TIM_InputTriggerSource;

  /* Write to TIMx SMCR */
  TIMx->SMCR = tmpsmcr;
}

解决方法是调换一下函数顺序

又看了一下其他函数也发现了形如 reg=data的语句,像这种直接对寄存器赋值就有可能会出现误操作
收藏 评论1 发布时间:2017-7-6 18:08

举报

1个回答
MrJiu 回答时间:2017-7-7 09:40:34
没啥卵用!!!!因为标准库早就不支持更新了!!!

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版