210学习日记(13)_定时器和修改工具

210学习日记(13)

--定时器和修改工具

一,定时器用于PWM输出(驱动蜂鸣器)

我本来从来不写蜂鸣器的程序的(声音太难听),但是今天破例了。

下面,先介绍下定时器的几个关键的寄存器吧:

问:大家都知道,定时器的实现,其实就是一个计数的过程(0家到一个数字或从一个数字减到0),那么这个数字从哪里来呢?

答:从寄存器TCNTBx中获得,当我们编程时,写入一个数组到该寄存器,然后通过手动装载或自动装载,就会把该寄存器的值用于"一个数字"了。

问:PWM波形是高低电平交替出现的,那么定时器输出的电平什么时候翻转呢?

答:这个情况和TCMPBx寄存器中的值有关系,当计数器中的值("一个数字")减到(或加到)TCMPBx寄存器中的值相等时,电平翻转。

本来想多说点的,但是实在是没什么可说的,直接上部分代码吧:

void timer0_init(void)

{

/* 设置时钟源

 * Timer0 input clock Frequency = 66700000 / ( {prescaler + 1} ) / {divider value} 

 *      = 66700000 / (1+1) / 1

 *      = 33350000( 1s计数33350000次 )

 */

TCFG0 &= ~(0xff);

TCFG0  |= 1;           /* Prescaler = 1 */

TCFG1  &= ~0xf;     /* 0000 = 1/1 */

/* 设置TCNTB0(PWM的频率) */

TCNTB0 = 33350;   /* PWM的频率为1KHz */

/* 设置TCMPB0(PWM的占空比) */

TCMPB0 = 16675;  /* 占空比为50% */

TCON &= ~(1<<2);  /* 不进行电平反转(即引脚初始值为0) */

TCON |= (1<<3);    /* auto-reload */

}

以上是定时器的初始化代码,关于定时器用于PWM输出的代码我以经共享在了"Tiny210学习日记_代码"目录下了,名为"14_pwm"。请大家自己阅读,十分简单。

测试方法:(在终端输入命令)

pwm on           (蜂鸣器响)

pwm off           (蜂鸣器不响)

二,倒计时自启动内核:

用官方的u-boot的时候,总是有倒计时启动内核,感觉特别的爽,因此,我得给自己写的bootloader加上该功能(方法比较粗糙)

这部分代码没有任何难道,大家一看代码就能够明白,添加类容如下:

void autoboot(void)

{

int i;

char bootdelay = BOOTDELAY;

while(1)

{

wy_printf("Hit any key to stop autoboot: %d \n", bootdelay);

if(bootdelay == 0)

{

wy_printf("loading linux from 0x400000 to 0x20008000...\n");

nand_read(0x20008000, 0x400000, 0x800000);

wy_printf("boot linux ...\n");

fp(0, 2456, 0x20000100);

return;

}

for(i=0;i<=8;i++)

{

delay();

if( tstc() )     /* 这个函数只是去读UART的状态而已 */

return;

}

bootdelay--;

}

return;

}

该部分代码放在了"Tiny210学习日记_代码"目录下了,名为"bootloader_bootdelay"

三,修改工具(wy_mktools.exe)

仔细阅读过学习日志的人,一定在阅读"Tiny210学习日记(6)"时会有疑问,前面的日志明明说最多只从Nand中能拷贝16K的代码到IRAM中,可是为什么在制作工具的时候,会有如下的宏呢:

#define IMG_SIZE                (24*1024)

这个疑问很关键,我们不能够把这个宏定义为24K大小,如果定义为24K大小的话,当我们直接编译出的old.bin(未经过工具处理的bin文件)大于16K的时候,将无法重定位成功。

所以,我们在自制工具时,要把这个宏改为:

#define IMG_SIZE                (16*1024)

修改过的工具,位于"Tiny210学习日记_代码"目录下了,名为"newtools",以后如果大家直接编译出的bin文件大于16K的话,一定要用该工具。

另外,如果大家仔细仔细对比过最后生成的bin文件的话,会发现,如果我们直接编译出的old.bin(未经过工具处理的bin文件)大于24K的时候,然后经过工具(newtools.exe)处理后的bin文件任然只有24K,那么意味着有一部分代码被丢弃了,这样的bin文件肯定不能够运行或达到我们想要的效果,那么该怎么办呢?

我们可以用如下命令,将两部分代码组装起来,从而达到目的:

cat ./old.bin ./new.bin > ./total.bin

注意:

如果觉得又是编译,又是用工具处理,又是用cat命令,很是麻烦的话,大家可以写一个shell程序!!

注:

如有问题,请到韦东山LINUX视频讨论群里面,我们一起讨论学习,或者加我QQ317312379

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值