welcom ! Handel home

2014年6月23日 星期一

ST32_USART register note

學習之前先瞭解幾個重要的寄存器:

串口時鐘使能,GPIO相應時鐘使能:APB2ENRAPB1ENR  
GPIOx模式設置:GPIOX_CRL/ODR ,如圖:
輸出位應設置為推挽複用輸出
接收位設為浮空輸入或帶上拉輸入,設置方法參看前一篇講解。




串口復位: APB2RSTR  APB1RSTR

串口串列傳輸速率設置: USART_BRR


串口控制:USART_CR1~3
    初步只用到USART_CR1UE 為串口使能位,使串口開始工作;為字長選擇位,89位元資料;PCE 為校驗使能位,0禁止校驗;PS 為校驗位選擇,設置為 則為偶校驗,否則為奇數同位檢查;TCIE 為發送完成中斷使能位; RXNEIE 為接收緩衝區非空中斷使能,接收到資料後進入中斷函數;TE 為發送使能位,設置為 1,將開啟串口的發送功能。RE 為接收使能位,用法同 TE



資料發送與接收:USART_DR
包含了 TDR  RDR,當向該寄存器寫資料的時候,串口就會自動發送當收到收據的時候也是存在該寄存器內。

串口狀態寄存器   USART_SR 
RXNE(讀數據寄存器非空),當該位被置 的時候就是提示已經有資料被接收到了,並且可以讀出來了。通過讀 USART_DR 可以將該位清零,也可以向該位寫 0,直接清除。 
TC (發送完成),當該位被置位的時候,表示 USART_DR 內的資料已經被發送完成了。
該位元也有兩種清零方式:
    1)讀 USART_SR,寫USART_DR
    2)直接向該位寫 0

/*******************************************************************************
* Function Name  : USART_ClearFlag
* Description    : Clears the USARTx's pending flags.
* Input          : - USARTx: Select the USART or theUART peripheral.
*                    This parameter can be oneof the following values:
*                  - USART1, USART2, USART3,UART4 or UART5.
*                  - USART_FLAG: specifies the flag to clear.
*                    This parameter can be any combination of the following values:
*      - USART_FLAG_CTS:  CTS Change flag (not available for  UART4and UART5).
*      - USART_FLAG_LBD:  LIN Break detection flag.
*     - USART_FLAG_TC:   Transmission Complete flag. 發送完成Flag 1: send ready 0:no ready
*     - USART_FLAG_RXNE:Receive data register not empty flag. 接收非空 1: rx a data 0:no data
*     - USART_FLAG_IDLE: IdleLine detection flag.
*                       - USART_FLAG_ORE:  OverRun Error flag.
*                       - USART_FLAG_NE:   Noise Error flag.
*                       - USART_FLAG_FE:   Framing Error flag.
*         - USART_FLAG_PE:   Parity Error flag. 同位錯誤
*
*               Note: - For IDLE, ORE, NE, FE and PE flags user has to read
*                          the USART_DR register after calling this function.
*                          - TXE flag can't becleared by this function, it's
*                          cleared only by a writeto the USART DR register.                       
* Output         : None
* Return         : None
*******************************************************************************/
根據順序依次配置完這幾個寄存器後,串口初始化就基本完成了

接下來可以根據代碼來進一步理解串口配置過程



計算串列傳輸速率部分有興趣的可以查閱相關資料理解一下。
寫完後串口基本配置完成了,下面是接收資料的函數:



根據上面寄存器的講解這些內容是很簡單的!
還有一點,USART_RX_BUF[ ],這個陣列是這樣定義的:
       如果你在某一標頭檔(如A.h)中定義了extern u8 USART_RX_BUF[133];  表明該陣列的定義在別的檔中。在C檔中正常定義(例u8 USART_RX_BUF[133];)然後使用後使該陣列中加入了資料,如果想在別的C 檔中(如main.c)將其中的資料讀出來,可將該標頭檔(A.h)加入到該C文件(如main.c)中即可,或直接將extern u8 USART_RX_BUF[133]; 加入到該C文件(如main.c),當編譯器遇到時會知道它的定義在別的檔中,並去找到。extern的原理很簡單,就是告訴編譯器你現在編譯的檔中,有一個識別字雖然沒有在本檔中定義,但是它是在別的檔中定義的全域變數,你要放行!編譯的時候C檔是逐個編譯的,如果你用到了某一個本檔中沒定義的標示符,編譯器會報錯,而連結階段,各個檔的內容(實際是編譯產生的obj檔)是被合併到一起的,因而,定義於某檔內的全域變數在連結完成後,它的可見範圍被擴大到了整個程式,如果你在兩個C 檔中定義了相同的全域變數,那麼編譯時可以通過,連結時就因重複定義報錯了,總之如果你想在A.c檔中用到其它C檔中的變數,可以在A.c檔中聲明(如extern u8 USART_RX_BUF[133];)該變數,使用即可。如果還是不懂的話,可以去百度上搜一下。

下面是主函數了:

    int main(void){
       u8 i=0;
       Stm32_Clock_Init(9); // sysclk = 8M x 9 = 72M
       delay_init(72);          
       uart_init(72,9600);       // init 9600 under 72M 
       while(1){
               recieve();             // wait for RX buffer ready 
     
               while(USART_RX_BUF[i]){    // when th rxbuff !=0 
                       USART1->DR = USART_RX_BUF[i]; // send out to tx
                       i++;
               }
               i=0;
       }
   }
   

STM32的串口是相當豐富的,功能也很強勁。最多可提供5路串口(MiniSTM32使用的是STM32F103RBT6,具有3個串口),有分數串列傳輸速率發生器、支援單線光通信和半雙工單線通訊、支援LIN、智慧卡協定和IrDASIR ENDEC規範(僅串口3支持)、具有DMA等。
串口最基本的設置,就是串列傳輸速率的設置。

STM32的串口使用起來還是蠻簡單的,只要你開啟了串口時鐘,並設置相應IO口的模式,然後配置一下串列傳輸速率,資料位元長度,同位檢查位元等資訊,就可以使用了。下面,我們就簡單介紹下這幾個與串口基本配置直接相關的寄存器。


1,串口時鐘使能。串口作為STM32的一個外設,其時鐘由外設時鐘使能寄存器控制,這裡我們使用的串口1是在APB2ENR寄存器的第14位。APB2ENR寄存器在之前已經介紹過了,這裡不再介紹。只是說明一點,就是除了串口1的時鐘使能在APB2ENR寄存器,其他串口的時鐘使能位元都在APB1ENR


2,串口復位。當外設出現異常的時候可以通過復位寄存器裡面的對應位設置,實現該外設的重定,然後重新配置這個外設達到讓其重新工作的目的。一般在系統剛開始配置外設的時候,都會先執行重定該外設的操作。串口1的重定是通過配置APB2RSTR寄存器的第14位來實現的。
APB2RSTR寄存器的各位描述如下:
            


3.3.1.1寄存器APB2RSTR各位描述
從上圖可知串口1的復位設置位在APB2RSTR的第14位。通過向該位寫1復位串口1,寫0結束復位。其他串口的復位位在APB1RSTR裡面。

3
,串口串列傳輸速率設置。每個串口都有一個自己獨立的串列傳輸速率寄存器USART_BRR,通過設置該寄存器達到配置不同串列傳輸速率的目的。該寄存器的各位描述如下:
                                              


3.3.1.2寄存器USART_BRR各位描述
前面提到STM32的分數串列傳輸速率概念,其實就是在這個寄存器裡面體現的。
最低4位元用來存放小數部分DIV_Fraction[15:4]12位元用來存放整數部分DIV_Mantissa
16位未使用。這裡串列傳輸速率的計算通過如下公式計算:

                                                           
  
這裡的fpclkxx=12)是給外設的時鐘(PCLK1用於串口2345PCLK2用於串口1),USARTDIV是一個無符號的定點數,它的值可以有串口的BRR寄存器值得到。而我們更關心的是如何從USARTDIV的值得到USART_BRR的值,因為一般我們知道的是串列傳輸速率,和PCLKx的時鐘,要求的就是USART_BRR的值。
下面我們來介紹如何通過USARTDIV得到串口USART_BRR寄存器的值,假設我們的串口1要設置為9600的串列傳輸速率,而PCLK2的時鐘為72M。這樣,我們根據上面的公式有:USARTDIV=72000000/9600*16=468.75
那麼得到:DIV_Fraction=16*0.75=12=0X0C;                DIV_Mantissa= 468=0X1D4;
這樣,我們就得到了USART1->BRR的值為0X1D4C。只要設置串口1BRR寄存器值為0X1D4C就可以得到9600的串列傳輸速率。


4
,串口控制。STM32的每個串口都有3個控制寄存器USART_CR1~3,串口的很多配置都是通過這3個寄存器來設置的。這裡我們只要用到USART_CR1就可以實現我們的功能了。


BIT 13: 串口功能;
BIT 12: MODE
,字長。0:  1個開始位元,8個資料位元,1位元停止位(默認);1:  1個開始位元,9位元資料位元,1位元停止位(默認);
*
注意:停止位的長度可在USART_CR2寄存器中設置。
BIT 11: WAKE
喚醒功能
BIT 10:
校檢使能位,當啟動同位功能時,置位該位將自動往要傳輸資料的高位位元組處插入就校驗位元。
BIT 09: Parity Selection
0:偶校驗;1:奇數同位檢查。
BIT 08: PE Interrupt Enable
BIT 07:
發送緩衝區空中斷使能位
BIT 06: 發送完成中斷使能位
BIT 05: 接收緩衝區非空中斷使能位
BIT 04: Idle Interrupt Enable
BIT 03: Transfer Enable
BIT 02: Receive Enable
BIT 01: Receiver Wakeup
BIT 00: Send Break

5
資料發送與接收

STM32的發送與接收是通過資料寄存器USART_DR來實現的,這是一個雙寄存器,包含了TDRRDR。當向該寄存器寫資料的時候,串口就會自動發送,當收到收據的時候,也是存在該寄存器內。該寄存器的各位描述如下:
                                                       
   
3.3.1.3寄存器USART_DR各位描述

可以看出,雖然是一個32位寄存器,但是只用了低9位(DR[8:0]),其他都是保留。
DR[8:0]
為串口資料,包含了發送或接收的資料。由於它是由兩個寄存器組成的,一個給發送用(TDR),一個給接收用(RDR),該寄存器兼具讀和寫的功能。

TDR寄存器提供了內部匯流排和輸出移位暫存器之間的平行介面。
RDR寄存器提供了輸入移位暫存器和內部匯流排之間的平行介面。
當使能校驗位(USART_CR1PCE位被置位)進行發送時,寫到MSB的值(根據資料的長度不同,MSB是第7位或者第8)會被後來的校驗位該取代。
當使能校驗位進行接收時,讀到的MSB位是接收到的校驗位。


6
串口狀態

串口的狀態可以通過狀態寄存器USART_SR讀取。USART_SR的各位描述如下:
                                                                      


3.3.1.4寄存器USART_SR各位描述

這裡我們關注一下兩個位,第56RXNETC
RXNE
(讀數據寄存器非空),當該位被置1的時候,就是提示已經有資料被接收到了,並且可以讀出來了。這時候我們要做的就是儘快去讀取USART_DR,通過讀USART_DR可以將該位清零,也可以向該位寫0,直接清除。
TC
(發送完成),當該位被職位的時候,表示USART_DR內的資料已經被發送完成了。如果設置了這個位的中斷,則會產生中斷。該位元也有兩種清零方式:

1)讀USART_SR,寫USART_DR
2)直接向該位寫0

//初始化IO 串口1
//pclk2 CLK2
時鐘頻率(Mhz)
//bound:
串列傳輸速率
void uart_init(u32 pclk2
u32bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//
得到USARTDIV
mantissa=temp;
//
得到整數部分
fraction=(temp-mantissa)*16;//
得到小數部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2 br=""> //
使能PORTA口時鐘
RCC->APB2ENR|=1<<14 br=""> //
使能串口時鐘
GPIOA->CRH=0X444444B4;//IO
狀態設置
RCC->APB2RSTR|=1<<14 br=""> //
復位串口1
RCC->APB2RSTR&=~(1<<14 span="">停止復位
//
串列傳輸速率設置
USART1->BRR=mantissa; // 
串列傳輸速率設置
USART1->CR1|=0X200C;
//1
位停止,無校驗位.
#ifdef EN_USART1_RX
//
如果使能了接收
//
使能接收中斷
USART1->CR1|=1<<8 br=""> //PE
中斷使能
USART1->CR1|=1<<5 br=""> //
接收緩衝區非空中斷使能
MY_NVIC_Init(3
3USART1_IRQChannel2);//2,最低優先順序
#endif
}
從該代碼可以看出,其初始化串口的過程,和我們前面介紹的一致先計算得到USART1->BRR的內容。然後開始初始化串口引腳,接著把USART1復位,然之後設置串列傳輸速率和同位等。
這裡需要注意一點,因為我們使用到了串口的中斷接收,必須在usart.h裡面定義 EN_USART1_RX 。該函數才會配置中斷使能,以及開啟串口1NVIC中斷。這裡我們把串口1中斷放在組2,優先順序設置為組2裡面的最低。
再介紹一下串口1的中斷服務函數USART1_IRQHandler,該函數的名字不能自己定義了,MDK已經給每個中斷都分配了一個固定的函數名,我們直接用就可以了。具體這些函數的名字是什麼,我們可以在MDK提供的例子裡面,找到stm32f10x_it.c,該檔裡面包含了STM32所有的中斷服務函數。USART1_IRQHandler的代碼如下:
void USART1_IRQHandler(void)
{
   u8  res;
   if(USART1->SR&(1<<5 span="">接收到資料
   {
           res=USART1->DR;
           if((USART_RX_STA&0x80)==0)//
接收未完成
          {
                 if(USART_RX_STA&0x40)//
接收到了0x0d
                 {
                          if(res!=0x0a)
                                  USART_RX_STA=0;//接收錯誤,重新開始
                         else 
                                  USART_RX_STA|=0x80; //接收完成了
                 }else //
還沒收到0X0D
           {
            if(res==0x0d)USART_RX_STA|=0x40;
             else
           {
                USART_RX_BUF[USART_RX_STA&0X3F]=res;
                USART_RX_STA++;
                if(USART_RX_STA>63)USART_RX_STA=0;//
接收資料錯誤,重新開始接收
                    }
                }
          }
   }
}
該函數的重點就是判斷接收是否完成,通過檢測是否收到0X0D0X0A的連續2個位元組(回車鍵)來檢測是否結束。當檢測到這個結束序列之後,就會置位USART_RX_STA的最高為來標記已經收到了一次資料。之後等待外部函數清空該位元之後才開始第二次接收。所接收的資料全部存放在USART_RX_BUF裡面,一次接收資料不能超過64個位元組,否則被丟棄。
介紹完了這兩個函數,我們回到test.c,在test.c裡面編寫如下代碼:


#include
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h"
//Mini STM32
開發板範例代碼3
//
串口實驗
//
正點原子@ALIENTEK
//2010.5.28
int main(void)
{
u8  t;
u8  len;
u16  times=0;
Stm32_Clock_Init(9);//
系統時鐘設置
delay_init(72);
//
延時初始化
uart_init(72
9600);
//
串口初始化為9600
LED_Init();
//
初始化與LED連接的硬體介面
while(1)
{
   if(USART_RX_STA&0x80){
         len=USART_RX_STA&0x3f;//得到此次接收到的資料長度
         printf("\n
您發送的消息為:\n");
         for(t=0;t
             USART1->DR=USART_RX_BUF[t];
             while((USART1->SR&0X40)==0);//
等待發送結束}
             printf("\n\n");//
插入換行
             USART_RX_STA=0;
    }else{
        times++;
        if(times%5000==0){
               printf("\nMiniSTM32開發板串口實驗\n");
               printf("
正點原子@ALIENTEK\n\n\n");
        }
        if(times%200==0)printf("
請輸入資料,以回車鍵結束\n");
        if(times%30==0)LED0=!LED0;//
閃爍LED,提示系統正在運行.
        delay_ms(10);
        }
    }
}
這段代碼比較簡單,重點看下以下兩句:
USART1->DR=USART_RX_BUF[t];
while((USART1->SR&0X40)==0);//
等待發送結束
第一句,其實就是發送一個位元組到串口,通過直接操作寄存器來實現的。第二句呢,就是我們在寫了一個位元組在USART1->DR之後,要檢測這個資料是否已經被發送完成了,通過檢測USART1->SR的第6位,是否為1來決定是否可以開始第二個位元組的發送。

寄存器:
1.串口1的時鐘使能在APB2ENR寄存器第14位(其他串口的時鐘使能位元都在APB1ENR)。
2.串口1的重定是通過配置APB2RSTR寄存器的第14位(其他串口的復位位在APB1RSTR裡面)
3.串列傳輸速率寄存器USART_BRR(低16位有效)
4.控制寄存器USART_CR1~3:低14位有效;位13UE)是串口使能位,位3TE)是發送使能位,位2RE)是接受使能位
5.資料寄存器USART_DR(低9位有效,兼具讀寫功能)
6.狀態寄存器USART_SR5位元RXNE(讀數據寄存器非空),6TC(發送完成)


================================================================

USART_DR(資料寄存器)
8-0位:DR[8:0]資料值,包含了發送或接收的資料。由於它是由兩個寄存器組成的,一個給發送用(TDR),一個給接收用(RDR),該寄存器兼具讀和寫的功能。
      TDR寄存器提供了內部匯流排和輸出移位暫存器之間的平行介面(參見圖248)RDR寄存器提供了輸入移位暫存器和內部匯流排之間的平行介面。
      當使能校驗位(USART_CR1PCE位被置位)進行發送時,寫到MSB的值(根據資料的長度不同,MSB是第7位或者第8)會被後來的校驗位該取代。
      當使能校驗位進行接收時,讀到的MSB位是接收到的校驗位。


USART_BRR(波特比率寄存器)
15-4位:DIV_Mantissa[11:0]USARTDIV的整數部分,這12位元定義了USART分頻器除法因數(USARTDIV)的整數部分。
3-0位:DIV_Fraction[3:0]USARTDIV的小數部分,這4位元定義了USART分頻器除法因數(USARTDIV)的小數部分。
USART_CR1(控制寄存器1)
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
保留 UE M WAKE PCE PS PEIE TXEIE TCIE RXNEIE IDLEIE TE RE RWU SBK
13位:UE-USART使能,當該位被清零,在當前位元組傳輸完成後USART的分頻器和輸出停止工作,以減少功耗。該位元由軟體設置和清零。
     定義:0USART分頻器和輸出被禁止),1USART模組使能)
12位:M字長,該位元定義了資料字的長度,由軟體對其設置和清零,定義:0(一個起始位元,8個資料位元,n個停止位)1(一個起始位元,9個資料位元,n個停止位)
     注意:在資料傳輸過程中(發送或者接收時),不能修改這個位。
11位:WAKE喚醒的方法,這位決定了把USART喚醒的方法,由軟體對該位元設置和清零。定義:0(被空閒匯流排喚醒)1(被位址標記喚醒)
10位:PCE檢驗控制使能,用該位元選擇是否進行硬體校驗控制(對於發送來說就是校驗位的產生;對於接收來說就是校驗位的檢測)。當使能了該位,
     在發送資料的最高位元(如果M=1,最高位就是第9位;如果M=0,最高位就是第8)插入校驗位;對接收到的資料檢查其校驗位元。軟體對它置’1’或清’0’
     一旦設置了該位元,當前位元組傳輸完成後,校驗控制才生效。定義:0(禁止校驗控制),1(使能校驗控制)
9位:PS校驗選擇,當校驗控制使能後,該位用來選擇是採用偶校驗還是奇數同位檢查。軟體對它置1或清0。當前位元組傳輸完成後,該選擇生效。定義:0(偶校驗)1(奇數同位檢查)
8位:PEIE-PE中斷使能,該位元由軟體設置或清除,定義:0(禁止產生中斷),1(當USART_SR中的PE’1’時,產生USART中斷)
7位:TXEIE發送緩衝區空中斷使能,(手動),定義:0(禁止產生中斷),1(當USART_SR中的TXE’1’時,產生USART中斷)
6位:TCIE發送完成中斷使能,(手動),定義:0(禁止產生中斷)1(當USART_SR中的TC’1’時,產生USART中斷)
5位:RXNEIE接收緩衝區非空中斷使能,(手動),定義:0(禁止產生中斷),1(當USART_SR中的ORE或者RXNE’1’時,產生USART中斷)
4位:IDLEIE-IDLE中斷使能,(手動),定義:0(禁止產生中斷),1(當USART_SR中的IDLE’1’時,產生USART中斷)
3位:TE發送使能,該位使能發送器。(手動,定義:0(禁止發送),1(使能發送)注意:1.在資料傳輸過程中,除了在智慧卡模式下,
    如果TE 上有個0脈衝(即設置為’0’之後再設置為’1’),會在當前資料字傳輸完成後,發送一個前置字元”(空閒匯流排)
    2.當TE被設置後,在真正發送開始之前,有一個比特時間的延遲。
2位:RE接收使能(手動),定義:0(禁止接收),1(使能接收,並開始搜尋RX引腳上的起始位)
1位:RWU接收喚醒,該位用來決定是否把USART置於靜默模式。該位元由軟體設置或清除。當喚醒序列到來時,硬體也會將其清零
    定義:0(接收器處於正常工作模式),1(接收器處於靜默模式)注意:1.在把USART置於靜默模式(設置RWU位元)之前,USART要已經先接收了一個資料位元組。
    否則在靜默模式下,不能被空閒匯流排檢測喚醒。2.當配置成位址標記檢測喚醒(WAKE位元=1),在RXNE位被置位元時,不能用軟體修改RWU位元。
0位:SBK發送斷開幀,使用該位元來發送斷開字元。該位元可以由軟體設置或清除。操作過程應該是軟體設置位元它,然後在斷開幀的停止位元時,由硬體將該位元重定。
    定義:0(沒有發送斷開字元),1(將要發送斷開字元)


控制寄存器2(USART_CR2)
14位:LINEN0-LIN模式使能(手動),定義:0(禁止LIN模式),1(使能LIN模式)
     LIN模式下,可以用USART_CR1寄存器中的SBK位發送LIN同步斷開符(13),以及檢測LIN同步斷開符。
13-12位:STOP停止位,這2位用來設置停止位的位數,定義:001個停止位)010.5個停止位)102個停止位)111.5個停止位)
        注:UART4UART5不能用0.5停止位和1.5停止位。
11位:CLKEN時鐘使能,該位元用來使能CK引腳,定義:0(禁止CK引腳),1(使能CK引腳)注:UART4UART5上不存在這一位。
10位:CPOL時鐘極性,在同步模式下,可以用該位選擇SLCK引腳上時鐘輸出的極性。和CPHA位元一起配合來產生需要的時鐘/資料的採樣關係,
     定義:0(匯流排空閒時CK引腳上保持低電平),1(匯流排空閒時CK引腳上保持高電平)注:UART4UART5上不存在這一位。
9位:CPHA時鐘相位,在同步模式下,可以用該位選擇SLCK引腳上時鐘輸出的相位。和CPOL位元一起配合來產生需要的時鐘/資料的採樣關係(參見圖259和圖260)
    定義:0(在時鐘的第一個邊沿進行資料捕獲),1(在時鐘的第二個邊沿進行資料捕獲)注:UART4UART5上不存在這一位
8位:LBCL最後一位元時鐘脈衝,在同步模式下,使用該位元來控制是否在CK引腳上輸出最後發送的那個資料位元組(MSB)對應的時鐘脈衝
    定義:0(最後一位元資料的時鐘脈衝不從CK輸出),1(最後一位元資料的時鐘脈衝會從CK輸出)
    注意:1.最後一個資料位元就是第8或者第9個發送的位元(根據USART_CR1寄存器中的M位所定義的8或者9位元資料框架格式)2UART4UART5上不存在這一位。
6位:LBDIE-LIN斷開符檢測中斷使能,斷開符中斷遮罩(使用斷開分隔符號來檢測斷開符),定義:0(禁止中斷),1(只要USART_SR寄存器中的LBD’1’就產生中斷)
5位:LBDL-LIN斷開符檢測長度,該位用來選擇是11位還是10位的斷開符檢測,定義:010位的斷開符檢測),111位的斷開符檢測)
3-0位:ADD[3:0]本設備的USART節點位址,該位元域給出本設備USART節點的位址。這是在多處理器通信下的靜默模式中使用的,使用位址標記來喚醒某個USART設備
注意: 在使能發送後不能改寫這三個位(CPOLCPHALBCL)


USART_CR3(控制寄存器3)
10位:CTSIE-CTS中斷使能,定義:0(禁止中斷),1SART_SR寄存器中的CTS’1’時產生中斷)注:UART4UART5上不存在這一位
9位:CTSE-CTS使能,定義:0:禁止CTS硬體流控制1CTS模式使能,只有nCTS輸入信號有效(拉成低電平)時才能發送資料。如果在資料傳輸的過程中,
    nCTS信號變成無效,那麼發完這個資料後,傳輸就停止下來。如果當nCTS為無效時,往資料寄存器裡寫資料,則要等到nCTS有效時才會發送這個資料。
    注:UART4UART5上不存在這一位
8位:RTSE-RTS使能,定義:0(禁止RTS硬體流控制)1RTS中斷使能,只有接收緩衝區內有空余的空間時才請求下一個資料。當前資料發送完成後,發送操作就需
    要暫停下來。如果可以接收資料了,將nRTS輸出置為有效(拉至低電平)。注:UART4UART5上不存在這一位。
7位:DMAT-DMA使能發送,(手動),定義:0(禁止發送時的DMA模式)1(使能發送時的DMA模式)注:UART4UART5上不存在這一位。
6位:DMAR-DMA使能接收,(手動),定義:0(禁止接收時的DMA模式)1(使能接收時的DMA模式)注:UART4UART5上不存在這一位。
5位:SCEN智慧卡模式使能,該位元用來使能智慧卡模式,定義:0(禁止智慧卡模式)1(使能智慧卡模式)注:UART4UART5上不存在這一位。
4位:NACK智慧卡NACK使能,定義:0(校驗錯誤出現時,不發送NACK1(校驗錯誤出現時,發送NACK)注:UART4UART5上不存在這一位
3位:HDSEL半雙工選擇,選擇單線半雙工模式,定義:0(不選擇半雙工模式)1(選擇半雙工模式)
2位:IRLP紅外低功耗,該位元用來選擇普通模式還是低功耗紅外模式,定義:0(通常模式),1(低功耗模式)
1位:IREN紅外模式使能,(手動),定義:0(不使能紅外模式),1(使能紅外模式)
0位:EIE錯誤中斷使能,在多緩衝區通信模式下,當有幀錯誤、超載或者雜訊錯誤時(USART_SR中的FE=1,或者ORE=1,或者NE=1)產生中斷。
    定義:0(禁止中斷),1(只要USART_CR3中的DMAR=1,並且USART_SR中的FE=1,或者ORE=1,或者NE=1,則產生中斷)


保護時間和預分頻寄存器(USART_GTPR)
15-8位:GT[7:0]保護時間值,該位域規定了以波特時鐘為單位的保護時間。在智慧卡模式下,需要這個功能。當保護時間過去後,才會設置發送完成標誌。
       注:UART4UART5上不存在這一位
7-0位:PSC[7:0]預分頻器值,在紅外(IrDA)低功耗模式下:PSC[7:0]=紅外低功耗串列傳輸速率,對系統時鐘分頻以獲得低功耗模式下的頻率:
      源時鐘被寄存器中的值(僅有8位有效)分頻,定義:00000000:保留不要寫入該值;00000001:對源時鐘1分頻;00000010:對源時鐘2分頻;
      在紅外(IrDA)的正常模式下:PSC只能設置為00000001,在智慧卡模式下,PSC[4:0]:預分頻值,對系統時鐘進行分頻,給智慧卡提供時鐘。
      寄存器中給出的值(5位有效)乘以2後,作為對源時鐘的分頻因數,00000:保留不要寫入該值;00001:對源時鐘進行2分頻;00010:對源時鐘進行4分頻
      00011:對源時鐘進行6分頻;注意:1.位[7:5]在智慧卡模式下沒有意義。2UART4UART5上不存在這一位。



沒有留言: