定时器3和5主从模式输出PWM,定时器5开中断程序就死机

发表在 内核学习营2019-6-25 10:21 [复制链接] 6 121

10金钱
void MX_TIM3_Init(void)
& F0 R# L3 Z* D5 F! [* D: m{7 Q6 R& o* X% v
//  TIM_ClockConfigTypeDef sClockSourceConfig;1 p% w/ t- s3 h
  TIM_MasterConfigTypeDef sMasterConfig = {0};
; |; F% ~+ y( Y  TIM_OC_InitTypeDef          sConfigOC = {0};
, D/ I# ^; ^" M& C. z
5 S. e$ q/ y! u1 r& w  GPIO_InitTypeDef GPIO_InitStruct;1 ?$ S9 ^( o' o5 u
( G) V7 _6 l) ]3 s. N: g/ G
    __HAL_RCC_TIM3_CLK_ENABLE();) s  [2 ]+ D& Q- L# k
    __HAL_RCC_GPIOB_CLK_ENABLE();
! |- M, w5 ?2 M. l" `8 m; r
1 S. U1 \- q$ z  ?; N7 Z& N7 s  shtim3.Instance = TIM3;                                //设置主定时器为TIM3+ b% E7 r* i; A0 \& A/ D
  shtim3.Init.Prescaler = 720-1;                           //设置PWM频率
3 E% r$ b" Z% r) ?5 ?" z; h  shtim3.Init.CounterMode = TIM_COUNTERMODE_UP;          //设置计数模式为向上计数* I! P* ?8 _: e* i$ Q+ E; s; R
  shtim3.Init.Period = 5000-1;                            //设置占空比
/ o0 @' F8 m' P1 {+ u  shtim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;    //设置为无分频! a- G2 |2 k# [2 n, V6 m& g
  HAL_TIM_PWM_Init(&shtim3);
( R; |, W' w! c2 P' U  a/ D
/ I; d3 E2 a8 m' F0 R) Q: t  /**TIM3 GPIO Configuration    4 `1 Z* P9 U/ ?! k, c$ }5 e
  PB5     ------> TIM3_CH2
* b/ A0 L4 h4 O& U- ]  */
% V( J' `4 }$ P- v  GPIO_InitStruct.Pin = GPIO_PIN_5;
. ?0 d( h) K% n$ X  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;2 w$ I- h& c  s5 t/ H- q  @
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
. g8 m" e3 K. [  j  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
3 J2 g5 u( J- h5 p! C' M& D  K( z7 Y' W5 t/ ^3 F
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;              //更新事件被选为触发输入
5 r& n6 d9 n) c5 j8 B  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;       //开启主从模式
: h8 Q2 k1 \" C4 q$ Y! G1 U$ l  HAL_TIMEx_MasterConfigSynchronization(&shtim3, &sMasterConfig);
' b+ ~$ S/ l2 c, z! N. J  x$ X! }) r; m+ @) q
  sConfigOC.OCMode = TIM_OCMODE_PWM1;            //设置PWM模式为PWM1& u, {& |) C7 u! b3 i% V
  sConfigOC.Pulse = 2500;                          //设置PWM占空比为50%(50/100)
0 d9 a  }4 M7 |# K  J* ^  sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;     //设置PWM空闲状态引脚拉低$ G# e8 s/ C; [  F$ j5 B% v+ {
  HAL_TIM_PWM_ConfigChannel(&shtim3, &sConfigOC, TIM_CHANNEL_2);
* d5 P( X/ p$ y0 m  G" L5 v) N; \1 c  }5 T( U& R
  __HAL_AFIO_REMAP_TIM3_PARTIAL();//部分重映射
0 ?2 I2 W& @, f  HAL_TIM_Base_Stop(&shtim3);) E9 c: I' M0 T4 J
, S; g/ x" I3 m& [1 c% U2 [
  LOG_D("MX_TIM3_Init! \r\n");
+ h3 ?2 s' ]6 `- Y}
, O: w; w! Z3 h/ F2 W, n3 b3 g4 U! f% K8 J4 s6 ^# K
void MX_TIM5_Init(void)
( m  ]( M0 ~& p' M- ?. M{. S' b" {1 h. s* N
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
. C. R5 U9 ]5 o' l2 D  TIM_SlaveConfigTypeDef sSlaveConfig = {0};
. w1 n* R7 t7 ?( w9 \6 t( f, ~7 K' `9 J; H, X" |. ~* e: p
  __HAL_RCC_TIM5_CLK_ENABLE();
% X- H" h0 n9 V; c% B; Q! ^9 c# t2 U' X: J6 Z+ l! b/ z
  shtim5.Instance = TIM5;                                   //设置从定时器为TIM57 `( y5 O) u* p& f- ]0 L1 m9 D* O
  shtim5.Init.Prescaler =0;                                 //设置从定时器频率为0
1 W5 m  D* k* y( c  shtim5.Init.CounterMode = TIM_COUNTERMODE_UP;             //设置计数模式为向上计数; ~, _1 s0 I/ o# S% x: G
  shtim5.Init.Period =0xffff;                               //这个大于0就行# W0 Q! J( \* E5 ?* x( ?
  shtim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;       //设置为无分频    2 M/ ?0 O7 y0 H2 U- t% F
  HAL_TIM_Base_Init(&shtim5);, P: a* V0 A3 o

. R$ G" o/ V; Z2 |  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;  //设置为内部时钟触发,即为TIM2
- b4 D% X9 v" `  HAL_TIM_ConfigClockSource(&shtim5, &sClockSourceConfig);
2 G% S! x! e- F9 L5 e
8 ?9 U6 g9 J5 F/ P/ L  sSlaveConfig.SlaveMode =  TIM_SLAVEMODE_GATED;              //设置为门触发
! V7 m7 Z7 o! W( A+ q2 R  sSlaveConfig.InputTrigger = TIM_TS_ITR1;                    //设置ITR1(tim2)为输入源
1 g5 }3 ?* A" E2 c2 x  sSlaveConfig.TriggerPolarity = TIM_TRIGGERPOLARITY_RISING;  //设置触发模式为上升沿
3 t, ?! H% x7 [7 x0 k9 Y  sSlaveConfig.TriggerPrescaler = TIM_TRIGGERPRESCALER_DIV1;  //设置无预分频
3 P5 k; R0 [% t: c8 \0 f! K  sSlaveConfig.TriggerFilter = 0x0;                           //设置无滤波
% u; U3 o0 y9 }' [- t* v, h% r4 k6 n
& e- j) u5 [' h" ^, J$ I+ D  HAL_TIM_SlaveConfigSynchronization(&shtim5, &sSlaveConfig);
! k% ^5 q4 w( `5 x* ?9 ]
0 s3 ?4 h7 K! }/ V$ H: B; }  v3 G% p+ A
  //关ITM5中断* w$ b" K9 T6 G! ^
  HAL_TIM_Base_Stop_IT(&shtim5);
: L& U# I* d* u0 X% C  LOG_D("MX_TIM5_Init! \r\n");+ {- y. I3 {; p' X, [, {; u2 _5 i! q
9 t" d8 j- t# ?! A+ N, N' |8 L
   HAL_NVIC_SetPriority(TIM5_IRQn,1,1);    //设置中断优先级,抢占优先级1,子优先级3/ t$ ~* R6 l8 _: `, S2 j
  HAL_NVIC_EnableIRQ(TIM5_IRQn);
4 Q# r- F3 J. c! I3 r% A  LOG_D("MX_TIM5_Init111! \r\n");
! a' A% v4 e9 O$ L/ o8 ?, G' b
, E2 W1 z$ o" R% n0 X) D}3 c, c5 U$ U5 `7 J! H! T5 s

! B4 q. G$ p* O1 {/ p" `5 _9 Q! z. T8 }* P! `1 k! J- [" n# ~. t( Z
void PWM_Set(uint32_t speed,uint32_t pulse)! C0 r" h! P9 i& Q# F: T9 j2 e
{) I0 p* k& T7 H1 W0 A
  TIM_OC_InitTypeDef          sConfigOC = {0};  
# D& f# A( C# r- I& _0 J
; K3 o/ Q' y, w7 E  B  C, A! y  shtim3.Instance = TIM3;                                //设置主定时器为TIM3
* ~4 I- {- s) R5 i8 G! c7 ]  shtim3.Init.Prescaler = 720-1;                           //设置PWM频率- Z; \" C5 m" V" ^2 V2 G, m
  shtim3.Init.CounterMode = TIM_COUNTERMODE_UP;          //设置计数模式为向上计数( C& S) s, k9 |4 T
  shtim3.Init.Period = 500000/speed - 1;                            //设置占空比/ w7 H% n# B9 J. ~( B2 o, q; H
  shtim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;    //设置为无分频1 [2 |" e8 u( |, D5 b0 C
  HAL_TIM_PWM_Init(&shtim3);
2 O1 Y) z$ K6 Q6 s) z
2 Q! Z: ?3 t  N+ k" t& r  sConfigOC.OCMode = TIM_OCMODE_PWM1;            //设置PWM模式为PWM1& p! z$ c( o+ b$ e2 U5 j. M5 @8 q' U
  sConfigOC.Pulse = 250000/speed;                          //设置PWM占空比为50%(50/100)  q% q  D; d3 W! ^( K" G" D# z$ N
  sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;     //设置PWM空闲状态引脚拉低
/ G: M$ q; I( `7 p. c  HAL_TIM_PWM_ConfigChannel(&shtim3, &sConfigOC, TIM_CHANNEL_2);6 b. U: Y. V7 t4 b

+ T8 e2 O) i, F8 C  __HAL_TIM_SET_AUTORELOAD(&shtim5,pulse-1);4 J0 l- |- q" Y
% b5 N! Q; g* t+ q+ T/ w, R; I
  HAL_TIM_Base_Start_IT(&shtim5);               
1 T/ T: q* v& [3 t  HAL_TIM_PWM_Start_IT(&shtim3, TIM_CHANNEL_2);        //主定时器PWM脉冲输出0 F1 F2 B) ^* F3 B
  LOG_D("Step_Moto2_Set! \r\n");) b3 U; m" {% j, [& z& e- V8 k
}
7 J' U7 |( D6 u) M; X2 s7 ~% v2 C& g" ^
  o, e$ |8 S6 O0 G! l" K; o. f$ K
调试发现,程序运行HAL_TIM_Base_Start_IT(&shtim5);      就死机/ e3 u$ c; q7 n4 G2 F/ r; ]9 G
9 d" n! [3 j9 f4 Q

: ?6 W( u) I2 P5 U: Y! I/ r7 W调试串口输出:
$ \  @0 j0 s+ q% a; c6 R/ g[46] D/NO_TAG: MX_TIM3_Init!
: a1 f& I9 K5 Q- s
3 i4 w/ g& S& _  O4 T[49] D/NO_TAG: MX_TIM5_Init! 5 ]- Y$ d5 _- W: ^7 a0 O2 _" ]

" Z/ _7 |0 G4 [9 r. `6 Z[52] D/NO_TAG: MX_TIM5_Init111! + j( T& T9 \- S2 Q) ^3 ?

. `+ B- K3 {( n6 F' d" Ethread pri  status      sp     stack size max used left tick  error2 ?' g7 i& |9 ^( Y$ ?
------ ---  ------- ---------- ----------  ------  ---------- ---, n: z$ L7 Z: \" R
tshell  20  ready   0x00000040 0x00001000    01%   0x0000000a 000: ]  Z: s' P) B, r* b% Z
tidle   31  ready   0x00000040 0x00000100    25%   0x00000020 000, ]- v: U. ~( `, j
main    10  ready   0x00000040 0x00000800    22%   0x00000005 000
5 p- m3 {1 V8 E8 U死机
( T; E1 g' O) o7 w& U4 f! p/ i* F) q8 Y  R

/ _+ c) k+ F. H: `( ?1 c  {

最佳答案

查看完整内容

看不出来啥问题 什么 bsp,主栈多大
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-6-25 10:22:00 | 显示全部楼层
看不出来啥问题- e2 N0 S/ o9 y" L, U$ C$ H
0 k# \; d7 e+ }
什么 bsp,主栈多大
使用道具 举报 回复
发表于 2019-6-25 15:19:54 | 显示全部楼层
MurphyZhao 发表于 2019-6-25 14:103 }4 d4 i, B' P' A
看不出来啥问题  S) T1 y% ?" Q! L2 c

5 B4 }' \% _  @5 S. z7 p什么 bsp,主栈多大

5 @# U2 E& p  l7 ?STM32F103RC;RT_Thread 3.1.1;HAL库;
" j& k( s  t' ^8 y- K8 B7 r因为做了两路PWM输出,定时器2和定时器4,定时器3和定时器5。其中定时器2和4主从模式功能正常。裸机程序测试两路输出都是正常的。如果把定时器4和定时器5做调换,即定时器2和5主从,定时器3和4主从,则定时器3和4功能正常,定时器3和5异常而导致死机,也是执行到定时器5开中断。
使用道具 举报 回复
发表于 2019-6-27 14:58:27 | 显示全部楼层
各种尝试,都无法解决。改硬件吧,改用定时器8
使用道具 举报 回复
发表于 2019-6-27 14:59:26 | 显示全部楼层
ls0218 发表于 2019-6-27 14:58  H7 d. l* u( C1 S1 e# o
各种尝试,都无法解决。改硬件吧,改用定时器8
$ e& e' h# E9 z! ]7 Y. X
RT_Thread跟定时器5有仇啊!
使用道具 举报 回复
发表于 2019-6-27 20:35:50 | 显示全部楼层
ls0218 发表于 2019-6-27 14:59
4 g. a' I# T- S; T0 HRT_Thread跟定时器5有仇啊!

/ ]5 X! A% k) H& _' A, H' J1 t* g% C继续啊,你让我这答案心虚啊
使用道具 举报 回复
发表于 2019-6-27 22:14:14 | 显示全部楼层
MurphyZhao 发表于 2019-6-27 20:356 P8 P' W- _  T, i
继续啊,你让我这答案心虚啊

3 {3 q* r# t" a& b0 u以目前能力实在无法解决这个问题。找了三天,实在是折磨人。刚接触RTT一个月,还是留着以后深入了解了再解决。。。: z/ `+ k9 V5 {& K
眼前的解决方案就是不用定时器5就可以了,换用其他定时器
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RT-Thread开发者社区  

© 2013-2017 上海睿赛德电子科技有限公司 沪ICP备13014002号-1

Powered by RT-Thread

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