的定时器我们已经是相当熟悉啦。但是,对于第一次接触新唐,第一次接触cortex的定时器一样,都是加1计数,但是功能和容量变大了),包括4个32位定时器(里面放24位的数据),还有分频功能。TMER0到TMER3中我们用的是计数)。这是一种简单的24位写清零、递减、子封装灵活控制的计数器。他可以作为rtos变成一样的啦),也就是中断函数放在、首先为系统时钟选择时钟源(晶振)。
、之后配置系统定时控制寄存器SysTick
到23位
到23位
、和上面一样,首先配置时钟控制寄存器,选择时钟源(晶振)
、定时控制器TMR配置
种模式5个时钟源什么的,好多,所以我们基本上是先查自己需要的模式,在进行设置。
位。
跳新唐cortex——思想转变和程序详解中,都是以讲述新唐思想、编程思想为主。但是近期看了一下大家的笔记,可能更是热衷于贴出来程序。呵呵 不过我也从大家的程序中找到了许多应用的知识。所以,在此,我也贴上一个定时器有关的例程,以供大家对照、比对、参考学习。
本例程led_bee_timer 主要是使用新唐中的两种定时器,分别用作led灯和蜂鸣器的计时。其中,使用系统定时器(SYSTICK)来为蜂鸣器定时,蜂鸣器间歇性开关发声;使用定时器(TMR0)来控制LED流水灯定时。两种定时器都使用了中断函数进行目标的控制,大家要注意两种中断的异同。例程中保留了调试时的东西,希望大家也可以从中看到些许调试技巧。例程中为了方便,并没有套用程序框架,是进行的裸编程,而适合新唐的程序框架,笔者也正在摸索之中,哪位有比较成熟的框架结构,还希望共享一下。呵呵,先啰嗦到这里,下面附上例程:
#include"include.h" E_TYPE_LED temp_led; ; //uint8_t test = 0; void AllLedOff() { DrvGPIO_SetBit(E_GPA,); DrvGPIO_SetBit(E_GPA,); DrvGPIO_SetBit(E_GPA,); DrvGPIO_SetBit(E_GPA,); } void Tim0CALLBACK(void) //定时器0中断函数 执行LED { // DrvGPIO_ClrBit(E_GPA,2); // DrvGPIO_ClrBit(E_GPA,5); switch(temp_led++)//(test++) { case LED1 ://1: AllLedOff(); DrvGPIO_ClrBit(E_GPA,); break; case LED2 ://2: AllLedOff(); DrvGPIO_ClrBit(E_GPA,); break; case LED3 ://3: AllLedOff(); DrvGPIO_ClrBit(E_GPA,); break; case LED4 : //4: AllLedOff(); DrvGPIO_ClrBit(E_GPA,); break; default : AllLedOff(); temp_led = LED1;//test = 1; break; } } void BeeOn() //蜂鸣器 { DrvGPIO_SetBit(E_GPB,); //怎么读入某位的值 } void BeeOff() { DrvGPIO_ClrBit(E_GPB,); } void SysTick_Handler(void) //系统定时器中断函数 { flag_100ms++; ) { // DrvGPIO_ClrBit(E_GPA,4); // DrvGPIO_SetBit(E_GPA,5); BeeOn(); } ) && (flag_100ms <= )) { // DrvGPIO_ClrBit(E_GPA,5); // DrvGPIO_SetBit(E_GPA,4); BeeOff(); } ) { flag_100ms = ; } } void GPIOInit() { DrvGPIO_Open(E_GPA,,E_IO_OUTPUT); DrvGPIO_Open(E_GPA,,E_IO_OUTPUT); DrvGPIO_Open(E_GPA,,E_IO_OUTPUT); DrvGPIO_Open(E_GPA,,E_IO_OUTPUT); DrvGPIO_Open(E_GPB,,E_IO_OUTPUT); } void TIMERInit() { DrvTIMER_Init(); DrvSYS_SelectIPClockSource(E_SYS_TMR0_CLKSRC,); DrvTIMER_Open(E_TMR0,,E_PERIODIC_MODE); //每秒tick数 每秒tick一次 DrvTIMER_SetTimerEvent(E_TMR0,,(TIMER_CALLBACK) Tim0CALLBACK,); //定时器的tick周期 每秒1次 // DrvTIMER_Open(E_TMR0,1,E_PERIODIC_MODE); //每秒tick数 每秒tick一次 DrvTIMER_EnableInt(E_TMR0); DrvTIMER_Start(E_TMR0); } void SYSCLKInit() { DrvSYS_SelectSysTickSource(); SysTick->CTRL = 0x00000003; SysTick->VAL = 0x00000000; SysTick->LOAD = 0x6000; //100ms } void SysInit() { UNLOCKREG(); SYSCLK->PWRCON.XTL12M_EN = ; LOCKREG(); GPIOInit(); //GPIO 初始化 TIMERInit(); SYSCLKInit(); } int main() { SysInit(); ) { ; } }