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

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

[复制链接]
dapan100 发布时间:2017-7-6 18:08
今天配置定时器通道一捕获事件复位并启动计数器,配置如下
/ ?2 E) v8 y0 `        TIM_TimeBaseStructInit(&TIM_TimeBaseInitStructure);
9 _7 }3 M/ [: H4 F  t& a1 L        TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV4;
" w/ }; z$ Q, x. Q! q        TIM_TimeBaseInit(TIM1 , &TIM_TimeBaseInitStructure);% Z$ X: P! M2 T1 ?1 q
                2 u7 U- f% M- P7 o/ b
        TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Combined_ResetTrigger);
% U9 V2 ^0 u$ M4 Z- g        : j  |9 ?+ t: D& y& c8 q
        TIM_SelectInputTrigger(TIM1, TIM_TS_TI1FP1);
; Y$ Q2 J& H8 j3 `1 w' t        5 i- m2 @& ^  q! A
        TIM_ICStructInit(&TIM_ICInitStructure);  g, ~- @: R- J2 h% l
        TIM_ICInit(TIM1, &TIM_ICInitStructure);$ R' t2 r. J$ L, L# k
       
/ O9 d* K0 k" }, c" I/ s
9 I3 J7 g  g- w调试发现寄存器值并不是预期结果,单步调试发现bug在TIM_SelectInputTrigger函数。5 A. R3 _1 x' i1 Z1 h! K
smcr.png sms.png ; M, |+ y% F! s/ |, J
从参考手册查到复位并触发计数器需要把sms设为1000,关键在sms[3]。sms[3]又被TIM_SelectInputTrigger函数清掉了
, A9 C) A+ z) j0 \  Lvoid TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource)
2 E$ D4 v! p3 t% M1 A3 C{. L) H, Q1 ~1 m; C
  uint16_t tmpsmcr = 0;* L7 m" w# Z, A: |( L3 E0 d
  B+ A$ H1 Z8 P' N+ x' C' ~, J
  /* Check the parameters */
# J% s/ q% Q. x  assert_param(IS_TIM_LIST2_PERIPH(TIMx));
$ u; R! C8 E; V8 y4 Z% G  assert_param(IS_TIM_TRIGGER_SELECTION(TIM_InputTriggerSource));
) t) R+ I  b2 A9 n
. n3 A: u3 I* y" k4 A  /* Get the TIMx SMCR register value */4 C8 H+ y) u! k6 x+ ?
  tmpsmcr = TIMx->SMCR;$ B; M2 _7 N' D+ n+ @' n( x! K* |& ~

. v1 L  {# U* j- i  /* Reset the TS Bits */
6 B: k; g: ^) G9 n% u* b  tmpsmcr &= (uint16_t)~TIM_SMCR_TS;
" r0 a7 C8 [+ x) ]! F6 `$ i4 ^: g; F1 R6 L# ^$ i  [* E' B" f. j2 C) g
  /* Set the Input Trigger source */$ [' L( U- h/ C9 C: o
  tmpsmcr |= TIM_InputTriggerSource;
5 E+ t9 |  M2 O/ J  u1 h; U. Z' W8 {! m0 Z" M8 L9 _9 z
  /* Write to TIMx SMCR */8 t. f; C/ B1 m: @0 g6 G
  TIMx->SMCR = tmpsmcr;
& V+ f8 I# j/ ]# s$ y( F}
9 e  `8 Q! e* h" G# s/ X4 V; T! c: |6 y
解决方法是调换一下函数顺序
5 l) q0 V4 G. t- X; ]6 h/ T0 L0 _# G+ s0 N2 s0 Q
又看了一下其他函数也发现了形如 reg=data的语句,像这种直接对寄存器赋值就有可能会出现误操作
3 G! N6 x* l* L" i, N/ L
赞 收藏 评论1 发布时间:2017-7-6 18:08

举报

1个回答
MrJiu 回答时间:2017-7-7 09:40:34
没啥卵用!!!!因为标准库早就不支持更新了!!!
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版