-
1、RTS/CTS
- RTS : Request to send
- CTS : Clear to send
应用场合:半双工收发切换,工业控制应用较多
-
2、时钟频率管理
- 2.1、基本知识
-
FCLK:CPU工作频率
HCLK:中断控制器、存储管理器、DMA控制器、LCD控制器、FLASH控制器、USB Host(不用PLL时)、总线控制器、片外设备
PCLK:SPI、II2C、GPIO、ADC、PWM、UART、RTC、WDT、SD卡接口
MPLL = (2 * m * FIN) / (p * 2^s) //MPLL值计算方式
m = M + 8; p = P + 2; s = S;UPLL = (m * FIN) / (p * 2^s)
m = M + 8; p = P + 2; s = S;
重要:在设置系统时钟的时候不要使PMS任何一个值等于0,不然设置到的串口时钟不对,出现乱码,即可能压根系统的时钟设置就不对
若时钟分配HCLK != PCLK,在进行系统时钟设定的时候要使系统进入异步模式,具体设定CPU核(ARM920T)协处理器CP15的寄存器C1的iA与nF位
-
2.2、系统时钟设置步骤
2.2.1、设置UPLL与MPLL
2.2.2、设置PCLK,FCLK,HCLK
2.2.3、使能相应的时钟W位
iA | nF | mode |
---|---|---|
0 | 0 | FastBus |
0 | 1 | synchronous |
1 | 0 | Reserved |
1 | 1 | Asynchronous |
3、OM模式选择
- 本实验板的OM1接地,OM0接由拨码开关选择NAND Flash启动和Nor Flash启动
- 本实验板的OM2和OM3脚都接地了,所以使用的时钟源都是Crystal(外部晶振) 4、UART
-
4.1、错误种类
Frame error:帧差错
Parity error:奇偶校验错误
Break error:传输中断错误 -
4.2、波特率计算
UBRDIV = (int)(UART Clock / (buad rate * 16)) - 1; -
4.3、配置步骤(不使用FIFO)
-
4.3.1、配置引脚模式,使能上拉
4.3.2、配置UARTn模块模式
4.3.3、设置波特率(包括系统时的设定)
4.3.4、开启UARTn时钟
OM1 | OM0 | mode |
---|---|---|
0 | 0 | NAND Flash |
0 | 1 | 16 bit |
1 | 0 | 32 bit |
1 | 1 | test mode |
OM3 | OM2 | mode |
---|---|---|
value | mainclk | USBclk |
0 | 0 | Crystal |
0 | 1 | Crystal |
1 | 0 | EXTCLK |
1 | 1 | EXTCLK |
5、lds链接文件
代码如下
SECTIONS {
. = 0x00000000;
.init : AT(0){ head.o init.o uart.o}
. = 0x30000000;
.text : AT(4096) { *(.text) }
.rodata ALIGN(4) : AT((LOADADDR(.text)+SIZEOF(.text)+3)&~(0x03)) {(.rodata)}
.data ALIGN(4) : AT((LOADADDR(.rodata)+SIZEOF(.rodata)+3)&~(0x03)) { *(.data) }
__bss_start = .;
.bss ALIGN(4) : { (.bss) (COMMON) }
__bss_end = .;
}
在本UART实验中,lds文件中有如下的代码
AT(LOADADDR(.text) + SIZEOF(.text) + 3) & ~0x03 { *(.rodata) }
此行代码的意思是设置.rodata
的地址起点为.text
结束点之后的最小四字节倍数地址
&(~0x03)
的意思是进行4字节的代码对齐操作,即抹掉地址的低两位,此时地址为4的倍数,也即实现了4字节对齐
+3
的意思是万一.text
的结束地址不是4的倍数,此时若抹掉地址低两位会造成.rodata
地址与.text
地址交叠的情况,所以要加3之后再进行低两位抹除
. = 0x30000000;
.text : AT(4096) { *(.text) }
0x30000000是链接地址(也即程序运行地址),AT(4096)是程序存储地址,在程序运行的时候需要将4096的代码存储区拷贝到0x30000000地方再运行程序,这个过程需要在该段程序运行之前准备好
PS:在程序内部不能使用诸如uart_init(void)的方式引用,这样会被认为是函数的声明,在带返回值的时候会出现错误,rx_data = uart_rx(void)是错误的调用方式
JZ2440串口代码链接:使用中断方式,实现中断函数体的调用
http://download.csdn.net/detail/u013904227/9252191