1、S3C2440的系统时钟
1.1、2440的几种频率
笔记本CPU可以 1G 2G ,内存133M等
2440CPU:400MHz -------FCLK-----CPU
SDRAM:100M/133M---- HCLK----存储区控制器,中断控制器,LCD,DMA,USB主机模块
串口IIC: -------------------PCLK----IIS,IIC,PWM,MMC,SD,ADC,UART,GPIO,RTC,SPI
定时器:---------------------PCLK
1.2时钟选择与启动方式选择
S3C2440可以选择晶振,或外部时钟。:
1.3PLL
两种PLL:
(1)MPLL:产生F/H/PCLK
(2)UPLL:提供48M的USB时钟信号UCLK
通过设置时钟寄存器(称为PLL),把晶振频率变为其他频率,12变为400MHz。400分频为100M,50M等。
怎么设置FCLK HCLK PCLK
(1) 晶振—PLL—400M
所涉及寄存器:
l 锁定时间内调整频率,锁定时间可以设定
l PLL寄存器
l 分频寄存器
(1)锁定时间
voidclock_init(void)
{
// LOCKTIME = 0x00ffffff; //使用默认值即可
(2)PLL相关寄存器
/* 判断是S3C2410还是S3C2440*/
if ((GSTATUS1 == 0x32410000) || (GSTATUS1 == 0x32410002))
{
MPLLCON = S3C2410_MPLL_200MHZ; /*现在,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */
}
else
{
MPLLCON = S3C2440_MPLL_200MHZ; /*现在,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */
}
(3)分频
400M—分频--
CLKDIVN = 0x03; // FCLK:HCLK:PCLK=1:2:4,HDIVN=1,PDIVN=1
/* 如果HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */
__asm__(
"mrc p15, 0, r1, c1, c0,0\n" /* 读出控制寄存器 */
"orr r1, r1,#0xc0000000\n" /* 设置为“asynchronous bus mode” */
"mcr p15, 0, r1, c1, c0,0\n" /* 写入控制寄存器 */
);
2、2440串口
(1)串口初始化
初始化:引脚设置UART,数据位,校验位,停止位,波特率
ULCON0 =0x03; // 8N1(8个数据位,无较验,1个停止位)中断方式
时钟选择
Fifo
UFCON0 = 0x00; // 不使用FIFO
UMCON0 = 0x00; // 不使用流控
UBRDIV0波特率设置寄存器
发送接收函数
(1) 发送
/*
* 发送一个字符
*/
void putc(unsigned char c)
{
/* 等待,直到发送缓冲区中的数据已经全部发送出去 */
while (!(UTRSTAT0 &TXD0READY));
/* 向UTXH0寄存器中写入数据,UART即自动将它发送出去 */
UTXH0 = c;
}
/*/*
* 判断一个字符是否数字
*/
int isDigit(unsigned char c)
{
if (c >= '0' && c <= '9')
return 1;
else
return 0;
}
/*
* 判断一个字符是否英文字母
*/
int isLetter(unsigned char c)
{
if (c >= 'a' && c <= 'z')
return 1;
else if (c >= 'A' && c <= 'Z')
return 1;
else
return 0;
}
int main()
{
unsigned char c;
uart0_init(); // 波特率115200,8N1(8个数据位,无校验位,1个停止位)
while(1)
{
// 从串口接收数据后,判断其是否数字或子母,若是则加1后输出
c = getc();
if (isDigit(c) || isLetter(c))
putc(c+1);
}
return 0;
}
/* 等待,直到发送缓冲区中的数据已经全部发送出去 */
while (!(UTRSTAT0 & TXD0READY));