210学习日记(13) --定时器和修改工具 一,定时器用于PWM输出(驱动蜂鸣器): 我本来从来不写蜂鸣器的程序的(声音太难听),但是今天破例了。 下面,先介绍下定时器的几个关键的寄存器吧: 问:大家都知道,定时器的实现,其实就是一个计数的过程(从0家到一个数字或从一个数字减到0),那么这个数字从哪里来呢? 答:从寄存器TCNTBx中获得,当我们编程时,写入一个数组到该寄存器,然后通过手动装载或自动装载,就会把该寄存器的值用于"一个数字"了。 问:PWM波形是高低电平交替出现的,那么定时器输出的电平什么时候翻转呢? 答:这个情况和TCMPBx寄存器中的值有关系,当计数器中的值("一个数字")减到(或加到)和TCMPBx寄存器中的值相等时,电平翻转。 本来想多说点的,但是实在是没什么可说的,直接上部分代码吧: { /* 设置时钟源 * 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"); 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程序!! 注: 本文来源:https://www.wddqw.com/doc/55dc0c550229bd64783e0912a216147916117e54.html