您的位置 首页 被动

LM3S9B96 定时器的装备

定时器是任何一款MCU最重要的一部分。很多初学者认为定时器会占用CPU资源,这是错误的。其实,定时器和CPU是分开工作的,谁都不影响谁,只…

守时器是任何一款MCU最重要的一部分。许多初学者以为守时器会占用CPU资源,这是过错的。其实,守时器和CPU是分隔作业的,谁都不影响谁,仅仅当守时的时刻到了,CPU会依照用户写的代码,做一些作业罢了。

lm3s9b96这款处理器的守时器,运用起来仍是比较便利的。
最重要的便是设对守时器的作业形式(32位作业形式仍是16位作业形式),守时周期。
下面以lm3s9b96的timer0为例,进行守时周期为1s的装备

#include “inc/lm3s9b96.h”
#include “inc/hw_memmap.h”
#include “inc/hw_types.h”
#include “inc/hw_ints.h”
#include “driverlib/interrupt.h”
#include “driverlib/gpio.h”
#include “driverlib/timer.h”
#include “driverlib/sysctl.h”

/* 用于调试 PF1 <-> LED —————————————————–*/
#define LED_PERIPH SYSCTL_PERIPH_GPIOF
#define LED_PORT GPIO_PORTF_BASE
#define LED_PIN GPIO_PIN_1
#define LED_OFF 1 << 1
#define LED_ON ~(1 << 1) // 低电平点亮LED
//*****************************************************************************
//
// 延时函数
//
//*****************************************************************************
void Delay(volatile signed long nCount)
{
for(; nCount != 0; nCount–);
}

//*****************************************************************************
//
// LED初始化函数,用于调试timer, watchdog等
//
//*****************************************************************************
void LED_Init(void)
{
// 使能LED地点的GPIO端口
SysCtlPeripheralEnable(LED_PERIPH);

// 设置LED地点管脚为输出
GPIOPinTypeGPIOOutput(LED_PORT, LED_PIN);

// 平息LED(默许LED是点亮的,低电平点亮LED)
GPIOPinWrite(LED_PORT, LED_PIN, LED_OFF);
}

//*****************************************************************************
//
// timer0设置为1s溢出一次; TIMER_A初值:0x00F42400,向下递减计数
//
//*****************************************************************************
void Timer0_Init(void)
{
// 使能Timer0模块地点的GPIO端口
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);

// 装备Timer0为32位周期守时器
TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER);

// 设置计数器为:(16000000 / 1)个时钟周期,即1s
TimerLoadSet(TIMER0_BASE, TIMER_A, SysCtlClockGet() / 1);

// 使能Timer0的A通道中止
IntEnable(INT_TIMER0A);

// 使能Timer0A超时中止
TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);

// 发动Timer0计数
TimerEnable(TIMER0_BASE, TIMER_A);
}

//*****************************************************************************
//
// 主函数
//
//*****************************************************************************
int main(void)
{
// Set the clocking to run directly from the crystal.
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);

LED_Init();
Timer0_Init();
IntMasterEnable(); // 开总中止

while (1)
{
}
}

//*****************************************************************************
//
// 守时器0中止处理函数. 1s溢出一次
//
//*****************************************************************************
void Timer0AIntHandler(void)
{
// 铲除中止状况,重要!
TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);

GPIOPinWrite(LED_PORT, LED_PIN, (GPIOPinRead(LED_PORT, LED_PIN) ^ LED_PIN));
}

依照前面讲的中止映射表的装备,将startup_ewarm.c文件中增加两处代码。编译、运转即可。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/beidong/275139.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部