|
本帖最后由 wambob 于 2015-1-8 12:09 编辑 : W2 t) h$ K- u9 v+ B 最近要用到系统滴答来做扫描键盘,看了一些资料. 系统滴答就是一个24位的倒计时定时器,而且能够自动装置。* L( c2 q. B! B: q3 l# ^/ ` 提到计数器,想必都知道,系统滴答也不例外,也是个计数器.而且是倒计数,当为0时,会出现一个标志位:COUNTFLAG. 可以查询这个标志.用来延时. 系统CM0.H里的定义:5 V7 S0 q2 u7 I2 z __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)7 L" Q* G( T, U8 [ { 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 */8 ~) e; N: E; \6 L3 Y5 B9 A) _9 B- h SysTick->VAL = 0; /* Load the SysTick Counter Value */( O" K1 B+ A- w SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |- a: |6 {, i8 ]/ ]- u T SysTick_CTRL_TICKINT_Msk |# P- E/ m8 @6 N; q# | SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ ] Z0 [3 K" o! K( l& } return (0); /* Function successful */ ~1 A p- V) _2 w. T5 B }# t1 r b2 [. u7 P8 d) z7 p& ~ [ 1.根据定义,可以写个延时函数1 |9 w; \6 [$ m Systick.c1 H/ i7 [- V3 {9 v, d #include "systick.h". |: H' w( ], [8 u void Delay_Nms(int16_tNms)# `! `- L* [! l/ ?4 ^ { Syytem->LOAD=(int32_t)Nms*9000; //装载初值 y1 z) N" O- z( ` SysTick->CTRL|=0x01; //开始计时 while(!(SysTick->CTRL&(1<<16))); SysTick->CTRL=0X00000000; SysTick->VAL=0X00000000;2 L$ k+ c j w" a3 i } systick.h2 X$ R' n x2 ] #ifndef _SYSTICK_H #define _SYSTICK_H #include "stm32f0xx_conf.h" void Delay_Nms(uint16_t Nms);0 p1 v. i. a% \2 w8 o- } #endif/ p; \. l/ k' {0 \ 2 G, T$ U8 p2 C f A 2.扫描键盘用中断的方法6 f$ T2 X& _# D3 ` 程序调用core_cm0.c里的SysTick_Config的函数 if(SysTick_Config(SystemCoreClock/100) //配置滴答频率 1秒/100= 10MS {7 }+ f M, S* J1 L3 f7 s KeyScan(void);* r0 ^5 G' m: Q+ T5 D0 w } 4 L+ |0 c/ g' _8 x SystemCoreClock 在 system_stm32f0xx.c 中定义为 uint32_t SystemCoreClock =48000000;, {& C* f7 y `' W$ t6 ~ 9 B6 \9 A: w: L/ h 2 ]; p4 H9 _1 v2 Y( U 7 @4 h: Q' @/ T V: ^! j4 ~6 ?9 j4 ^ 7 j [- q6 ?& c5 C# t& l) b |
微信公众号
手机版
必须的,刚学习,自己的体会