作者:GWD 时间:2019.7.9
一、课程内容
(一)摘要:本节课写了一个程序,功能是在串口中输入不同的nor读写频率实时更改Nor运行代码的效率,观察led小灯的不同闪烁频率;分析了S3C2440的内存时序图和nor芯片的时序图。
(二)写程序
1、S3C2440手册与原理图内存控制部分分析
由硬件原理图知道nor芯片的地址范围是0x00000000-0x08000000
先发出地址信号,才发出片选信号,证明了上一节的核心内容,如何发出片选信号。
nor芯片接在了第一段128M内,所以操作bankcon0寄存器就可以了。Tacc默认14个周期,这就是为什么一上电就可以nor flash运行,因为默认选择最大的时钟周期了,是晶振运行的。计算一下,上电是12MHZ的频率,t= (1/12000000)14100010001000=1166.67ns远远大于了最低时间所以可以直接运行,但是效率低了很多。
2、查看MX29LV160(norflash)手册
1)、问:手册中的时序标号与S3C2440芯片不一样怎么办?
答:根据描述与S3C2440手册的时序图对比查找可以知道,Taa对应Tacs意思是发出地址信号后,之后数据输出有效时间;Toe对应Tacc意思是OE低电平之后数据输出有效时间。Toe最长时间70ns的意思是,因为Nor flash产品质量参差不齐有的50ns就可以读取,有的要69ns但是最长70ns也应该读取完事了。利用这个Toe的性质进行编程,控制Toe的周期就可以控制访问的频率。
三、代码
(一)、
1、代码功能:串口输入不同的tacc值,观察led灯的闪烁速度
2、工作频率PCLK是100MHZ,一个周期为(1/100000000)10001000*1000=10ns
所以根据nor芯片手册应该在7clock时候小灯可以点亮,也就是Tacc=5时。实验效果与预想的一样
3、注意这里char转数字的手法
(二)、代码
Init.c
#include "s3c2440_soc.h"
void Nor_Flash_Cycle(int Tacc)
{
//BANKCON0 &= ~(7 << 8 );
BANKCON0 = Tacc << 8 ;
}
MAIN.C
#include "s3c2440_soc.h"
#include "uart.h"
#include "init.h"
#include "led.h"
int main(void)
{
unsigned char c;
uart0_init();
puts("printf the number of Tacc\n\r");
while(1)
{
c = getchar();
putchar(c);
if (c >= '0' && c <= '7')
{
Nor_Flash_Cycle(c - '0');
led_test();
}
}
return 0;
}