s3c2440 定时器延时

此文为使用2440的定时器实现延时函数

我将定时器中断配置为10us中断一次,实现了10us步进的延时

一、硬件部分:

参见之前的定时器中断部分。

二、软件部分:

1.添加延时函数


其中time_count为全局变量

void delay_10us(unsigned int count)
{
	time_count=0;		//init to 0
	INTMSK &= ~(1<<10);		//mask timer0_Interrupted
	while(time_count

2.修改定时器初始化函数和中断处理函数

/*
*prescalers=0-255
*中断频率=50/2/prescalers/count
*/
void timer0_init(unsigned char prescalers,unsigned int count)
{
	TCFG0=prescalers;	//50M/prescalers
	TCFG1=0x0;		//50M/prescalers/2
	TCNTB0=count;		//计数值
	TCON |=1<<1;
	TCON |=1<<3;		//自动重装载
	TCON &=~(1<<1);
	
	/*配置中断*/
	
	SRCPND |= (1<<10);//清除源挂起
	INTPND |= (1<<10);//清除中断挂起
	INTMOD &= ~(1<<10);//设置中断模式为IRQ模式
//	INTMSK &= ~(1<<10);//使能定时器中断
	
	/*启动定时器*/
	TCON |= (1<<0);//启动定时器0
}

void timer0_Handle()
{
	SRCPND |= (1<<10);//清除源挂起
	INTPND |= (1<<10);//清除中断挂起
	time_count ++;
	print_num(time_count);
	putc('c');
}

调用初始化函数将中断频率设置为100k
3.修改Makefile
在Makefile中存在一个问题
$(LD) -Ttext 0x0000000 -g  start.o timer.o -o timer_elf
这样连接只规定了代码段的地址,其他段的地址为默认,当我们定义全局变量和局部变量的时候是无法正常运行的
现象为与这些变量相关的代码都不会被执行
因此需要修改为
$(LD) -Tdelay.lds -g  $^ -o timer_elf
其中的delay.lds为连接的脚本
内容如下:
SECTIONS {
    . = 0x00000000;
    .text          :   { *(.text) }
    .rodata ALIGN(4) : {*(.rodata)} 
    .data ALIGN(4) : { *(.data) }
    .bss ALIGN(4)  : { *(.bss)  *(COMMON) }
}



 
  

 
  

 
 

你可能感兴趣的:(裸机)