|
用定时器生成PWM波 PWM全称是Pulse Width Modulation,通过控制高频信号的占空比,眼睛当成低通滤波器,可以控制亮暗。再循环更改pwm的阈值,就弄出了呼吸的效果。 这里采用一个比较简单的方法生成PWM波:设置定时器中断然后根据阈值判断置高和置低。 - void TIM3_IRQHandler(void) $ H! ?3 Q: k k& B: W( q) l+ I0 V a' \
- {/ P) r% {6 B2 D% a/ m
- TIM_ClearITPendingBit(TIM3,TIM_IT_Update); & t7 G- _2 a7 ?5 ~3 [
- if(counter==255) & s7 [3 f) [ I
- counter = 0;
' U2 r$ z7 J: g [ - else
( L: r) `2 U1 j6 D- ]# G3 s& @# I& {9 w2 u - counter +=1;. t ?$ \4 U) ]" v) Q
- if(mode == 0){! M& T h3 J- ~( k& e/ Q
- if(counter < pwm)
) w0 i6 a6 D+ V F7 ^! N - GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1); " g) y) j+ U2 o, c
- else $ M G5 ~2 H; ^/ M' G/ f, A
- GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1); d* O; H( w4 Q( Y0 |
- }
: ~3 A7 e: _: ]: A - if(mode == 1)
5 J1 b, n: b- x - {2 `- Y4 `2 v+ S0 x: p, |% o1 a3 T+ O
- if(counter < pwm) ! R% x( [9 f' U4 E4 I# E J1 h
- GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2);
& e* b. Y/ U$ x+ I3 K# M5 ~# g - else " M0 N8 m2 G4 }$ E, C/ ]
- GPIO_ResetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2); 6 r3 w( k G+ |; N
- }
. L" ]2 B3 A$ [# |- _. w B% p" Z - if(mode ==2){5 o& s \; y6 l \: t' D
- if(counter < pwm)
$ U, e$ d4 H8 @1 b - GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_0); ! o6 T! k; r) q( d# g7 Y4 `0 d; V2 F( l
- else ) o- r4 h3 p. J) l! s2 W
- GPIO_ResetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_0); 1 @4 u; O) j, f v2 e7 b
- }
( x! M: j W3 M9 |) m - }
复制代码 5 e. @9 a- j0 R6 c8 V, @
程序流程 开启外设时钟(GPIO和TIM) ) R- P+ W. }; |4 {
- void RCC_Configuration(void)
( k8 G9 Z6 {; _1 O - {
. s% I5 @7 M6 Q) h7 y( N. `. b- o - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); 4 Q6 F7 T; r! J- z4 h
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4|RCC_APB1Periph_TIM3, ENABLE); - J+ f* Z, I$ P5 k! X! }( I
- }
复制代码
& E% M' p {. x9 n
& D+ E5 N2 B: n. l* d1 A- void tim3() //配置TIM3为基本定时器模式 ,约10us触发一次,触发频率约100kHz
: y: e) s7 G$ o C! m/ P _ - {' C0 R7 p7 e0 ?
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //定义格式为TIM_TimeBaseInitTypeDef的结构体的名字为TIM_TimeBaseStructure
/ v, W( A, }+ g% i; T h' P6 F - TIM_TimeBaseStructure. TIM_Period =9; //配置计数阈值为9,超过时,自动清零,并触发中断# n4 K; c+ |+ d8 T9 S, b$ R
- TIM_TimeBaseStructure.TIM_Prescaler =71; // 时钟预分频值,除以多少
+ V2 I" S# K7 l' p3 D9 q% | - TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频倍数1 X4 w; ]: d1 Q
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 计数方式为向上计数
& ?, q# Q5 x0 g, w/ m& X3 P - TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // 初始化tim3
. V2 Q9 F5 @7 t+ M3 X. M) S+ o - TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除TIM3溢出中断标志7 F4 e. l9 f9 M2 j$ m9 b
- TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); // 使能TIM3的溢出更新中断
) f4 N; q+ c* ?6 H1 f9 y: W - TIM_Cmd(TIM3,ENABLE); // 使能TIM3. s, X9 { \/ {! {+ U. i$ y
- }
复制代码 9 C2 g3 `6 c, J3 u
; i- ]& N) ` h1 K0 U配置中断优先级
& d- g( t0 U& O: P
- void nvic() //配置中断优先级
6 Q7 q3 k4 b/ q; R2 A' \" i - {
' e2 u2 J/ e+ E4 `" C - NVIC_InitTypeDef NVIC_InitStructure; // // 命名一优先级变量; T) J6 [% o& l- Z# o w
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); // 将优先级分组方式配置为group1,有2个抢占(打断)优先级,8个响应优先级9 ~2 T: B; p3 r0 T) N5 J8 a2 K
- NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //该中断为TIM4溢出更新中断6 f, m! ~ W& ^. O
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//打断优先级为1,在该组中为较低的,0优先级最高( O1 v, ?2 [, s0 Y' j+ P
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 响应优先级0,打断优先级一样时,0最高
- s* J5 p& C* O' y! v, F - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 设置使能5 p# s& I4 }, E) F
- NVIC_Init(&NVIC_InitStructure); // 初始化- K+ |. j1 e% N N% U
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //要用同一个Group
9 G, \# j5 l( u# D# P0 F& A - NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3 溢出更新中断
2 M s% _; w# \/ [' p7 ? - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;// 打断优先级为1,与上一个相同,不希望中断相互打断对方
4 Z$ z8 [2 p) k - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 响应优先级1,低于上一个,当两个中断同时来时,上一个先执行
- }# K0 K# h. ^ - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;6 z" N9 o6 h4 L6 q' B* \: z
- NVIC_Init(&NVIC_InitStructure);4 [* a( M' z; X
- }
复制代码
" Y! Q; A; i5 M; V* o R+ a2 z
! i# |& Y$ y$ G4 Z$ ^' j8 C0 {) X" t3 T9 R2 R8 X5 h
1 q5 Q1 j3 f2 P: ?: o代码实现 为了方便按键检测,除了TIM3配置PWM波之外,TIM4用来检测是否有输入。由于使用开漏输出,这里使用5V电源。 - #include "stm32f10x.h"% |; J% y& O9 D$ z
- #include "math.h"" n, ?( f J, y5 P7 L. {+ u! [
- #include "stdio.h"
4 Y1 l+ N( I4 @. T! Q( w/ ]
( X) F8 n; M8 d& i) J8 o; J- u8 counter=0; / _+ K: A7 _, [: W% _' ]: R% ^
- int pwm=100;
8 Y. ]7 H8 f, c& E4 j, n8 ~6 X - int flag=0;
- }1 e: j4 T7 C+ M$ l - int mode =0;3 z' x, l9 ^" Q4 F. ~
- int velocity =0;/ _% M4 |8 [; U# m
- int turning=1;
0 P: ?% i1 N" R" w2 s
# u; W3 Z6 y9 O7 y" L. z5 u- void RCC_Configuration(void); //时钟初始化,开启外设时钟
/ g( W% _8 @' D9 v0 T% p$ N - void GPIO_Configuration(void); //IO口初始化,配置其功能
9 E1 f6 A, _8 l0 i - void tim3(void); //定时器tim4初始化配置+ @3 g3 _. r& H w/ f. d
- void tim4(void); //定时器tim4初始化配置, b$ S1 ^3 N8 X8 l6 B! E& ~
- void nvic(void); //中断优先级等配置
3 Y4 t" J8 I) x4 n+ B - void exti(void); //外部中断配置
! P5 S" Q" j5 y9 b1 m - void delay_nus(u32); //72M时钟下,约延时us+ Q, k- y* n9 E" W: \& H8 V% i
- void delay_nms(u32); //72M时钟下,约延时ms
: {9 l# ~2 `) `) I' b3 [, F( b - void breathing(int velocity){
1 U4 J! c% t* F2 r; @% P. A - switch(velocity){
* R6 `" z# v8 j1 Y4 } - case 0:0 m2 v m' ~5 z' z
- if(flag), @6 m4 S5 R" n7 j- b
- pwm +=1;
9 p! R# [/ F2 S& W/ n - if(pwm>240) flag=0;% R7 W% M6 J3 D; @; i9 u( @
- if(flag == 0){
; ]* F! R2 T/ y, A4 |4 W7 ^ F8 W - pwm -=1;
, A) i6 q9 Y6 N9 Z2 Z6 J4 v7 ? - if(pwm<10) flag=1;
, j& g+ _ |" f - }0 A9 I2 c* i5 Q$ f
- break;3 F* Q5 i% ^ I0 {) ^ Y) l: A
- case 1: ^6 t# e( q8 Q) I9 H' O
- if(flag)
" Q. @0 H$ o$ H+ U* d* h - pwm +=2;
- Z$ i5 k* ?( |' A! e - if(pwm>240) flag=0;& t2 t+ Y `/ j# u$ A
- if(flag == 0){" q: C6 Q0 _8 I! ^" q
- pwm -=2;$ E8 k8 R' y3 Q9 a& \9 t
- if(pwm<10) flag=1;& u$ L( ?/ u0 f
- }; o8 r2 }3 P% h+ o" W, |. k
- break;* a& N& @, i' [ f+ ?
- case 2:" a$ @" D& D6 D/ `: Q- X5 {$ l
- if(flag)
) R& j1 [0 ]) G1 \/ P - pwm +=3;
: ?% }0 o' R/ |- X - if(pwm>240) flag=0;$ B3 @6 Z3 p. K& {, v/ K3 e( v
- if(flag == 0){
# `; h1 i: c0 b+ P# P4 w - pwm -=3;, R9 J/ k) h- V
- if(pwm<10) flag=1;1 n5 ^ j6 [/ W4 L, W* I* \
- }
; `1 e+ s% j* `, Q. p7 p - break;
% \# G. w7 n" a$ X( u2 X' K. Z+ I( y - }
1 D. |0 A/ [& c2 _/ z. S2 G) e# g - } N: b% l0 b2 G
- - U* P9 f- a; a% D
% M, q: W2 f' B1 J+ I- w# }- void assert_failed(uint8_t* file, uint32_t line)6 h. [; \9 J8 @
- {/ G! x, T1 H5 T4 P
- printf("Wrong parameters value: file %s on line %d\r\n", file, line);. P/ Z+ ^) M/ A d, e# z" f2 s2 U
- while(1);, J. c/ I' Y+ n6 d% N
- }
, ^2 F% B7 M, \% t9 E - ; O4 [* E; c# J1 P4 k
- void TIM4_IRQHandler(void) //TIM4的溢出更新中断响应函数 ,读取按键输入值,根据输入控制pwm波占空比1 N! }7 o% h! i" R3 X
- {
! \- y# [. L$ k3 @% r( Y - u8 key_in1=0x01,key_in2=0x01;
! c' Q% h% k* G) H, q! v - TIM_ClearITPendingBit(TIM4,TIM_IT_Update);// 清空TIM4溢出中断响应函数标志位
2 \' `. I6 a, H' O% M - key_in1= GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_12); // 读PC12的状态 k0 p% I) z! e$ s H/ G
- key_in2= GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13);// 读PC13的状态5 Z/ }4 @; O# C3 O" v7 }
- if(key_in1 && key_in2) turning =1;# p, p2 B1 L* o, I
- breathing(velocity);
7 t* t3 O- }6 G* X - if(key_in1==0 && turning){8 k/ H( p9 D/ J6 F$ m: x) A
- turning =0;& f9 _, F. x2 Q" K7 Z
- velocity = (velocity + 1) % 3;
, b/ {, y( Z! E- l/ o5 d3 V - }//调速度4 X; B2 _' d- L& n/ ]+ `8 X" L& y! E
- if(key_in2==0 && turning){0 \% F4 t6 L5 `5 m5 i
- turning =0;( V, g1 o0 V4 b- Q/ N7 ^5 i
- mode = (mode + 1) % 3;
, c! d8 @+ @7 ?# ]" n - }//调颜色( d* S Z7 G8 I% o
- } : Z: V) _. K4 x `3 D* k
- 2 E/ G: W3 @! K* z
( m% R2 s7 R" Z- void TIM3_IRQHandler(void) // //TIM3的溢出更新中断响应函数,产生pwm波
3 o2 R% H! q: ~& s" j& [ - {
( X8 ~2 D# z( ` - TIM_ClearITPendingBit(TIM3,TIM_IT_Update); // // 清空TIM3溢出中断响应函数标志位
6 V" ^3 g! h. T( i& k& T c - if(counter==255) //counter 从0到255累加循环计数,每进一次中断,counter加一
; T. l r( A" v* X* {. s$ \ - counter = 0;
D1 J( f( I9 a3 x+ J) ?0 a( f - else
, S8 i9 P1 ~0 v: \' ] - counter +=1;
% q; \: N( u$ j% v/ y - if(mode == 0){+ N; C L1 @( J/ |! E% o6 D
- if(counter < pwm) //当counter值小于pwm值时,将IO口设为高;当counter值大于等于pwm时,将IO口置低. g9 C; r$ t& x, P) l
- GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1); //将PC14 PC15置为高电平& I* r ~1 s8 B! g
- else `( i' }- c' i
- GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1); // 将PC14 PC15置为低电平
! L+ l! L+ v P$ T$ ?. L& |( U6 @# r2 N - }: n- z* u: Y7 I) ]7 J+ B! v, T. f+ D
- if(mode == 1)
5 ?" l( l, t1 K9 V7 r; w0 T0 q - {
6 j/ E$ S, L! R! v6 W& u - if(counter < pwm) //当counter值小于pwm值时,将IO口设为高;当counter值大于等于pwm时,将IO口置低
7 K' P: [' E+ [2 [3 F6 w/ e - GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2); //将PC14 PC15置为高电平; r4 y: O# F; p
- else 3 e5 ?. c2 g& Z+ Z g
- GPIO_ResetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2); // 将PC14 PC15置为低电平, d. r1 A/ U# G0 t
- } ! P- P) A: d( |* Z& [1 K8 f
- if(mode ==2){* p) v4 y; \) }0 K7 @3 y
- if(counter < pwm) //当counter值小于pwm值时,将IO口设为高;当counter值大于等于pwm时,将IO口置低
% H4 o# B$ t7 g) x0 i - GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_0); //将PC14 PC15置为高电平4 }- t% p: U* P. p$ h$ q8 N, @; f
- else
9 U6 v: ?( n5 A; v+ J' X! I- Z - GPIO_ResetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_0); // 将PC14 PC15置为低电平
# c3 Y' E. |& }! R; k( G - }
# u: E+ [$ `9 P5 } - } ) h- u+ m/ _( g
( b, c' _' w1 i V. X! m
5 ?# L- t( N9 C" H# w" D- int main(void) ~7 d, A) J$ M8 N" y, c
- {
5 o" [- `+ H7 @/ m. U - RCC_Configuration();
& L) ?0 g: l0 R- D0 k' J4 E - GPIO_Configuration();
1 j8 J) i6 y" z3 @4 R! j( ~8 n$ s6 p - tim4();
! Q5 y! o9 q7 ]. o2 t, j5 S$ G6 u - tim3();; j: }+ _+ F/ w5 f# V* a
- nvic(); + }0 ^3 W$ y% Z& t
- while(1)2 J9 J1 Q0 w+ `; {
- { ; x' U1 j, K) ~6 `& q
- } ; J2 }) F* h |# f& r2 M4 {3 g+ U
- } ) K% j) I9 y5 [( R0 f, v' Z
, E- a& D) N% d3 e, ~/ F5 [- void delay_nus(u32 n) //72M时钟下,约延时us
3 o, I+ O x) w1 { - {
9 z, j4 M* S* u. C. ~# N- y - u8 i;
% ~1 H6 E7 Y* R4 Q* A - while(n--)
$ {& z0 {+ l6 s# |1 E8 s9 k - {. u1 O( }! Y- u0 F. X
- i=7;
( L6 d. i7 X( L& Y8 ?. [ o7 u! e - while(i--);2 n( d$ O" w, A; c6 |% M
- }% N1 I1 k* o2 f! l
- }
! r! T0 ?' M; {) c) k" j
! c3 e( V8 C% [1 I- I" Q9 E
# K9 b6 G5 H9 ?+ o0 \% i- void delay_nms(u32 n) //72M时钟下,约延时ms
, c) Y+ @5 }. m& Q - {
6 b% n) P" v) t7 @2 c9 b - while(n--)' S0 f$ b' A% T, s* U1 W
- delay_nus(1000);" X2 \# I+ c$ x$ F$ O
- }7 n5 k3 [, g l9 f3 J
* Z0 ^& `; @; J/ [. G `0 Z0 c- 8 `- G) P; {% u7 B J4 s
- void RCC_Configuration(void) //使用任何一个外设时,务必开启其相应的时钟3 I: X" K9 v; C/ ?; w1 Z& X% M3 K
- {4 r) }4 G& c9 I
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); //使能APB2控制外设的时钟,包括GPIOC, 功能复用时钟AFIO等, 6 K- O1 }+ L' D- v
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4|RCC_APB1Periph_TIM3, ENABLE); //使能APB1控制外设的时钟,定时器tim3、4,其他外设详见手册
5 I7 } H8 x- ^- H& L9 h) k - }/ U) m) g% g# W+ q/ ^
- ) v) D3 k# Y7 N2 t0 l
) G% A# f% O4 C4 o3 [. ?8 N, b7 b3 X: c- void GPIO_Configuration(void) //使用某io口输入输出时,请务必对其初始化配置) t3 z! o7 U9 Q- E
- {
. G! P& L" k; f& L4 \ - GPIO_InitTypeDef GPIO_InitStructure; //定义格式为GPIO_InitTypeDef的结构体的名字为GPIO_InitStructure / J) f4 w7 {1 X+ ]) [6 d
- //typedef struct { u16 GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed; GPIOMode_TypeDef GPIO_Mode; } GPIO_InitTypeDef;
, J4 T1 f- w+ m7 P - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //配置IO口的工作模式为上拉输入(该io口内部外接电阻到电源)) j& s8 R& w3 @, h/ }4 E
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //配置IO口最高的输出速率为50M; |, O8 |5 ]- m5 K
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13; //配置被选中的管脚,|表示同时被选中/ @% v$ a% y2 J5 t" d% s" a* d/ p$ ~
- GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化GPIOC的相应IO口为上述配置,用于按键检测
1 t, a8 }/ D& u1 u$ \1 a+ w - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //配置IO口工作模式为 推挽输出(有较强的输出能力)
* T2 l3 i9 @$ S9 e# N& H - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //配置IO口最高的输出速率为50M' C1 \: c7 S0 Y2 q H/ l
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2; //配置被选的管脚,|表示同时被选中- E3 l/ l! l, C+ C- v7 K* @! ~2 h8 G
- GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA的相应IO口为上述配置
/ }# Z/ a4 }; ~. X! w+ `8 x - GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); //失能STM32 JTAG烧写功能,只能用SWD模式烧写,解放出PA15和PB中部分IO口
- o4 v9 w" o8 [- q- l - }4 P& B# Z( R# \
- - k* J' U$ u0 ?, X0 L1 d
- 5 R2 h4 }9 f. Z7 T8 L% Z
- void tim4() //配置TIM4为基本定时器模式,约10ms触发一次,触发频率约100Hz
" T" N, G6 J! A3 O - {
! G7 a% D4 M# }9 U - TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //定义格式为TIM_TimeBaseInitTypeDef的结构体的名字为TIM_TimeBaseStructure : b2 e1 I+ k! X, i* d
- TIM_TimeBaseStructure. TIM_Period =9999; // 配置计数阈值为9999,超过时,自动清零,并触发中断
9 M3 Y$ P4 I& b6 u/ l/ ` - TIM_TimeBaseStructure.TIM_Prescaler =71; // 时钟预分频值,除以多少. C3 u$ a' a% U% _ X1 b7 C0 c; k
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频倍数
, ?1 H: F/ `* n" F+ R9 Q - TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 计数方式为向上计数3 _$ n4 t7 S# f5 w" |
- TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); // 初始化tim4
' k, J: g; I0 J7 P" D s8 i" L! w - TIM_ClearITPendingBit(TIM4,TIM_IT_Update); //清除TIM4溢出中断标志
. Z* X1 u8 u' |9 \$ k- _1 c - TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); // 使能TIM4的溢出更新中断3 b- r. _5 Y) a+ P' V9 n& f
- TIM_Cmd(TIM4,ENABLE); // 使能TIM4
5 j' t' ?8 r& A8 X6 Z# X - }
/ `/ R/ Y ]8 U* i$ _; Q
5 R! Y1 K0 O( b6 P- + N8 k+ o @0 P8 M q* k
- void tim3() //配置TIM3为基本定时器模式 ,约10us触发一次,触发频率约100kHz' L, L& a, j7 M& Q
- {% a+ F! ]4 M% Y8 v! G
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //定义格式为TIM_TimeBaseInitTypeDef的结构体的名字为TIM_TimeBaseStructure 9 k* ~0 V$ G" Q6 N* F: g2 {% l
- TIM_TimeBaseStructure. TIM_Period =9; //配置计数阈值为9,超过时,自动清零,并触发中断
3 d8 Z6 U' n% u* r8 k - TIM_TimeBaseStructure.TIM_Prescaler =71; // 时钟预分频值,除以多少: {; o+ S, e# l( w- h
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频倍数9 n% d% C) G$ g9 u/ I4 {" l
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 计数方式为向上计数8 [ [& P. \ C5 M9 q' ]& s
- TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // 初始化tim3" h& z( e0 z+ Y) n/ F
- TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除TIM3溢出中断标志
7 B" k8 p$ D7 s0 w- F3 l+ g - TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); // 使能TIM3的溢出更新中断
) M# U2 R; L5 }3 z, V - TIM_Cmd(TIM3,ENABLE); // 使能TIM3
- n$ C M. g* x2 c - }
& O. o' `7 B9 `4 } - . j7 e0 Q+ a, }& V1 n" s) \3 K
! H# c1 @% A. z# U& W @ [- void nvic() //配置中断优先级
% h6 f$ l/ R$ U) P - {
8 l/ T- @/ T* w1 u+ G - NVIC_InitTypeDef NVIC_InitStructure; // // 命名一优先级变量
2 C" A' P" v F: z6 \3 M; H - NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); // 将优先级分组方式配置为group1,有2个抢占(打断)优先级,8个响应优先级
2 e( u6 C8 E+ ]! w8 g- a - NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //该中断为TIM4溢出更新中断- z0 ~7 N5 y: }2 H) I
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//打断优先级为1,在该组中为较低的,0优先级最高6 z5 M1 g- g8 @- ^
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 响应优先级0,打断优先级一样时,0最高
' L* a- ~! D' s - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 设置使能' O. V' h+ t+ [' n9 ~& |
- NVIC_Init(&NVIC_InitStructure); // 初始化
% a* `* U* h3 T; u: O/ Z/ i" r - NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //要用同一个Group
. z7 P0 O0 ]+ Y- Z+ k - NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3 溢出更新中断
1 {" K8 e" Z; Z$ _ - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;// 打断优先级为1,与上一个相同,不希望中断相互打断对方6 P" R( l F9 z* \2 X! G
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 响应优先级1,低于上一个,当两个中断同时来时,上一个先执行
1 X7 |3 h# q3 h - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;, X- u* t' ~/ o3 F! n# O
- NVIC_Init(&NVIC_InitStructure);
" f: {9 H4 O# Q. {4 o - }
复制代码
* A: p0 O+ Z ^转载自:单片机与嵌入式
8 F/ L1 t% c7 t* ]如有侵权请联系删除8 _' r7 Z, D/ F+ V* x
! F& |0 l K+ |$ t6 U
# A/ |. u; [; v* ] T1 K, ]5 {# T
3 y( U, W. t4 M% T3 j3 x
# ?* r) q. V+ \ |