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

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

10金钱
void MX_TIM3_Init(void)
7 \: c1 r! X& q& o6 D7 ?, X6 L( w{! L9 C# O4 W; W" r) I$ G& h9 g$ O8 g+ Y
//  TIM_ClockConfigTypeDef sClockSourceConfig;
6 j, K, \# d! _4 d  TIM_MasterConfigTypeDef sMasterConfig = {0};
- C( C  }9 c2 }9 k' v* G( o* W  TIM_OC_InitTypeDef          sConfigOC = {0};! M( B+ \. c7 W4 `

) r* m- z+ T, y  X% t, S& t  GPIO_InitTypeDef GPIO_InitStruct;2 T9 S+ z, a, I5 t$ W8 ?

) ?' [$ F; G, |% h    __HAL_RCC_TIM3_CLK_ENABLE();$ J" g* e0 `: t# d% e, s& R
    __HAL_RCC_GPIOB_CLK_ENABLE();
5 Y0 V7 Z: Y: i: b
7 q  ^2 W6 M1 f& x. N6 K  shtim3.Instance = TIM3;                                //设置主定时器为TIM3& E& a0 U6 G" N9 m+ s  O' T
  shtim3.Init.Prescaler = 720-1;                           //设置PWM频率
8 i+ l- E5 r# M  shtim3.Init.CounterMode = TIM_COUNTERMODE_UP;          //设置计数模式为向上计数2 P# p! O8 t) d- P3 l
  shtim3.Init.Period = 5000-1;                            //设置占空比
! B* r2 a3 L9 N, Q  shtim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;    //设置为无分频/ f4 a. u( S& N+ I( W
  HAL_TIM_PWM_Init(&shtim3);! l* C# |. j4 n
. o2 w3 c2 n5 z3 ]- ]4 l' f
  /**TIM3 GPIO Configuration   
3 ^- W* f, \& c1 B! C9 }  PB5     ------> TIM3_CH2 1 X' p9 E9 D$ U5 Y' g$ J0 v
  */
" Y) j( B6 r' M: e5 i& _' `  GPIO_InitStruct.Pin = GPIO_PIN_5;
4 p8 v' \( {6 }7 N  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;7 X) ]/ g5 y1 s/ [/ }- v5 V
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
4 \. B) Z. z0 W* {! j# \8 @4 I+ T6 y  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
: q- t- R4 w: W# ^7 N- |
7 k+ V$ U( v6 o' X8 f6 z9 m  sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;              //更新事件被选为触发输入8 @3 M- V* B, |* @$ b
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;       //开启主从模式& n9 V7 U% f1 R# E4 p3 y  F
  HAL_TIMEx_MasterConfigSynchronization(&shtim3, &sMasterConfig);
( I7 ^' x$ h7 M6 b- p$ I. I0 I3 o, o# t
  sConfigOC.OCMode = TIM_OCMODE_PWM1;            //设置PWM模式为PWM1" q& X3 M/ L5 e3 e. N
  sConfigOC.Pulse = 2500;                          //设置PWM占空比为50%(50/100)! F/ q7 R6 B, |& P! }9 q
  sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;     //设置PWM空闲状态引脚拉低0 P, N( h3 E( R% X! S
  HAL_TIM_PWM_ConfigChannel(&shtim3, &sConfigOC, TIM_CHANNEL_2);
9 o& i& A5 m: C; T, J8 E$ \. n! V/ U
  __HAL_AFIO_REMAP_TIM3_PARTIAL();//部分重映射
; J: ]) @& D4 \$ j- R  HAL_TIM_Base_Stop(&shtim3);
# `- ]8 G7 ?! r9 }/ e  }+ K3 @3 p' [3 ]# e0 n8 w
  LOG_D("MX_TIM3_Init! \r\n");
( S4 V& }; ?% f7 S: F: D}
1 o$ w, f# T$ L; _
2 T3 S" T7 t$ m! wvoid MX_TIM5_Init(void)! b0 i5 i; r& k8 W9 o4 G6 P
{
3 f0 R- E9 @0 z. G1 D1 @! J  TIM_ClockConfigTypeDef sClockSourceConfig = {0};0 C2 X" u5 g6 d' B, P: ?6 a
  TIM_SlaveConfigTypeDef sSlaveConfig = {0};) L8 ]1 t; I# W2 ?. B

, r. o! l: v: ?; i8 t  __HAL_RCC_TIM5_CLK_ENABLE();1 A/ C6 C, v7 o% G! b
' E7 S% L" l2 W# k; {& V" n8 Z  [( \4 D
  shtim5.Instance = TIM5;                                   //设置从定时器为TIM5
" D( v9 M9 l2 O3 p. G* }/ \+ T3 p1 M  shtim5.Init.Prescaler =0;                                 //设置从定时器频率为0& ~# _; R9 T2 G
  shtim5.Init.CounterMode = TIM_COUNTERMODE_UP;             //设置计数模式为向上计数' @. U. V. V5 l6 T8 N
  shtim5.Init.Period =0xffff;                               //这个大于0就行4 c! s9 T# S9 u% u# @( t
  shtim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;       //设置为无分频    ( D5 F, L) P& B! {# C
  HAL_TIM_Base_Init(&shtim5);
& O7 N; o1 b) P# W( B- W3 H
. n4 N! e! h6 P- M3 T  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;  //设置为内部时钟触发,即为TIM2) W  ^  a! P# a
  HAL_TIM_ConfigClockSource(&shtim5, &sClockSourceConfig);# u5 h, }. F. U& I

5 M8 n& ^! a# ^+ P  sSlaveConfig.SlaveMode =  TIM_SLAVEMODE_GATED;              //设置为门触发
6 I, A  Z& }* {' j' T: I6 N" v  sSlaveConfig.InputTrigger = TIM_TS_ITR1;                    //设置ITR1(tim2)为输入源
# B. a/ S% O$ p0 I8 t" m  sSlaveConfig.TriggerPolarity = TIM_TRIGGERPOLARITY_RISING;  //设置触发模式为上升沿
% ^( B8 M9 b. R6 T  h6 u  sSlaveConfig.TriggerPrescaler = TIM_TRIGGERPRESCALER_DIV1;  //设置无预分频
4 q/ V( K: T' ?, g  sSlaveConfig.TriggerFilter = 0x0;                           //设置无滤波! _+ I, @" f+ e$ ^

/ y/ ^; l% [2 O& j" l  HAL_TIM_SlaveConfigSynchronization(&shtim5, &sSlaveConfig);  Z; q5 ?9 Y) I0 u& f. b/ D

, Y! B6 g8 ^! n& N6 e2 I/ l6 r, S# L$ s
  //关ITM5中断% E7 P$ X6 }3 ?1 d' J
  HAL_TIM_Base_Stop_IT(&shtim5);
- N  D) X! E6 N4 Y  LOG_D("MX_TIM5_Init! \r\n");
" c4 c6 Y" H/ l/ Q5 V5 e" Y% ?  z9 u5 `  z: [8 r7 b
   HAL_NVIC_SetPriority(TIM5_IRQn,1,1);    //设置中断优先级,抢占优先级1,子优先级3
5 m/ b7 N* w' z) ?  HAL_NVIC_EnableIRQ(TIM5_IRQn); ) J+ I8 {; [" _7 e+ U) \6 R
  LOG_D("MX_TIM5_Init111! \r\n");: E( d% o& j* A8 O( |+ K

% b$ g, z# ]7 S9 o# O}* }. v3 r& X1 t/ E! t, G# E

) |$ c: V# e/ P: ?( V' q0 |
; k$ ?0 Z$ N9 j. \2 H( c$ Q+ |void PWM_Set(uint32_t speed,uint32_t pulse)
# M* N9 Y( M1 t( `) O{
5 _; l8 S! b2 J5 @- I8 T  TIM_OC_InitTypeDef          sConfigOC = {0};  1 c& _$ z) g2 T) I; X/ U8 F" P  G* _

- k& Q- d# U% t1 I  shtim3.Instance = TIM3;                                //设置主定时器为TIM39 z; i' N3 G6 }0 X, O! K
  shtim3.Init.Prescaler = 720-1;                           //设置PWM频率
  O4 a9 x2 m$ i' a  D  shtim3.Init.CounterMode = TIM_COUNTERMODE_UP;          //设置计数模式为向上计数
9 p( }4 U$ k/ p3 p* f9 C5 c  shtim3.Init.Period = 500000/speed - 1;                            //设置占空比- X; \" v* q9 z* @  h
  shtim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;    //设置为无分频! |. a/ U0 T/ W! Q0 L8 L
  HAL_TIM_PWM_Init(&shtim3);( \7 U7 Y& u% ^& m0 @5 g
  \. s, w# k. e# B" G
  sConfigOC.OCMode = TIM_OCMODE_PWM1;            //设置PWM模式为PWM1( v: I2 m, ~. k
  sConfigOC.Pulse = 250000/speed;                          //设置PWM占空比为50%(50/100)
7 v" c6 m- {2 ?) i, u5 O# e2 R  sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;     //设置PWM空闲状态引脚拉低
& d7 E# t4 w9 Z( m4 T  D# t  HAL_TIM_PWM_ConfigChannel(&shtim3, &sConfigOC, TIM_CHANNEL_2);' w" x1 r2 h# B

0 X6 V: [5 u) A8 O0 f  __HAL_TIM_SET_AUTORELOAD(&shtim5,pulse-1);  w5 ?1 }. i3 Q% h/ O9 |
4 U  I' G: S/ S
  HAL_TIM_Base_Start_IT(&shtim5);               
. r  v6 o! f6 I' C4 a1 Q2 H, H$ ?  j/ D3 D  HAL_TIM_PWM_Start_IT(&shtim3, TIM_CHANNEL_2);        //主定时器PWM脉冲输出
. h' y8 H: B8 N" S  LOG_D("Step_Moto2_Set! \r\n");
4 y3 k9 d3 ?0 y. A$ k}
% r: d8 ]+ T5 w, ?4 s) P  U
- ]# u$ g8 }8 e1 r; i7 x3 L
5 ]$ x. ?' I7 n  Y) k调试发现,程序运行HAL_TIM_Base_Start_IT(&shtim5);      就死机$ H9 n1 @# F' H2 a. G

) T) p; P7 e3 ?, o7 m0 s7 ^' @4 x
调试串口输出:$ {3 f9 M7 I9 g* D: s% G
[46] D/NO_TAG: MX_TIM3_Init! ' B: m9 o! O2 Z9 {  ^; Z$ Y

  N. v, f8 c0 B0 H2 g" m8 U[49] D/NO_TAG: MX_TIM5_Init!
- g& B! c5 \, Z+ j) q+ A  W8 \; H8 u9 R5 Q- R5 K, l
[52] D/NO_TAG: MX_TIM5_Init111!
* I$ Q( m5 e4 a
6 i  k" s) {) C3 B$ t9 O: Sthread pri  status      sp     stack size max used left tick  error' w! G+ z( b9 Z- \5 x
------ ---  ------- ---------- ----------  ------  ---------- ---
  A" ^5 D4 i& }+ J7 ^tshell  20  ready   0x00000040 0x00001000    01%   0x0000000a 000# i  q& [# x% m& T) m+ o; S- l
tidle   31  ready   0x00000040 0x00000100    25%   0x00000020 0005 p4 A. }9 X' K9 e9 A
main    10  ready   0x00000040 0x00000800    22%   0x00000005 000
6 C' P" y8 \" U0 P  o3 J死机  @8 p+ n. y1 }1 [& ?! N& t/ }0 n
# K: U5 l( ~" v7 J
* c) D9 A# K3 B5 C# z4 e; t; N5 C# C

最佳答案

查看完整内容

看不出来啥问题 什么 bsp,主栈多大
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-6-25 10:22:00 | 显示全部楼层
看不出来啥问题
. R  K( \9 o) I4 I- W) o/ u
) z: O, ]; m& i什么 bsp,主栈多大
使用道具 举报 回复
发表于 2019-6-25 15:19:54 | 显示全部楼层
MurphyZhao 发表于 2019-6-25 14:10: ^( g4 S3 Z+ n' m3 j: Z/ m
看不出来啥问题
* P0 ~2 x& \0 c6 W2 `. z2 S* F' N: R9 w# M6 D' ^3 \: x3 m
什么 bsp,主栈多大
4 H5 c( \. R4 {, ?" T
STM32F103RC;RT_Thread 3.1.1;HAL库;" S' D1 Y) I8 q0 S% P3 }' s
因为做了两路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  F9 b, \: Y- O1 Q
各种尝试,都无法解决。改硬件吧,改用定时器8
8 {7 u+ u7 S$ Y6 Q: [5 Y. a
RT_Thread跟定时器5有仇啊!
使用道具 举报 回复
发表于 2019-6-27 20:35:50 | 显示全部楼层
ls0218 发表于 2019-6-27 14:593 Z/ W) a5 g2 ~
RT_Thread跟定时器5有仇啊!

8 L5 C( R4 E0 F6 P' D继续啊,你让我这答案心虚啊
使用道具 举报 回复
发表于 2019-6-27 22:14:14 | 显示全部楼层
MurphyZhao 发表于 2019-6-27 20:35( Q- r  A/ {4 c) Q( P9 a
继续啊,你让我这答案心虚啊

# W2 I% _/ ]/ j/ S0 @! K' @/ O/ O以目前能力实在无法解决这个问题。找了三天,实在是折磨人。刚接触RTT一个月,还是留着以后深入了解了再解决。。。- h9 R; Q7 B$ G$ N5 [% ?
眼前的解决方案就是不用定时器5就可以了,换用其他定时器
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RT-Thread开发者社区 ( 沪ICP备13014002号-1

有害信息举报电话:021-31165890 手机:18930558079

© 2006-2019 上海睿赛德电子科技有限公司

Powered by RT-Thread

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