02-JZ2440裸机学习之系统时钟和UART串口实验
2017-03-28 22:48
288 查看
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;
}
/*
* 接收字符
*/
unsigned char getc(void)
{
/* 等待,直到接收缓冲区中的有数据 */
while (!(UTRSTAT0 & RXD0READY));
/* 直接读取URXH0寄存器,即可获得接收到的数据 */
return URXH0;
}
/*
* 判断一个字符是否数字
*/
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));
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;
}
/*
* 接收字符
*/
unsigned char getc(void)
{
/* 等待,直到接收缓冲区中的有数据 */
while (!(UTRSTAT0 & RXD0READY));
/* 直接读取URXH0寄存器,即可获得接收到的数据 */
return URXH0;
}
/*
* 判断一个字符是否数字
*/
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));
相关文章推荐
- 02-JZ2440裸机学习之GPIO实验【转】
- 02-JZ2440裸机学习之GPIO实验
- 系统时钟与URAT(串口)实验
- 02-JZ2440裸机学习之NAND FLASH
- 02-JZ2440裸机学习之MMU内存管理单元
- 八.ARM裸机学习之S5PV210的时钟系统1(原理概念及框图分析)
- ARM裸机实验 UART串口(S3C2440A) TQ2440
- 嵌入式系统学习——STM32之串口通信UART
- 02-JZ2440裸机学习之MMU内存管理单元【转】
- 7,嵌入式Linux之系统时钟和UART实验
- tiny6410裸机之代码重定位学习笔记(包含串口,时钟初始化)
- 02-JZ2440裸机学习之MMU内存管理单元【转】
- linux学习笔记之小谈时钟时间,用户CPU时间,系统CPU时间
- 【裸机开发笔记】6410的系统时钟设置(上)---6410时钟控制逻辑框架分析
- 2012TI杯竞赛学习-----------时钟系统篇
- 【裸机开发笔记】6410的系统时钟设置(下)---几个常用函数的C源码。
- 【裸机开发笔记】6410的系统时钟设置(中)---相关寄存器介绍
- 文件系统02 - 零基础入门学习Delphi35
- STM32-串口实验学习笔记
- uart串口发送---那些年我们一起玩mini2440(arm9)裸机