电子产业
数字化服务平台

扫码下载
手机洽洽

  • 微信小程序

    让找料更便捷

  • APP

    随时找料

    即刻洽谈

    点击下载PC版
  • 公众号

    电子元器件

    采购信息平台

  • 移动端

    生意随身带

    随时随地找货

  • 华强商城公众号

    一站式电子元器件

    采购平台

  • 芯八哥公众号

    半导体行业观察第一站

Cortex-M3 (NXP LPC1788)之SysTick系统节拍定时器

来源: 作者:华仔 浏览:484

标签:

摘要:在GPIO控制篇中的延时闪烁LED只用了简单的for循环,为了精确的计时本篇介绍使用SysTick定时器每1ms产生中断,从而实现精确定时的目的。要使用系统节拍定时器主要进行两个部分的配置。1:系统时钟控制。2系统节拍定时器的控制。一,系统时钟控制 LPC1788有3个独立的振荡器。他们是主振荡器,内部RC振荡器,RTC振荡器。复位后,LPC1788将用内部的RC振荡器运行,直到被软件切换。

在GPIO控制篇中的延时闪烁LED只用了简单的for循环,为了精确的计时本篇介绍使用SysTick定时器每1ms产生中断,从而实现精确定时的目的。要使用系统节拍定时器主要进行两个部分的配置。1:系统时钟控制。2系统节拍定时器的控制。一,系统时钟控制

LPC1788有3个独立的振荡器。他们是主振荡器,内部RC振荡器,RTC振荡器。复位后,LPC1788将用内部的RC振荡器运行,直到被软件切换。这样就能在没有任何外部晶振的情况下运行。LPC1788的时钟控制如图1所示

在开发板上使用12M的晶振作为主振荡器,它通过锁相环PLL0来提高频率提供CPU。由于芯片总是从内部的RC振荡器开始工作,因此主振荡器只会应软件的请求而启动。实现方法是设定SCS寄存器中的OSCEN位使能。主振荡器提供一个状态标志SCS寄存器的OSCSTAT位,这样软件就可以确定何时主振荡器在运行稳定。此时,软件可以控制切换到主振荡器,使其作为时钟源。在启动以前,必须通过SCS的OSCRANGE位,选择一个频率范围。在确定了主振荡器之后,需要进行锁相环的配置。1,配置CLKSRCSEL选择正确的时钟源。2,将正确的PLL设置值写入PLLCFG寄存器并且在PLLCON中使能PLL。3,向PLLFEED寄存器中写入馈送序列0xAA,0x55。4,设置所需的时钟分配器如CCLKSEL,PCLSEL,EMCCLKSEL,以及USBCLKSEL寄存器。5,查询PLLSTAT寄存器等待PLL锁定。

二,系统节拍定时器的控制

LPC1788的系统节拍定时器是一个24位的定时器,当数值达到0时产生中断。系统节拍定时器的时钟信号可以由CPU时钟提供(即图1中的cclk)。想要在规定的时间间隔循环的产生中断,必须将指定的正确时间间隔值装入STRELOAD寄存器进行初始化。假如我们选择cclk作为系统节拍的时钟信号,并且根据开发板将系统时钟设置成12MHZ,为了循环1ms产生一次中断,我们写入STRELOAD的值为cclk/1000 - 1 。

程序的代码如下,使LED灯每500ms闪烁。SystemInit函数在启动文件中被调用。

#definerFIO1DIR(*(volatileunsigned*)0x20098020)#definerFIO1MASK(*(volatileunsigned*)0x20098030)#definerFIO1PIN(*(volatileunsigned*)0x20098034)#definerFIO1SET(*(volatileunsigned*)0x20098038)#definerFIO1CLR(*(volatileunsigned*)0x2009803c)#definerCLKSRCSEL(*(unsigned*)(0x400FC10C))//时钟源选择寄存器#definerPLL0CON(*(unsigned*)(0x400FC080))//PLL0控制寄存器#definerPLL0CFG(*(unsigned*)(0x400FC084))//PLL0配置寄存器#definerPLL0STAT(*(unsigned*)(0x400FC088))//PLL0状态寄存器#definerPLL0FEED(*(unsigned*)(0x400FC08C))//PLL0馈送寄存器#definerPLL1CON(*(unsigned*)(0x400FC0A0))#definerPLL1CFG(*(unsigned*)(0x400FC0A4))#definerPLL1STAT(*(unsigned*)(0x400FC0A8))#definerPLL1FEED(*(unsigned*)(0x400FC0AC))#definerCCLKSEL(*(unsigned*)(0x400FC104))//CPU时钟选择寄存器#definerUSBCLKSEL(*(unsigned*)(0x400FC108))//USB时钟选择寄存器#definerPCLKSEL(*(unsigned*)(0x400FC1A8))//外设时钟寄存器#definerPCON(*(unsigned*)(0x400FC0C0))#definerPXCONP(*(unsigned*)(0x400FC0C4))#definerSCS(*(unsigned*)(0x400FC1A0))//系统控制和状态寄存器#definerCLKOUTCFG(*(unsigned*)(0x400FC1C8))#definerSTCTRL(*(unsigned*)(0xE000E010))#definerSTRELOAD(*(unsigned*)(0xE000E014))#definerSTCURR(*(unsigned*)(0xE000E018))#definerSTALIB(*(unsigned*)(0xE000E01C))#defineCCLK120000000volatileunsignedlongSysTickCnt;/*系统时钟初始化*/voidSystemInit(){rSCS&=~(0x1<<4);//频率12MrSCS|=(0x1<<5);//使能主振荡器while(0==(rSCS&(0x1<<6)));//等待主振荡器稳定rCLKSRCSEL=0x1;rPLL0CFG=0x9;//配置CCLK=120MrPLL0CON=0x01;rPLL0FEED=0xAA;rPLL0FEED=0x55;while(0==(rPLL0STAT&(0x1<<10)));rCCLKSEL=(0x1|(0x1<<8));rPCLKSEL=0x2;//配置PCLK=60MrCLKOUTCFG=0x0|(0xb<<4)|(0x1<<8);}/*系统节拍定时器初始化*/unsignedcharSysTick_Config(unsignedintticks){if(ticks>0xFFFFFFUL)return0;rSTRELOAD=ticks;rSTCURR=0x0;rSTCTRL=(0x1)|(0x1<<1)|(0x1<<2);return1;}/*系统节拍定时器中断处理函数*/voidSysTick_Handler(void){SysTickCnt++;}intmain(){unsignedcharvalue=1;SysTick_Config(CCLK/1000-1);//每1ms产生一次SysTick系统异常rFIO1DIR|=(1<<18);//GPIO1.18->OUTPUTwhile(1){if(SysTickCnt>=500){SysTickCnt=0;value=!value;}if(0==value){rFIO1PIN&=~(1<<18);}elseif(1==value){rFIO1PIN|=(1<<18);}}}
型号 厂商 价格
EPCOS 爱普科斯 /
STM32F103RCT6 ST ¥461.23
STM32F103C8T6 ST ¥84
STM32F103VET6 ST ¥426.57
STM32F103RET6 ST ¥780.82
STM8S003F3P6 ST ¥10.62
STM32F103VCT6 ST ¥275.84
STM32F103CBT6 ST ¥130.66
STM32F030C8T6 ST ¥18.11
N76E003AT20 NUVOTON ¥9.67
Baidu
map