ARM学习之二
时间:10-02
整理:3721RD
点击:
今天学习了UART的相关知识,完成了用上位机输入字符串然后在虚拟终端上进行显示。首先应该将设I|O口的功能设置为UART,具体有PINSEL来实现。然后是UART的初始化,主要要先是DLB=1,即另U0LCR=0x83,因为只有当DLB=1时才能写U0DLM和U0DLL;然后是设置波特率,由波特率计算公式:16*BAUD=FPCLK/U0DL,计算U0DLM=U0DL/256,U0DLL=U0DL%256;最后是串口工作模式的设置,由U0LCR来设置,如需要无奇偶校验,1位停止位,8位数据就令U0LCR=0x03,到此UART的初始化完成。接着便是进行数据的接收和发送,可以自定义GET()和SEND()两个函数来完成。代码如下:
#include "Config.h"
#include "Target.h"
#include "LPCUart.h"
#define UART_BPS 9600 /* 定义通讯波特率 */
/****************************************************************************
** 函数名称:DelayNS()
** 函数功能:长软件延时。
** 入口参数:dly 延时参数,值越大,延时越久
****************************************************************************/
void DelayNS (uint32 dly)
{ uint32 i;
for ( ; dly>0; dly--)
for (i=0; i<50000; i++);
}
/****************************************************************************
* 函数名称:UART0_Init()
* 功能描述: 初始化串口0。
* 使用外部25MHz晶振,根据CONFIG.H文件配置,Fpclk=25MHz;
* 通讯波特率9600,8位数据位,1位停止位,无奇偶校验。
****************************************************************************/
void UART0_Init(void)
{
uint16 Fdiv;
U0LCR = 1 << LCR_DLAB_BIT | // DLAB = 1,可设置波特率
WordLength8 << LCR_WORDLENTH_BIT; // WordLenth = 3, 8位数据位
Fdiv = (Fpclk / 16) / UART_BPS; // 设置波特率
U0DLM = Fdiv / 256; // 设置分频寄存器高字节
U0DLL = Fdiv % 256; // 设置分频寄存器低字节
U0LCR = 0x03;
}
/*******************************************************************************************
** 函数名称:UART0_GetByte()
** 函数功能:从串口接收 1 字节数据,使用查询方式接收。
** 出口参数:接收到的数据
*******************************************************************************************/
uint8 UART0_GetByte (void)
{ uint8 rcv_dat;
while ((U0LSR & 0x01) == 0); // 等待接收标志置位
rcv_dat = U0RBR; // 读取数据
return (rcv_dat);
}
/*******************************************************************************************
** 函数名称:UART0_GetStr()
** 函数功能:从串口接收
** 入口参数:s 指向接收数据数组的指针, n 接收的个数
*******************************************************************************************/
void UART0_GetStr (uint8 *s, uint32 n)
{ for ( ; n>0; n--)
{ *s++ = UART0_GetByte(); }
}
/****************************************************************************
* 函数名称:UART0_SendByte()
* 功能描述: 向串口发送字节数据,并等待发送完毕。
* 入口参数:data 要发送的数据
****************************************************************************/
void UART0_SendByte(uint8 data)
{
U0THR = data; // 发送数据
while ((U0LSR&0x20)==0) ; // 等待数据发送完毕
}
/****************************************************************************
* 函数名称:UART0_SendStr()
* 功能描述: 向串口发送一字符串
* 入口参数:srt 要发送字符串的指针
****************************************************************************/
void UART0_SendStr(uint8 const *str)
{
while(1)
{
if( *str == '\0' )
break;
UART0_SendByte(*str++); // 发送数据
}
}
/****************************************************************************
* 函数名称:main()
* 功能描述: 向串口UART0发送字符串
****************************************************************************/
int main(void)
{ uint8 snd[8];
PINSEL0 &= 0xFFFFFFF0;
PINSEL0 |= 0x00000005; // 设置I/O连接到UART0
UART0_Init();
UART0_SendStr("ARM7 LPC2138 System\r\n"); // 调用自定义函数从UART0发送数据
printf("Hello World! \r\n"); // 调用STDIO标准库函数发送数据
while(1)
{
printf("Please Input 1 char: \r\n"); // 调用STDIO标准库函数发送数据
UART0_GetStr(snd,1); // 调用自定义函数从UART0接收数据
UART0_SendStr(snd); // 调用自定义函数从UART0发送数据
printf("\r\n"); // 调用STDIO标准库函数发送数据
}
}
#include "Config.h"
#include "Target.h"
#include "LPCUart.h"
#define UART_BPS 9600 /* 定义通讯波特率 */
/****************************************************************************
** 函数名称:DelayNS()
** 函数功能:长软件延时。
** 入口参数:dly 延时参数,值越大,延时越久
****************************************************************************/
void DelayNS (uint32 dly)
{ uint32 i;
for ( ; dly>0; dly--)
for (i=0; i<50000; i++);
}
/****************************************************************************
* 函数名称:UART0_Init()
* 功能描述: 初始化串口0。
* 使用外部25MHz晶振,根据CONFIG.H文件配置,Fpclk=25MHz;
* 通讯波特率9600,8位数据位,1位停止位,无奇偶校验。
****************************************************************************/
void UART0_Init(void)
{
uint16 Fdiv;
U0LCR = 1 << LCR_DLAB_BIT | // DLAB = 1,可设置波特率
WordLength8 << LCR_WORDLENTH_BIT; // WordLenth = 3, 8位数据位
Fdiv = (Fpclk / 16) / UART_BPS; // 设置波特率
U0DLM = Fdiv / 256; // 设置分频寄存器高字节
U0DLL = Fdiv % 256; // 设置分频寄存器低字节
U0LCR = 0x03;
}
/*******************************************************************************************
** 函数名称:UART0_GetByte()
** 函数功能:从串口接收 1 字节数据,使用查询方式接收。
** 出口参数:接收到的数据
*******************************************************************************************/
uint8 UART0_GetByte (void)
{ uint8 rcv_dat;
while ((U0LSR & 0x01) == 0); // 等待接收标志置位
rcv_dat = U0RBR; // 读取数据
return (rcv_dat);
}
/*******************************************************************************************
** 函数名称:UART0_GetStr()
** 函数功能:从串口接收
** 入口参数:s 指向接收数据数组的指针, n 接收的个数
*******************************************************************************************/
void UART0_GetStr (uint8 *s, uint32 n)
{ for ( ; n>0; n--)
{ *s++ = UART0_GetByte(); }
}
/****************************************************************************
* 函数名称:UART0_SendByte()
* 功能描述: 向串口发送字节数据,并等待发送完毕。
* 入口参数:data 要发送的数据
****************************************************************************/
void UART0_SendByte(uint8 data)
{
U0THR = data; // 发送数据
while ((U0LSR&0x20)==0) ; // 等待数据发送完毕
}
/****************************************************************************
* 函数名称:UART0_SendStr()
* 功能描述: 向串口发送一字符串
* 入口参数:srt 要发送字符串的指针
****************************************************************************/
void UART0_SendStr(uint8 const *str)
{
while(1)
{
if( *str == '\0' )
break;
UART0_SendByte(*str++); // 发送数据
}
}
/****************************************************************************
* 函数名称:main()
* 功能描述: 向串口UART0发送字符串
****************************************************************************/
int main(void)
{ uint8 snd[8];
PINSEL0 &= 0xFFFFFFF0;
PINSEL0 |= 0x00000005; // 设置I/O连接到UART0
UART0_Init();
UART0_SendStr("ARM7 LPC2138 System\r\n"); // 调用自定义函数从UART0发送数据
printf("Hello World! \r\n"); // 调用STDIO标准库函数发送数据
while(1)
{
printf("Please Input 1 char: \r\n"); // 调用STDIO标准库函数发送数据
UART0_GetStr(snd,1); // 调用自定义函数从UART0接收数据
UART0_SendStr(snd); // 调用自定义函数从UART0发送数据
printf("\r\n"); // 调用STDIO标准库函数发送数据
}
}