airwill 发表于 2013-8-19 09:39 
网上的例程和实验那么多, 先不要自己动手写程序, 最好拿试验程序来练习和修改, 顺便也学习一下代码书写规范 ...
大哥能帮我看看下面的程序吗?有些东西理解不了,我都在后面做了自己的理解,帮我看看哪些理解是错的。
还有就是能不能给我详解一下定时器的原理啊(s3c2410),我看过但是觉得很模糊,谢谢了。
void Timer1_init(void)
{
rGPGCON = rGPGCON & 0xfff0ffff | 0x00050000; //配置GPG口8,9位为信号输出
rGPGDAT = rGPGDAT | 0x300; //0x56000077,这是什么功能?存储数据?
rTCFG0 = 255; // Prescaler0=255(预定标器的值是255?)
rTCFG1 = 0 << 4; // 选择PWM定时器1的MUX输入 0000=1/2?就是分割器=2?
rTCNTB1 = 488; // 在pclk=50MHZ下,1秒钟的记数值rTCNTB1 = 50000000 / 4 / 256 = 48828;计数器初值是488?
rTCMPB1 = 0x00; //比较器初值是0?
rTCON = (1 << 11) | (1 << 9) | (0 << 8); //禁用定时器1,手动加载(这应该是自动加载啊,11为为1,自动加载)
rTCON = (1 << 11) | (0 << 9) | (1 << 8); //启动定时器1,自动装载
}
/*
*************************************************************************************************************
- 函数名称 : void __irq Timer1_ISR ( void )
- 函数说明 : 定时器中断服务子程序
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
int flag;
void __irq Timer1_ISR( void )
{
if (flag == 0) //标志位=0,重复下面循环体
{
rGPGDAT = rGPGDAT & 0xeff | 0x200;//第8位为低电平,9位为高电平
flag = 1;
}
else
{
rGPGDAT = rGPGDAT & 0xdff | 0x100;//第8位为高电平,9位为低电平
flag = 0;
}
rSRCPND |= BIT_TIMER1;//TIMER1请求中断?
rINTPND |= BIT_TIMER1;//TIMER1请求中断,TIMER1正在诶服务
}
/*
*************************************************************************************************************
- 函数名称 : void Timer1INT_Init(void)
- 函数说明 : 定时器中断初始化程序
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void Timer1INT_Init(void) //定时器接口使能
{
if ((rINTPND & BIT_TIMER1)) //TIMER1不请求中断服务,挂起状态?
{
rSRCPND |= BIT_TIMER1; //TIMER1请求中断?
}
pISR_TIMER1 = (int)Timer1_ISR; //中断服务子程序的存放地址
rINTMSK &= ~(BIT_TIMER1); //开TIMER1中断;
}
|