纠错:U0DBUF发送缓冲区,但是我在中文手册手册上没有找的到这个寄存器,手册上只有U0BUF,U0BUF编译会出错, 我去查了下英文手册,才发现原来是翻译人员翻译错误了,只有U0DBUF,建议看英文手册。 串口通信:
P_2 接收端 P_3发送端(单片机和电脑的电频不同,通过PL2303转换,这是针对zigbee模块的
,想51单片机可以通过232,485来转换)。
TTL 输出:低电平小于0.8,高电平大于2.4 。TTL 输入:低电平小于1.2,高电平大于2
P_2和P_3可以复用到串口,也可以复用到SPI
#include <string.h>
void *memcpy(void *, const void *, size_t);//复制函数
void *memset(void *, int, size_t);//设置函数,注意是传递的指针,这些很基础,是C语言库里面的函数接口,自己下个C语言完全手册看
int memcmp(const void *, const void *, size_t);
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定为32M
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ
void UartSendString(char *Data, int len)//串口发送函数Data:发送缓冲区 len:发送长度
{
uint i;
for(i=0; i<len; i++)
{
U0DBUF = *Data++;//我猜测U0DBUF发送缓冲区,但是我在手册上没有找的到这个寄存器,手册上只有U0BUF
while(UTX0IF == 0);
UTX0IF = 0;//发送完后UTX0IF自动设置成1
}
}
void InitUart(void)
{
PERCFG = 0x00; //外设控制寄存器 USART 0的IO位置:0为P0口位置1
P0SEL = 0x0c; //P0_2,P0_3用作串口(外设功能)
P2DIR &= ~0XC0; //P0优先作为UART0
U0CSR |= 0x80; //设置为UART方式
U0GCR |= 11; //1011 有
U0BAUD |= 216; //波特率设为115200
UTX0IF = 0; //UART0 TX中断标志初始置位0
U0CSR |= 0x40; //允许接收
IEN0 |= 0x84; //开总中断允许接收中断
}
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
URX0IF = 0; // 接受中断标志 清中断标志
RxBuf = U0DBUF; //我猜测应该还有个发送中断,发送完了应该也可以中断
}
U0CSR &= ~0x40; //禁止接收 发送的时候必须把这个禁止了
U0CSR |= 0x40; //允许接收
用到的寄存器如下:
U0CSR 寄存器
Bit[7] USART模式选择 0:SPI模式 1:UART模式
Bit[6] UART接收器使能 0: 禁用接收器 1: 接收器使能
Bit[5] SP 主或者从模式选择 0: SPI 主模式 1: SPI 从模式
Bit[4] UART 帧错误状态 0: 无帧错误检测 1: 字节收到不正确停止位级别
Bit[3] UART 奇偶错误状态 0: 无奇偶错误检测 1: 字节收到奇偶错误
Bit[2] 接收字节状态 0: 没有收到字节 1: 准备好接收字节
Bit[1] 传送字节状态 0 字节没有被传送 1 写到数据缓存寄存器的最后字节被传送
Bit[0] USART 传送/接收主动状态、在 SPI 从模式该位等于从模式选择 0: USART 空闲 1: 在传送或者接收模式USART 忙碌
P2DIR (0xFF) – 端口 2 方向和端口 0 外设优先级控制
[7:6]外设优先级控制。当 PERCFG 分配给一些外设 到 相同引脚的时候,这些位将确定优先级。
详细优先级列表:
00:第1优先级:USART0第2优先级:USART1 第3优先级:定时器 1
01:第1优先级:USART1第2优先级:USART0 第3优先级:定时器 1
10:第1优先级:定时器1通道0-1第2优先级:USART1第3优先级:USART0第4优先级:定时器 1 通道 2 – 3
11 :第 1 优先级:定时器1通道 2-3第2优先级:USART0第3优先级:USART1第4优先级:定时器 1 通道 0 – 1
[5] 不使用
[4:0] P2 . 4 到 P2 . 0 的 I/O 方向 0 : 输入 1 : 输出
PERCFG (0xF1) – 外设控制
[7] 没有使用
[6]定 时器1的I/O位置0 :备用 位置 1 1 :备用 位置 2
[5]定 时器3的I/O位置0 :备用 位置 1 1 :备用 位置 2
[4]定 时器4的I/O位置0 :备用 位置 1 1 :备用 位置 2
[3:2] 没有使用
[1]USART1的I/O位置0备用位置1 1:备用位置2
[0]USART0的I/O位置0备用位置1 1:备用位置2
U0GCR (0xC5) – USART 0 通用控制
位 名称 复位 描述
[7]SPI 的时钟极性0:负时钟极性 1:正时钟极性
[6]SPI 时钟相位0:当SCK从CPOL倒置到CPOL时数据输出到MOSI,并且当SCK从CPOL倒置到
CPOL 时数据输入抽样到 MISO 。1:当SCK从CPOL倒置到CPOL时数据输出到 MOSI 并且当
SCK 从 CPO L倒置到 CPOL 时数据输入抽样到 MISO 。
[5] 传送位顺序 0 : LSB 先传送 1 : MSB 先传送
[4:0] BAUD_E[4:0] 波特率指数值。 BAUD_E 和 BAUD_M 决定了 UART 波特率 和 SPI 的主 SCK 时
钟频率。
U0BAUD (0xC2) – USART 0 波特率控制
[7:0]BAUD_M[7:0]波特率小数部分的值。BAUD_E和BAUD_M决定了UART的波特率和SPI的主SCK时钟频率。
注意:BAUD_E[4:0]和BAUD_M[7:0]决定波特率
表 16-1 32 MHz 系统时钟常用的波特率设置
波特率 ( b ps) UxBAUD.BAUD_M UxGCR.BAUD_E 误差 ( % )
2400 59 6 0.14
4800 59 7 0.14
9600 59 8 0.14
14400 216 8 0.03
19200 59 9 0.14
28800 216 9 0.03
38400 59 10 0.14
57600 216 10 0.03
76800 59 11 0.14
115200 216 11 0.03
230400 216 12 0.03