arm7 lpc2478在ucos操作系统下定时器中断程序怎么写?急切请教!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了arm7 lpc2478在ucos操作系统下定时器中断程序怎么写?急切请教!相关的知识,希望对你有一定的参考价值。

呵呵!那个你看里面的tmr的代码就知道了!比较简单的!肯定是不能用_irq的!我给你贴段代码出来!你参考哈!
void UartInit(CPU_INT32U PortNum,CPU_INT32U baudrate )

CPU_INT32U Fdiv;
if ( PortNum == 0 )

#if UART0_EN>0
PINSEL0 = 0x00000050; /* RxD0 和 TxD0 */

U0LCR = 0x83; /* 8 位数据位, 无校验位, 1 位停止位 */
Fdiv = ( Fpclk / 16 ) / baudrate ; /*波特率设置 */
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x03; /* DLAB = 0 */
U0FCR = 0x07; /* 使能和复位 TX 和 RX 的FIFO */

VICIntSelect &= ~(1 << VIC_UART0); /* 配置uart0中断为 IRQ 中断源 */
VICVectAddr6 = (CPU_INT32U)Uart0_ISR_Handler; /* 设置中断地址 */
VICIntEnable = (1 << VIC_UART0); /* 使能uart0中断源 */

U0IER = IER_RBR | IER_THRE | IER_RLS; /* 使能 UART0 的中断 */

下面是中断服务程序ISR
void Uart0_ISR_Handler(void)

#if UART0_EN>0

#if OS_CRITICAL_METHOD == 3 /* 分配存储空间给CPU状态寄存器 */
OS_CPU_SR cpu_sr = 0;
#endif

CPU_INT08U IIRValue, LSRValue;
CPU_INT08U Dummy = Dummy;
只截了一部分哈!主要是后面是我们公司一个项目里面的了!呵呵!
参考技术A 先学裸机下的中断程序追问

裸机中断服务程序前会有_irq 但在操作系统下加的话就会出错,请问为什么?

Systick定时器详解

Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有Systick定时器。

Systick定时器常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做UCOS心跳时钟。

Systick定时器就是系统滴答定时器,一个24位的倒计数定时器,计到0时,将从RELOAD寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。

SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。

4个Systick寄存器:

CTRL            SysTick 控制和状态寄存器 

LOAD           SysTick 自动重装载除值寄存器

VAL    SysTick 当前值寄存器

CALIB          SysTick 校准值寄存器

 

SysTick 控制和状态寄存器- CTRL

技术图片

主要只用到上面四位

对于STM32,外部时钟源是 HCLK(AHB总线时钟)的1/8,内核时钟是 HCLK时钟,根据配置函数SysTick_CLKSourceConfig()的入口参数来确定使用的是哪个时钟源

 

SysTick 重装载数值寄存器- LOAD

技术图片

 

 

SysTick 当前值寄存器- VAL

技术图片

 

 

固件库中的Systick相关函数:

SysTick_CLKSourceConfig() //Systick时钟源选择 misc.c文件中

SysTick_Config(uint32_t ticks) //初始化systick,时钟为HCLK,并开启中断,在core_cm3.h/core_cm4.h文件中;入口参数ticks确定了一秒钟中断多少次

SysTick中断服务函数:void SysTick_Handler(void);

 

 用中断的方式实现delay:

static __IO uint32_t TimingDelay;
void Delay(__IO uint32_t nTime)
{ 
   TimingDelay = nTime;
   while(TimingDelay != 0);
}
void SysTick_Handler(void)
{
    if (TimingDelay != 0x00) 
     { 
       TimingDelay--;
     }
}
 int main(void)
 {  …
    if (SysTick_Config(SystemCoreClock / 1000)) //systick时钟为HCLK,中断时间间隔1ms,(SystemCoreClock / 1000)这个算的是次数,假设SystemCoreClock为72MHz,那么(SystemCoreClock / 1000)的值为72000次,也就是要执行72000次,频率为72000000,所以每1ms执行一次
  { while (1); } while(1) { Delay(200);//2ms  … } }

 

 

 

 

 

以上是关于arm7 lpc2478在ucos操作系统下定时器中断程序怎么写?急切请教!的主要内容,如果未能解决你的问题,请参考以下文章

μC/OS-II中使用软件定时器

ARM7LPC2138做串口中断实验的时候,发送中断一直进不去。接收中断一切正常,代码改了n遍了,求解释啊

LPC2136单片机解密特点

LPC2136单片机解密特点

恩智浦芯片LPC2214解密难度

lpc1768这样配置定时器pclk是多少?