微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > ARM技术讨论 > ARM学习之二

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标准库函数发送数据
    }
}


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top