📄 uart.c
字号:
//---------------------------------------------------------------------
//
// 版本历史
//
// 08/05/07——第一版
//----------------------------------------------------------------------
#include "general.h"
#include "hardware.h"
#include "external_global.h"
#include <stdarg.h>
void DelayNmSec(unsigned int N);
void initUART1(void);
void initUART2(void);
void SendMsg1(unsigned char* pt);
void SendMsg2(unsigned char* pt);
//void Uart1_Printf(char *fmt,...);
void DelayNmSec(unsigned int N)
{
unsigned int j;
while(N--)
for(j=0;j < MILLISEC;j++);
}
/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
UART发送字符程序,包含
void setup_uart(void)
void SendMsg(unsigned char* pt)
void Uart_Printf(char *fmt,...)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/
void initUART1(void)
{
U1MODE = 0x8000;
/************************************
UARTX 模式寄存器
1000 0000 0000 0000
bit 15 UARTEN:UART 使能位
1 = UART 使能。 UEN<1:0> 和UTXEN 控制位定义了UART 如何控制UART 引脚。
0 = UART 禁止。 UART 引脚由相应的PORT、LAT 和TRIS 位控制。
bit 14 未用:读作0
bit 13 USIDL:在空闲模式停止位
1 = 当器件进入空闲模式时,停止运行
0 = 在空闲模式继续运行
bit 12 未用:读作0
bit 11 保留:在该位置写0
bit 10 ALTIO:UART 备用I/O 选择位
1 = UART 通过UxATX 和UxARX I/O 引脚通信
0 = UART 通过UxTX 和UxRX I/O 引脚通信
注: 不是所有的器件都具有备用UART I/O 引脚。 具体细节参见器件数据手册。
bit 9-8 保留:在这两位写0
bit 7 WAKE:在休眠模式期间检测到启动位唤醒使能位
1 = 使能唤醒
0 = 禁止唤醒
bit 6 LPBACK:UART 环回(Loopback)模式选择位
1 = 使能环回模式
0 = 禁止环回模式。
bit 5 ABAUD:自动波特率使能位
1 = 从UxRX 引脚输入到捕捉模块
0 = 从ICx 引脚输入到捕捉模块
bit 4-3 未用:读作0
bit 2-1 PDSEL<1:0>:奇偶校验和数据选择位
11 = 9 位数据,无奇偶校验
10 = 8 位数据,奇校验
01 = 8 位数据,偶校验
00 = 8 位数据,无奇偶校验
bit 0 STSEL:停止选择位
1 = 2 个停止位
0 = 1 个停止位
****************************************************/
U1STA = 0x0000;
/***************************************************
UARTX 状态和控制寄存器
bit 15 UTXISEL:发送中断模式选择位
1 = 当一个字符被传输到发送移位寄存器,导致缓冲器空的时候,产生中断
0 = 当一个字符被传输到发送移位寄存器(发送缓冲器中至少还有一个字符)时,产生中断
bit 14-12 未用:读作0
bit 11 UTXBRK:发送中止位
1 = 不管发送器处在什么状态,拉低UxTX 引脚
0 = UxTX 引脚正常工作
bit 10 UTXEN: 发送使能位
1 = UART 发送器使能, UART 控制UxTX 引脚(如果UARTEN = 1)
0 = UART 发送器禁止,中止所有等待的发送,缓冲器复位。 PORT 控制
UxTX 引脚。
bit 9 UTXBF:发送缓冲器满状态位(只读)
1 = 发送缓冲器满
0 = 发送缓冲器未满,至少一个或多个数据字可以写入缓冲区。
bit 8 TRMT: 发送移位寄存器空位(只读)
1 = 发送移位寄存器为空,同时发送缓冲器为空(上一个发送已经完成)
0 = 发送移位寄存器非空,发送在进行中或在发送缓冲器中排队
bit 7-6 URXISEL<1:0>:接收中断模式选择位
11 =接收缓冲器满时(即,有4 个数据字符),中断标志位置位
10 =接收缓冲器3/4 满时(即,有3 个数据字符),中断标志位置位
0x =当接收到一个字符时,中断标志位置位
bit 5 ADDEN:地址字符检测(接收数据的第8 位 = 1)
1 = 地址检测模式使能。 如果没有选择9 位模式,这个控制位将无效。
0 = 地址检测模式禁止
bit 4 RIDLE:接收器空闲位(只读)
1 = 接收器空闲
0 = 正在接收数据
bit 3 PERR:奇偶校验错误状态位(只读)
1 = 检测到当前字符的奇偶校验错误
0 = 没有检测到奇偶校验错误
bit 2 FERR:帧错误状态位(只读)
1 = 检测到当前字符的帧错误
0 = 没有检测到帧错误
bit 1 OERR: 接收缓冲器溢出错误状态位(只读/ 清零)
1 = 接收缓冲器溢出
0 = 接收缓冲器没有溢出
bit 0 URXDA: 接收缓冲器中是否有数据位(只读)
1 = 接收缓冲器中有数据、有至少一个或多个字符可读
0 = 接收缓冲器为空
***************************************************/
U1BRG = ((FCY/16)/BAUD1) - 1; // set baudrate to BAUD rate IEC0bits.U1RXIE = 1;
IFS0bits.U1TXIF = 0;
//清UART1发送中断;
IFS0bits.U1RXIF = 0;
//清UART1接受中断
IEC0bits.U1RXIE = 1;
//允许UART1接受中断*/
//IEC0bits.U1TXIE = 1;
//Uart_Printf("UART1 is OK!\n");
}
void initUART2(void)
{
U2MODE = 0x8000;
/************************************
UARTX 模式寄存器
1000 0000 0000 0000
bit 15 UARTEN:UART 使能位
1 = UART 使能。 UEN<1:0> 和UTXEN 控制位定义了UART 如何控制UART 引脚。
0 = UART 禁止。 UART 引脚由相应的PORT、LAT 和TRIS 位控制。
bit 14 未用:读作0
bit 13 USIDL:在空闲模式停止位
1 = 当器件进入空闲模式时,停止运行
0 = 在空闲模式继续运行
bit 12 未用:读作0
bit 11 保留:在该位置写0
bit 10 ALTIO:UART 备用I/O 选择位
1 = UART 通过UxATX 和UxARX I/O 引脚通信
0 = UART 通过UxTX 和UxRX I/O 引脚通信
注: 不是所有的器件都具有备用UART I/O 引脚。 具体细节参见器件数据手册。
bit 9-8 保留:在这两位写0
bit 7 WAKE:在休眠模式期间检测到启动位唤醒使能位
1 = 使能唤醒
0 = 禁止唤醒
bit 6 LPBACK:UART 环回(Loopback)模式选择位
1 = 使能环回模式
0 = 禁止环回模式。
bit 5 ABAUD:自动波特率使能位
1 = 从UxRX 引脚输入到捕捉模块
0 = 从ICx 引脚输入到捕捉模块
bit 4-3 未用:读作0
bit 2-1 PDSEL<1:0>:奇偶校验和数据选择位
11 = 9 位数据,无奇偶校验
10 = 8 位数据,奇校验
01 = 8 位数据,偶校验
00 = 8 位数据,无奇偶校验
bit 0 STSEL:停止选择位
1 = 2 个停止位
0 = 1 个停止位
****************************************************/
U2STA = 0x0000;
/***************************************************
UARTX 状态和控制寄存器
bit 15 UTXISEL:发送中断模式选择位
1 = 当一个字符被传输到发送移位寄存器,导致缓冲器空的时候,产生中断
0 = 当一个字符被传输到发送移位寄存器(发送缓冲器中至少还有一个字符)时,产生中断
bit 14-12 未用:读作0
bit 11 UTXBRK:发送中止位
1 = 不管发送器处在什么状态,拉低UxTX 引脚
0 = UxTX 引脚正常工作
bit 10 UTXEN: 发送使能位
1 = UART 发送器使能, UART 控制UxTX 引脚(如果UARTEN = 1)
0 = UART 发送器禁止,中止所有等待的发送,缓冲器复位。 PORT 控制
UxTX 引脚。
bit 9 UTXBF:发送缓冲器满状态位(只读)
1 = 发送缓冲器满
0 = 发送缓冲器未满,至少一个或多个数据字可以写入缓冲区。
bit 8 TRMT: 发送移位寄存器空位(只读)
1 = 发送移位寄存器为空,同时发送缓冲器为空(上一个发送已经完成)
0 = 发送移位寄存器非空,发送在进行中或在发送缓冲器中排队
bit 7-6 URXISEL<1:0>:接收中断模式选择位
11 =接收缓冲器满时(即,有4 个数据字符),中断标志位置位
10 =接收缓冲器3/4 满时(即,有3 个数据字符),中断标志位置位
0x =当接收到一个字符时,中断标志位置位
bit 5 ADDEN:地址字符检测(接收数据的第8 位 = 1)
1 = 地址检测模式使能。 如果没有选择9 位模式,这个控制位将无效。
0 = 地址检测模式禁止
bit 4 RIDLE:接收器空闲位(只读)
1 = 接收器空闲
0 = 正在接收数据
bit 3 PERR:奇偶校验错误状态位(只读)
1 = 检测到当前字符的奇偶校验错误
0 = 没有检测到奇偶校验错误
bit 2 FERR:帧错误状态位(只读)
1 = 检测到当前字符的帧错误
0 = 没有检测到帧错误
bit 1 OERR: 接收缓冲器溢出错误状态位(只读/ 清零)
1 = 接收缓冲器溢出
0 = 接收缓冲器没有溢出
bit 0 URXDA: 接收缓冲器中是否有数据位(只读)
1 = 接收缓冲器中有数据、有至少一个或多个字符可读
0 = 接收缓冲器为空
***************************************************/
U2BRG = ((FCY/16)/BAUD2) - 1; // set baudrate to BAUD rate IEC0bits.U1RXIE = 1;
IFS0bits.U2TXIF = 0;
//清UART1发送中断;
IFS0bits.U2RXIF = 0;
//清UART1接受中断
IEC0bits.U2RXIE = 1;
//允许UART1接受中断*/
//IEC0bits.U2TXIE = 1;
//Uart_Printf("UART2 is OK!\n");
}
void SendMsg1(unsigned char* pt)// point to first char in string
{
U1STAbits.UTXEN = 1; // Initiate transmission
while (*pt)
{
while (U1STAbits.UTXBF);
U1TXREG = *pt++;
}
}
void SendMsg2(unsigned char* pt)// point to first char in string
{
U2STAbits.UTXEN = 1; // Initiate transmission
while (*pt)
{
while (U2STAbits.UTXBF);
U1TXREG = *pt++;
}
}
/*
//if you don't use vsprintf(), the code size is reduced very much.
void Uart1_Printf(char *fmt,...)
{
va_list ap;
char string[256];
va_start(ap,fmt);
vsprintf(string,fmt,ap);
SendMsg1(string);
va_end(ap);
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -