
本帖最后由 wambob 于 2015-1-8 12:09 编辑 8 {! E/ ]1 w8 q/ @% a! ]" Q/ M 最近要用到系统滴答来做扫描键盘,看了一些资料. 系统滴答就是一个24位的倒计时定时器,而且能够自动装置。 提到计数器,想必都知道,系统滴答也不例外,也是个计数器.而且是倒计数,当为0时,会出现一个标志位:COUNTFLAG. 可以查询这个标志.用来延时./ R, k, V# b8 J( O8 c% i 系统CM0.H里的定义: __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)( A4 s4 R W3 _. Q' R) G; q { if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */4 l! S; s/ x- f SysTick->LOAD = ticks - 1; /* set reload register */ NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */9 K# j0 H8 k+ M. W2 H% N SysTick->VAL = 0; /* Load the SysTick Counter Value */4 o- g' r* h) s9 m7 }, x: }2 L3 `7 f SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ return (0); /* Function successful */ } 1.根据定义,可以写个延时函数1 _& C( v" M" Q7 }7 M0 R% A Systick.c0 G- h0 U& i, V #include "systick.h" void Delay_Nms(int16_tNms); o+ M: G2 o9 H6 ] {% g- b% q! d7 t Syytem->LOAD=(int32_t)Nms*9000; //装载初值 SysTick->CTRL|=0x01; //开始计时$ ]; V9 g) W4 b, v3 D while(!(SysTick->CTRL&(1<<16))); SysTick->CTRL=0X00000000; 0 L4 D4 e$ Z9 p* g6 s4 `% s SysTick->VAL=0X00000000;) X0 Q% N& P. I) a }% }7 X5 E# `4 n( }; q7 g systick.h #ifndef _SYSTICK_H #define _SYSTICK_H' @$ B6 S: t/ i5 V2 M0 _ #include "stm32f0xx_conf.h"" `/ i9 T; E' \) g8 e, C5 ] void Delay_Nms(uint16_t Nms);- k f! D) I9 i3 c+ t% E) g8 l #endif ; c8 a2 D! J1 P% Z& B- {% `- a 2.扫描键盘用中断的方法 B6 z1 I5 w! O) `, S( T1 r. p' y 程序调用core_cm0.c里的SysTick_Config的函数9 r9 K: E6 Y3 ~ D3 e# X6 ]3 x if(SysTick_Config(SystemCoreClock/100) //配置滴答频率 1秒/100= 10MS9 L! M% s& {# a1 Q2 a8 y3 h5 ^ { KeyScan(void); }5 k& s3 D- R7 E3 x7 ^ SystemCoreClock 在 system_stm32f0xx.c 中定义为 uint32_t SystemCoreClock =48000000;, p) R7 x9 a$ f2 O, R # p0 [: V8 K J+ S& n 8 Z! }9 @+ D4 S( u( Y2 \ |
必须的,刚学习,自己的体会