
本帖最后由 wambob 于 2015-1-8 12:09 编辑 e4 {% T: N4 i( I 最近要用到系统滴答来做扫描键盘,看了一些资料.( q: g. G. B+ d# b, R4 x' U 系统滴答就是一个24位的倒计时定时器,而且能够自动装置。7 i1 G8 d1 e8 c: E" G L 提到计数器,想必都知道,系统滴答也不例外,也是个计数器.而且是倒计数,当为0时,会出现一个标志位:COUNTFLAG. 可以查询这个标志.用来延时.2 z* r7 W4 J% w6 {! _2 E6 b5 p' | 系统CM0.H里的定义: __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)' a. `( p) _4 H' a { if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ SysTick->LOAD = ticks - 1; /* set reload register */ NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */# }& u/ k+ s( ?" u0 W8 I. d SysTick->VAL = 0; /* Load the SysTick Counter Value */# G6 C. N0 w9 a7 ^# z0 M" I, F- h9 r. l SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk |/ q1 W7 `; o: o) E3 R SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */, f4 \( I H# O- A$ @! W return (0); /* Function successful */( b: y4 e, E/ s- } } 1.根据定义,可以写个延时函数 Systick.c3 a0 r8 A( V2 I3 l. M1 l( ^ #include "systick.h" void Delay_Nms(int16_tNms) { Syytem->LOAD=(int32_t)Nms*9000; //装载初值 SysTick->CTRL|=0x01; //开始计时9 M+ `2 h. n3 u( }) p. m3 r while(!(SysTick->CTRL&(1<<16))); SysTick->CTRL=0X00000000; SysTick->VAL=0X00000000;% x4 v) K& m8 G- |/ Z9 A }! \, X0 H! V" u6 V- K! L1 M4 V3 D systick.h9 f5 p7 J U4 S #ifndef _SYSTICK_H #define _SYSTICK_H #include "stm32f0xx_conf.h" void Delay_Nms(uint16_t Nms);' o# U+ A3 t# a/ `7 V8 p4 t2 i #endif 2.扫描键盘用中断的方法 程序调用core_cm0.c里的SysTick_Config的函数 if(SysTick_Config(SystemCoreClock/100) //配置滴答频率 1秒/100= 10MS- W& a* t4 _2 T* P' Y; u3 O { KeyScan(void);7 J# t) G2 `$ R1 H+ J4 M+ o }" m9 `3 M0 P9 ?5 c) a4 {2 u8 h, l ' h* x6 { L$ ~ SystemCoreClock 在 system_stm32f0xx.c 中定义为 uint32_t SystemCoreClock =48000000;3 z: g9 u5 F/ s( g1 G K2 h* t; L) X' H/ C , B' e$ o4 F! v' {; i9 s" w1 X( r1 ] : S0 v6 h" @$ l+ y* |7 n. V % t; W& Q& G8 W0 {8 g- ~: s. {5 d |
必须的,刚学习,自己的体会