新闻中心

EEPW首页>嵌入式系统>设计应用> ARM7串口编程要点

ARM7串口编程要点

作者: 时间:2016-11-24 来源:网络 收藏


U0LCR = 0x80; // DLAB位置1
bak = (Fpclk>>4)/baud;
U0DLM = bak>>8;
U0DLL = bak&0xff;


bak = set.datab-5; // 设置字长度
if(2==set.stopb)
{
bak |= 0x04; // 判断是否为2位停止位
}
if(0!=set.parity)
{
set.parity = set.parity-1;
bak |= 0x08;
}
bak |= set.parity<<4; // 设置奇偶校验
U0LCR = bak;

return(1);
}
2. 串口接收数据
用轮循方式接收数据
1>CPU通过串口接收数据时各个寄存器之间的关系


2>串口接受数据的流程:
l 循环检测U0RBR是否有未读取的数据。
l 如果有数据到来,则接收数据。
3>相关寄存器配置
(1) U0LSR(线状态寄存器)
l 作用:只读寄存器,它提供UART0发送和接收模块的状态信息。
l 长度:8位寄存器。
l 各位寄存器的含义:
A.0位:表示接收数据就绪
置0表示U0RBR为空
置1表示U0RBR包含有效数据
注:当U0RBR包含未读的字符时,第0位被置位;当UART0的U0RBR或FIFO为空时,第0位置零。
B.第1位:溢出错误。
置0:溢出错误状态未激活
置1:溢出错误状态激活
注:溢出错误条件在错误发生后立即设置。对U0LSR读操作将清零第1位。当UART0的RSR已经有新的字符就绪,而UART0 RBR或FIFO已满时,第一位置1.此时的UART0 RBR或FIFO不会被覆盖,UART0 的RSR中的字符将丢失。
C.第2位:奇偶错误。
置0:奇偶错误状态未激活
置1:奇偶错误状态激活
注:
² 当接收字符的奇偶位处于错误状态时产生一个奇偶错误。对U0LSR读操作清零该位。
² 奇偶错误检测时间取决于U0FCR的bit0。奇偶错误与UART0 的RBR,FIFO中读出的字符相关。
D.第3位:帧错误
置0:帧错误状态未激活。
置1:帧错误状态激活
注:
² 当接收字符的停止位为0时,产生帧错误。对读操作U0LSR清零该位。
² 帧错误检测时间取决于U0FCR的bit0.
² 帧错误与UART0的RBR,FIFO中读出的字符相关。当检测到一个帧错误时,Rx将尝试与数据重新同步并假设错误的停止位实际是一个超前的起始位。但即使没有出现帧错误,它也不能假设下一个接收到的字节是正确的。
E.第四位:间隔中断
置0:间隔中断状态未激活
置1:间隔中断状态状态激活
注:
² 在发送整个字符(起始位,数据,奇偶位和停止位)过程中RXD0如果都保持逻辑0,则产生间隔中断。
² 当检测到中断条件时,接收器立即进入空闲状态直到RXD0变为全1状态。
² 读操作U0LSR清零该状态位。
² 间隔检测的时间取决于U0FCR的bit0.
² 间隔中断与UART0的RBR或FIFO中读出的字符相关。
F.第五位:发送保持寄存器空
置0:表示U0THR包含有效数据
置1:表示U0THR空
注:
² 当检测到UART0 的THR空时,THRE置位。
² 对U0THR写操作清零该位。
G.第6位:表示发送器空
置0:U0THR和或U0TSR包含有效数据。
置1:U0THR和U0TSR空
注:
² 当U0THR和U0TSR都为空时,该位置1
² 当U0TSR或U0THR包含有效数据时,该位清零。
H第7位:表示Rx FIFO 错误。
置0:U0RBR中没有UART0 Rx错误,或U0FCR的bit为0.
置1:U0RBR包含至少一个UART0 Rx错误。
注:
² 当一个带有Rx错误(例如帧错误,奇偶错误或间隔中断)的字符装入U0RBR时,该位置1.
² 当读取U0LSR寄存器并且UART0的FIFO中不再有错误时,该位置零。
(2) U0RBR(接收器缓冲寄存器)
l 作用:只读寄存器,是UART0 Rx FIFO的最高字节。它包含了最早接收到的字符,可通过总线接口读出。串口接收数据时低位在先,即U0RBR的bit0为最早接收到的数据位。如果接收到的数据小于8位,未使用的MSB填充为0.
l 长度:8位寄存器。
4>串口接收数据程序

uint8 UART0_RcvByte(void)
{
uint8 rcv_data ;
while((U0LSR&0X01)==0); //等待数据到达
rcv_data = U0RBR; //从U0RBR中读出接收到的数据
return rcv_data; //返回接收到的数据
}

3. 串口发送数据
1> 用CPU通过串口发送数据时,各寄存器之间的关系

2> 串口发送数据时的流程
l 将要发送的一字节数据写入U0THR
l 等待数据发送完毕
3> 相关寄存器配置
(1)U0THR(发送保持寄存器)
l 最用:只写寄存器。U0THR是UART0 Tx FIFO的最高字节。它包含了Tx FIFO 中最新的字符,可通过总线接口写入。串口发送数据时,低位在先,bit0代表最先发送的位。
l 长度:8位寄存器
(2)U0LSR(线状态寄存器)
在上面已经介绍,在此步再涉及。
4> 串口发送数据程序

void UART0_SendByte(uint8 data)
{
U0THR = data;
while(0 == (U0LSR & 0x40));


4. 完整的程序事例:
用轮训方式实现接收上位机数据,并把数据再发送给上位机。

[c-sharp] view plaincopyprint?
  1. #include "config.h"
  2. void DelayNS(uint32 dly)
  3. {
  4. uint32 i;
  5. for(; dly>0; dly--)
  6. {
  7. for(i=0; i<5000; i++);
  8. }
  9. }
  10. void UART0_Init(uint32 bps)
  11. {
  12. uint16 Fdiv;
  13. PINSEL0 = 0x00000005; //设置串口引脚
  14. U0LCR = 0x83; //置为除数锁存位,进行配置
  15. Fdiv = (Fpclk >> 4) / bps; // 设置波特率
  16. U0DLM = Fdiv >> 8;
  17. U0DLL = Fdiv & 0xff;
  18. U0LCR = 0x03; //清除除数锁存位,并设置工作模式
  19. }
  20. uint8 UART0_RcvByte(void)
  21. {
  22. uint8 rcv_data ;
  23. while((U0LSR&0X01)==0); //等待数据到达
  24. rcv_data = U0RBR; //从U0RBR中读出接收到的数据
  25. return rcv_data; //返回接收到的数据
  26. }
  27. void UART0_SendByte(uint8 data)
  28. {
  29. U0THR = data;
  30. while(0 == (U0LSR & 0x40));
  31. }
  32. void UART0_RecBuf (uint8 *buffer)
  33. {
  34. uint8 *pbuffer;
  35. uint8 i;
  36. for(pbuffer = buffer, i = 0;i < 8; i++)
  37. {
  38. *(pbuffer++) = UART0_RcvByte();
  39. }
  40. }
  41. void UART0_SendBuf(uint8 *buffer)
  42. {
  43. uint8 *pbuffer;
  44. uint8 i;
  45. for(pbuffer = buffer,i=0;i < 8; i++)
  46. UART0_SendByte(*(pbuffer++));
  47. }
  48. int main (void)
  49. {
  50. uint8 recver_buffer[8]; //定义接收帧缓冲区
  51. uint8 send_buffer[8] ={0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27}; //定义发送帧缓冲区
  52. UART0_Init(115200);
  53. while(1)
  54. {
  55. UART0_RecBuf(recver_buffer);
  56. DelayNS(10);
  57. if(0x10 ==recver_buffer[0] && 0x11 == recver_buffer[1])
  58. UART0_SendBuf(recver_buffer);
  59. else
  60. UART0_SendBuf(send_buffer);
  61. }
  62. return 0;
  63. }


上一页 1 2 下一页

关键词:ARM7串口编

评论


技术专区

关闭