zoukankan      html  css  js  c++  java
  • 嵌入式成长轨迹50 【Zigbee项目】【CC2430基础实验】【单片机串口发数】

    USART0 和USART1. 是串行通信接口,它们能够分别运行于异步UART 模式或者同步SPI模式。两个USART具有同样的功能,可以设置在分隔开的I/O 引脚。
    1. UART 模式
        UART 模式提供异步串行接口。在UART 模式中,接口使用2 线或者含有 RXD、TXD、RTS和CTS 的4 线。UART 模式的操作具有下列特点:8 位或者 9 位数据;奇校验、偶校验或者无奇偶校验;配置起始位和停止位电平;配置LSB 或者MSB首先传送;独立收发中断;独立收发DMA触发;奇偶校验和帧校验出错状态。UART 模式提供全双工传送,接收器中的位同步不影响发送功能。传送一个UART 字节包含1 个起始位、8 个数据位、1 个作为可选项的第 9位数据或者奇偶校验位再加上1 个(或2 个)停止位。注意,虽然真实的数据包含 8 位或者9 位,但是,数据传送只涉及一个字节。
        UART 操作由USART控制和状态寄存器UxCSR以及UART 控制寄存器来控制。这里的 x是USART的编号,其数值为 0 或者1。当 UxCSR。MODE 设置为1 时,就选择了 UART 模式。
       (1) UART 发送
         当USART收/ 发数据缓冲器、寄存器 UxBUF(这里的x 是USART的编号,其数值为 0 或者
    1,寄存器UxBUF双缓冲)写入数据时,该字节发送到输出引脚TXDx。
         当字节传送开始时,UxCSR。ACTIVE 位设置为1,而当字节传送结束时UxCSR。AC-TIVE位清0。当传送结束时,TX-BYTE位设置为1。当 USART收/ 发数据缓冲寄存器就绪,准备接收新的发送数据时,就产生了一个中断请求。该中断在传送开始之后立刻发生,因此,当字节正在发送时,新的字节能够装入数据缓冲器。
        (2)  UART 接收
         当1 写入 UxCSR。RE位时,在UART 上数据接收就开始了。然后UTART会在输入引脚RXDx 中寻找有效起始位,并且设置UxCSR;ACTIVE 位为1。当检测出有效起始位时,收到的字节就传人接收寄存器,UxCSR;RX-B g Tn 位设置为1. 。该操作完成时,产生接收中断。通过寄存器UxBUF提供收到的数据字节。当UxBUF读出时,UxCSR。RX-BYTE位由硬件清0。
        (3) UART硬件流控制
         当UxUCR。FLOW 设置为1,硬件流控制使能。然后,当接收寄存器空而且接收使能时,RTS输出变低。在CTS 输入变低之前;不会发生字节传送。
        (4) UART特征格式
         如果寄存器 UxUCR中的BIT9和奇偶校验位设置为 1,那么奇偶校验产生而且检测使能。奇偶校验计算出来,作为第9 位来传送。在接收期间,奇偶校验位计算出来而且与收到的第 9位进行比较。如果奇偶校验出错,则UxCSR;ERR 位设置为 1。当UxCSR读取时,UxC-SR。ERR 位清0。   
         要传送的停止位的数量设置为 1 或者2,这取决于寄存器位 UxUCR STOP。接收器总是要核对一个停止位。如果在接收期间收到的第一个停止位不是期望的停止位电平,就通过设置寄存器位UxCSR。FE为1,发出帧出错信号。当 UxCSR读取时,UxCSR;FE位清0,当 UxCSR。SPB 设置为1 时,接收器将核对两个停止位。
    2.SPI 模式
         在SPI 模式中,USART通过3 线接口或者 4 线接口与外部系统通信。接口包含引脚 MOSI 、MISO、SCK 和SSN 。参见1.5.1 小节中有关如何将 USART引脚指派到I/O 引脚的描述。
        SPI 模式包含下列特征:3 线或者4 线SPI 接口;主/ 从模式;可配置的SCK 极性和相位;可配置的LSB 或MSB传送。
         当UxCSR。MODE 设置为0 时,选中 SPI 模式。在SPI 模式中,USART可以通过写UxCSR。SLAVE位来配置SPI 为主模式或者从模式。

    1)SPI 主模式操作
       当寄存器UxBUF写入字节后,SPI 主模式字节传送就开始了。USAR'I、使用波特率发生器生成SCK 串行时钟,而且传送发送寄存器提供的字节到输出引脚 MOSI。与此同时,接收寄存器从输入引脚MISO获取收到的字节。
         当传送开始时 UxCSR。.ACTIVE 位变高,而当传送结束后,UxCSR。.ACTIVE 位变低。当传送结束时,UxCSR。RX_BYTE 位和UxCSR。FX_BYTE 位设置为1。当收到的新数据在USART收/ 发数据寄存器UxBUF中就绪时,接收中断产生。
         串行时钟 SCK 的极性由UxGCR。CPOtl。位选择,其相位由UxCSR。CPHA 位选择。字节传送的顺序由UxCSR。ORDER.位选择。    
         传送结束时,收到的数据字节由 UxBUF提供,供读取。当SPI 就绪接收另一个字节用来发送时,发送中断产生。由于UxBUF是双缓冲,这个操作刚好在发送开始时就发生了。

    2)SPI 从模式操作
      SPI 从模式字节传送由外部系统控制。输入引脚MISO上的数据传送到接收寄存器,该寄存器由串行时钟SCK.控制。SCK 为从模式输入。与此同时,发送寄存器中的字节传送到输出引脚MOSI。
         当传送开始时 UxCSR.。ACTIVE 位变高,而当传送结束后,UxCSR-ACTIVE位变低。当传送结束时,UxCSR。RX_BYTE 位和 UxCSR。TX-BYTE位设置为1。接收中断产生。
         串行时钟 SCK 的极性由UxCSR。CPOI位选择,其相位由UxCSR。CP H A位选择。字节传送的顺序由UxCSR。ORDER位选择。
         传送结束时,收到的数据字节由 UxBUF提供,供读取。当 SPI 从模式操作开始时,发送中断产生。

    3) 波特率发生器
       当运行在UART 模式时,内部的波特率发生器设置UART、波特率。当运行在SPI 模式时,内部的波特率发生器设置SPI 主时钟频率。
         由寄存器 UxBAUD。BAUD_M[7:O]和UxCSR,BAUD_E[4 :O]定义波特率。该波特率用于UART 传送,也用于SPI 传送的串行时钟速率。波特率由下式给出:
        Baudrate=(256+BAUD_M)*2^BAUD_E*F/2^28式中:F 是系统时钟频率,等于16 MHz 或者32 MHz。
         标准波特率所需的寄存器值如表 1-l 9 所列。该表适用于典型的 32 MHz 系统时钟。真实波特率与标准波特率之间的误差,用百分数表示。    .
         当BAUD_E 等于16 且BAUD M 等于0 时,UART 模式的最大波特率是F/16(F 是系统时钟频率)。当BAUD_E 等于1 9且BAUD_M等于O 时,SPI 模式的最大波特率(即SCK 频率)是F/2。如果设置比这个更高的波特率就会出错。

    4) 清除USART
       通过设置寄存器位 UxUCR。FLUSH可以取消当前的操作。这一事件会立即停止当前操作并且清除全部数据缓冲器。

    5)  USART中断    
         每个USART都有两个中断:RX完成中断(URXx)和TX完成中断(UTXx)。USART的中断使能位在寄存器IEN0 和寄存器IEN2 中,中断标志位在寄存器TCON 和寄存器IRCON2 中。
         中断使能:
         ●USART0 RX:IENO 。URXOIE
         ● USARTl RX :IENO 。URXlIE
         ●USART0 TX:IEN2。UTXOIE
         ● USARTl TX :至EN2 。UTXlIE
         中断标志:
         ●USART0 RX:TCON 。URXOIF
         ●USARTl RX:TCON 。URXlIF
         ●USART0 TX:至RCON2。UTXOIF
         ● USARTl TX :iRCON2 。UTXIIF
    6)USART DMA 触发
         有两个DMA触发与每个USART相关。DMA触发由事件RX或者TX完成激活,也就是,该事件作为DMA中断请求。可以配置DMA信道使用USART收/ 发缓冲器(即UxBUF)作为它的源地址或者匿标地址。

    7)  USART寄存器     。
       对于每个USART,有5 个寄存器(x 是USART的编号,为0 或者1) :
       ●UxCSR;USARTx 控制和状态;
    ●UxUCR:USARTx UART 控制;     。
       ●UxGCR:USARTx 通用控制;
       ●UxBUF:USARTx 收/ 发数据缓冲器
    ●UxBAUD USARTx 波特率控制


    void initUARTtest(void) ;
    函数原型: 

     1 void initUARTtest(void) 
     2 { 
     3  
     4     CLKCON &= ~0x40;              //晶振 
     5     while(!(SLEEP & 0x40));      // 等待晶振稳定 
     6     CLKCON &= ~0x47;             //TICHSPD128 分频,CLKSPD 不分频 
     7     SLEEP |= 0x04;     // 关闭不用的RC振荡器 
     8  
     9     PERCFG = 0x00;       // 位置1 P0 口 
    10     P0SEL = 0x3c;        //P0 用作串口 
    11     P2DIR &= ~0XC0;                             //P0 优先作为串口0 
    12  
    13     U0CSR |= 0x80;        //UART 方式 
    14     U0GCR |= 10;        //baud_e 
    15     U0BAUD |= 216;       // 波特率设为57600 
    16     UTX0IF = 0; 
    17 } 


    函数功能:初始化串口 0,将 I/O 映射到P0口,P0优先作为串口0 使用,UART 工作方式,波特率为57600。使用晶振作为系统时钟源。
     
    void UartTX_Send_String(char *Data,int len); 
    函数原型: 

     1 void UartTX_Send_String(char *Data,int len) 
     2 { 
     3   int j; 
     4   for(j=0;j<len;j++) 
     5   { 
     6     U0DBUF = *Data++; 
     7     while(UTX0IF == 0); 
     8     UTX0IF = 0; 
     9   } 
    10 } 


    函数功能:串口发字串,*Data 为发送缓存指针,len 为发送字串的长度,只能是在初始化函数void initUARTtest(void) 之后调用才有效。发送完毕后返回,无返回值。

      1 //main.c      串口0发数据
      2 #include <ioCC2430.h>
      3 #include <string.h>
      4 
      5 #define uint unsigned int
      6 #define uchar unsigned char
      7 
      8 //定义控制灯的端口
      9 #define led1 P1_0
     10 #define led2 P1_1
     11 
     12 //函数声明
     13 void Delay(uint);
     14 void initUARTtest(void);
     15 void UartTX_Send_String(char *Data,int len);
     16 
     17 char Txdata[30]=" ChenDu WuXianLong TongXun ";
     18 
     19 /****************************************************************
     20 *函数功能 :延时                        
     21 *入口参数 :定性延时                                    
     22 *返 回 值 :无                                                
     23 *说    明 :                                                    
     24 ****************************************************************/
     25 void Delay(uint n)
     26 {
     27     uint i;
     28     for(i=0;i<n;i++);
     29     for(i=0;i<n;i++);
     30     for(i=0;i<n;i++);
     31     for(i=0;i<n;i++);
     32     for(i=0;i<n;i++);
     33 }
     34 
     35 /****************************************************************
     36 *函数功能 :初始化串口1                                        
     37 *入口参数 :无                                                
     38 *返 回 值 :无                            
     39 *说    明 :57600-8-n-1                        
     40 ****************************************************************/
     41 void initUARTtest(void)
     42 {
     43 
     44     CLKCON &= ~0x40;              //晶振
     45     while(!(SLEEP & 0x40));      //等待晶振稳定
     46     CLKCON &= ~0x47;             //TICHSPD128分频,CLKSPD不分频
     47     SLEEP |= 0x04;          //关闭不用的RC振荡器
     48 
     49     PERCFG = 0x00;                //位置1 P0口
     50     P0SEL = 0x3c;                //P0用作串口
     51     P0DIR &= ~0X80;                             //P0优先作为串口0
     52 //p1dir
     53     U0CSR |= 0x80;                //UART方式
     54     U0GCR |= 10;                //baud_e
     55     U0BAUD |= 216;                //波特率设为57600
     56     UTX0IF = 0;
     57 }
     58 
     59 /****************************************************************
     60 *函数功能 :串口发送字符串函数                    
     61 *入口参数 : data:数据                                    
     62 *            len :数据长度                            
     63 *返 回 值 :无                                            
     64 *说    明 :                
     65 ****************************************************************/
     66 void UartTX_Send_String(char *Data,int len)
     67 {
     68   int j;
     69   for(j=0;j<len;j++)
     70   {
     71     U0DBUF = *Data++;
     72     while(UTX0IF == 0);
     73     UTX0IF = 0;
     74   }
     75 }
     76 
     77 
     78 /****************************************************************
     79 *函数功能 :主函数                                
     80 *入口参数 :无                            
     81 *返 回 值 :无                        
     82 *说    明 :无                            
     83 ****************************************************************/
     84 void main(void)
     85 {    
     86     uchar i;
     87         //P1 out
     88     P1DIR = 0x03;                 //P1控制LED
     89     led1 = 0;
     90     led2 = 1;                //关LED
     91 
     92     initUARTtest();
     93     UartTX_Send_String(Txdata,29);            //如:wu xian long tong xun
     94 
     95         for(i=0;i<30;i++)Txdata[i]=' ';
     96 
     97         strcpy(Txdata,"UART0 TX test ");       //将UART0 TX test赋给Txdata;
     98 
     99     while(1)
    100     {
    101            UartTX_Send_String("12345",sizeof("12345")); //串口发送数据
    102             Delay(50000);                     //延时
    103             Delay(50000);
    104             Delay(50000);
    105             led1=~led1;
    106             led2=~led2;
    107     }
    108 }
  • 相关阅读:
    java数组的相关方法
    spring boot 文件目录
    mysql 数据库安装,datagrip安装,datagrip连接数据库
    linux maven 的安装与配置
    java String字符串常量常用方法
    java 命名规范
    deepin 安装open jdk
    jetbrains(idea,webstorm,pycharm,datagrip)修改背景,主题,添加特效,汉化
    JVM学习(九)volatile应用
    JVM学习(八)指令重排序
  • 原文地址:https://www.cnblogs.com/zeedmood/p/2666931.html
Copyright © 2011-2022 走看看