
在嵌入式中用的最多,最普通的可以就是IO口和定时器了,在51时代要多个定时器真是难。到了ARM时代这个问题就不是问题了,下面就做32个16位定时器。; F) w7 g, }) m9 p$ u! p* I8 L & b7 t* e! O2 b( a) {3 J 在stm32f1系列中TM1,TM8为两个高级定时器,TM2,TM3,TM4,TM5,TM6,TM7,6个普通定时器,它们都是16位的,每个有4路独立的比较器。这样我们就有8*4=32个比较器了,我们就是要用这32个比较器做出32个定时器: }' T% N( o- M8 j; o7 E* H 我们先看一下定时器的输出比较功能:资料上说此项功能是用来控制一个输出波形,或者指示一段给定的的时间已经到时,这里我们就用输出一个固定时间的功能,我们先让计数器的最小计数时间为我们要的时间单元,比如1ms。然后设置比较器的比较值为我们要的定时值,如20,则为20MS,在产生的中断中,我们更改新为比较值,将比较值再加20,则为新的比较对象,下一个中断则在20秒后。. A0 w# q" o! d- R 以下我们取一个定时器,做4个16们定时器,我们要得到4个定时器,分别为10ms,20ms,50ms,200ms. 系统时为72MHZ,通过设置分频值得到一个1KHZ的时钟源, 我们先将定时器的计数器TIMx_ARR设置为65535,计数器加1为1ms,加到最大值时清0重新计数" _9 F/ x# G1 C8 {+ H) y2 x) X 定义4个变量 U16 T10MS=10; U16 T20MS=20;6 Z, q/ D% e1 Z* g3 s1 ^/ P U16 T50MS=50; U16 T200MS=200 TIMx_CCR1+=T10MS;5 a! ?# N8 @* {& E1 F TIMx_CCR2+=T20MS; TIMx_CCR3+=T50MS; TIMx_CCR4+=200MS; 将比较器中断使能 在每个对应中断中加更新比较值的语句 ISR TCMP1() {! w8 Z, B6 v; [8 i TIMx_CCR1+=T10MS; //更新比较值 }5 \4 w7 o" a+ p% d* X ISR TCMP2() {' O8 c1 h2 \5 E1 T9 S8 h Q8 k( t# q/ }# Z TIMx_CCR2+=T20MS; //更新比较值# Z. I a* `: G* d } ISR TCMP3() { TIMx_CCR3+=T50MS; //更新比较值 }; X" A& }5 Z1 U& f ISR TCMP4(): v Z8 T% m b3 g {) l& M, [! V" {* Q TIMx_CCR4+=T200MS; //更新比较值' m2 \+ {6 R. ^, U) q5 u2 |" K } 9 j7 B ?$ e! D5 m& U - g; Z! P8 K7 t7 w \ F 这样每个中断就对就相应的定时时间了。 怎样还可以吧,8*4=32个定时器。4 D$ X0 O4 E0 k' t' L( |5 V' O |