LPC1768之串口UART0

简介:
*********************************************************************************************************/
#include "LPC17xx.h"                                                    /* LPC17xx外设寄存器            */

/********************************************************************************************************
 变量与宏定义
*********************************************************************************************************/
extern  uint32_t       SystemFrequency;                                 /* Clock Variable    时钟变量           */
#define UART_BPS   9600                                              /* 串口通信波特率               */  

/*********************************************************************************************************
** Function name:       delayNS
** Descriptions:        延时函数
** input parameters:    ulDly:   延时值
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void delayNS (uint32_t  ulDly)
{
    uint32_t  i;
    for (; ulDly > 0; ulDly--) {
        for (i = 0; i < 5000; i++);
    }
}

/*********************************************************************************************************
** Function name:       uartInit
** Descriptions:        串口初始化,设置为8位数据位,1位停止位,无奇偶校验,波特率为9600
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void uart0Init (void)
{
    uint16_t usFdiv;
    LPC_PINCON->PINSEL0 |= (0x01 << 4)|(0x01 << 6);                       /* 设置P0.2(TXD0)为串口,P0.3(RXD0)为串口  */    

    LPC_SC->PCONP   = LPC_SC->PCONP|0x08;                               /* 打开串口0功能                */
    LPC_UART0->LCR  = 0x83;                                  /* 设置串口数据格式,8位字符长度,1个停止位,无校验,
                                                                  使能访问除数锁存器 ,设定波特率    */
    usFdiv = (SystemFrequency/4 / 16) / UART_BPS;                       /* 设置波特率                   */
    LPC_UART0->DLM  = usFdiv / 256;                          /*除数高8位,没有小数点情况       */
    LPC_UART0->DLL  = usFdiv % 256;               /*除数低8位,没有小数点情况      */
    LPC_UART0->LCR  = 0x03;                                             /* 锁定波特率                   */
    LPC_UART0->FCR  = 0x06;                            /* 复位TxFIFO和RXFIFIO */
}

/*********************************************************************************************************
** Function name:      uart0GetByte
** Descriptions:       从串口接收1字节数据,使用查询方式接收
** input para
meters:   无
** output parameters:  无
** Returned value:     ucRcvData:   接收到的数据
*********************************************************************************************************/
uint8_t uart0GetByte (void)         //查询法
{
    uint8_t ucRcvData;
    
    while ((LPC_UART0->LSR & 0x01) == 0);  //UnLSR[0] 该位是否置一,决定能否从FIFO中读取数据                
                            //UnLSR[0]为0 :RBR为空 ; UnLSR[0]为1:RBR中包含有效数据,从FIFO中读走所有数据后,恢复为0
    ucRcvData = LPC_UART0->RBR;   //UnRBR为接收缓存寄存器                            /* 读取数据                     */
    return (ucRcvData);   
}


/*********************************************************************************************************
** Function name:       uart0GetStr
** Descriptions:        串口接收字符串
** input parameters:    puiStr:  指向接收数据数组的指针
**                      ulNum:   接收数据的个数
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void uart0GetStr (uint8_t *puiStr, uint32_t ulNum)
{
    for (; ulNum > 0; ulNum--) {
        *puiStr++ =  uart0GetByte ();
    }  
}

/*********************************************************************************************************
** Function name:       uart0SendByte
** Descriptions:        向串口发送子节数据,并等待数据发送完成,使用查询方式
** input parameters:    ucDat:   要发送的数据
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void uart0SendByte (uint8_t ucDat)
{
    LPC_UART0->THR = ucDat;                   //UnTHR为发送缓存寄存器                         /*  写入数据 * /     
    while ((LPC_UART0->LSR & 0x40) == 0);    // UnLSR[6] 为0 时,表明UnTHR包含数据;  
}                                            //    UnLSR[6]为1时,则UnTHR已空         /* 等待数据发送完毕*/

/*********************************************************************************************************
** Function name:       uart0SendStr
** Descriptions:        向串口发送字符串
** input parameters:   puiStr:  要发送的字符 串指针
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void uart0SendStr (uint8_t  const *puiStr, uint32_t len)
{
    while (len -- > 0) {
        uart0SendByte (*puiStr++);
    }
}

/*********************************************************************************************************
** Function name:       main
** Descriptions:        串口查询方式接收发送数据。
**                      全速运行程序用串口调试软件发送字符串,并在接收窗口查看返回数据,波特率为9600,
**                      上位机一次需要发送20个字符。
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
int main (void)
{
    uint8_t   ucBuf[30];
    SystemInit();                                                       /* 初始化目标板     */
 
    uart0Init ();                                                       /* 串口初始化                   */
    while (1){
        uart0GetStr(ucBuf, 20);                                         /* 从串口接收字符串             */
        delayNS(1);
        uart0SendStr(ucBuf, 20);                                        /* 向串口发送字符串             */
        delayNS(1);
    }
}

/*********************************************************************************************************
  End Of File
*********************************************************************************************************/

目录
相关文章
|
10月前
|
机器学习/深度学习 人工智能
ObjectMover:港大联合Adobe打造图像编辑黑科技,移动物体光影自动匹配
香港大学与Adobe联合研发的ObjectMover模型,通过视频生成先验迁移技术,实现图像中物体的自然移动、删除和插入,自动保持光影一致性。
263 21
ObjectMover:港大联合Adobe打造图像编辑黑科技,移动物体光影自动匹配
|
Kubernetes Cloud Native 持续交付
容器化、Kubernetes与微服务架构的融合
容器化、Kubernetes与微服务架构的融合
486 82
|
JavaScript 定位技术 API
Vue获取照片拍摄的地理位置信息
iPhone屏幕尺寸和开发适配
844 155
|
安全 Ubuntu 测试技术
Acunetix v24.12 发布,新增功能概览
Acunetix v24.12 发布,新增功能概览
285 20
Acunetix v24.12 发布,新增功能概览
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
505 3
|
移动开发 前端开发 JavaScript
2024年前端框架趋势概览
【10月更文挑战第2天】本文综合了多个来源的信息,以提供一个全面的2024年前端框架趋势概览。希望通过本文,读者能够把握前端开发的最新动态,并在自己的项目中应用这些趋势。
|
机器学习/深度学习 算法 数据处理
基于最小二乘法的太阳黑子活动模型参数辨识和预测matlab仿真
本项目基于最小二乘法,利用Matlab对太阳黑子活动进行模型参数辨识和预测。通过分析过去288年的观测数据,研究其11年周期规律,实现对太阳黑子活动周期性的准确建模与未来趋势预测。适用于MATLAB2022a版本。
|
缓存 JavaScript 前端开发
js和html代码一定要分离吗
JavaScript(JS)和HTML代码的分离虽非绝对必要,但通常被推荐
|
存储 Java 索引
Java 中 ArrayList 和 LinkedList 之间的区别
【8月更文挑战第22天】
340 1
|
存储 SQL 分布式计算
关系数据库和HDFS的基本区别是什么?
【8月更文挑战第31天】
549 0