STM8 UART中斷髮,中斷收

STM8 UART 初始化

配置STM8 UART的幾個常用寄存器分別爲:
UART1_CR1:控制寄存器1
UART1_CR3:控制寄存器3
UART1_BRR2:波特率寄存器2
UART1_BRR1:波特率寄存器1

利用控制寄存器1,2,3可以配置UART數據傳輸的具體幀格式,這裏將UART配置爲1個起始位,8個數據位,1個停止位,無校驗位。具體操作代碼如下:

      UART1_CR1=0x00;
      UART1_CR3=0x00;

在UART1_CR1中第4位,定義了數據字的長度,該位寫0將設置UART爲一個起始位,8個數據位,n個停止位,停止位n的數量可在UART1_CR3中設置。
UART1_CR3的第4位和第五位用於設置停止位,這裏寫入00設置爲1個停止位。

接下來,就是配置UART的波特率了.UART的波特率由UART的分頻係數決定,波特率的計算公式爲baudrate=Fmaster/UARTdiv,這裏baudrate爲要設置的波特率,Fmaster爲主時鐘頻率,UARTdiv爲UART分頻係數。STM8上電主時鐘默認使用經過8分頻之後的內部16M HSI時鐘源,即在不改變時鐘配置的情況下,Fmaster=2MHz。
如果要將波特率設置爲9600,那麼只要設置UART分頻係數UARTdiv=2MHz/9600,約爲:208.33333這裏取整數208,其十六進制表示爲0xD0,這要將這個值寫入波特率寄存器中即可。

UART1_BRR2寄存器中的第0位到第3位存放了UART分頻係數的第0位到第三位,UART1_BRR2寄存器中的第4位到第7位存放了UART分頻係數的第12位到第15位。
UART1_BRR1寄存器中的第0位到第7位存放了UART分頻係數的第4位到第11位,

由此,我們可以得到寫入波特率寄存器UART1_BRR1中的數據位0x0D,寫入波特率寄存器UART1_BRR2中的數據位0x00。

另外,需要注意的是,必須先寫寄存器UART1_BRR2,再寫UART1_BRR1

 UART1_BRR2=0x00;
 UART1_BRR1=0x0d;

到這裏就完成了對UART的配置過程,

STM8 UART 發送

對於STM8 UART發送,循環等待發送單個字節的方式這裏不做詳細解釋。
這裏筆者利用UART的串口發送完成中斷完成串口的發送過程。以提高CPU的工作效率以及降低功耗。
首先必須要打開發送完成中斷:

    UART1_CR2|=(1<<7);

打開發送完成中斷之後,UART會發送一個空白幀,此時在我們的中斷服務處理程序中會產生一個UART發送中斷,我們只需要響應這個中斷,並在產生這個中斷中發送我們的數據,直到所有數據發送完畢,則禁止發送中斷即可。UART中斷髮送部分完整代碼如下:

u8* UartSendBuffer;
u8 UartSendDataLength;
void UART1_SendBuffer(u8* buffer){
  UartSendBuffer=buffer;
  UartSendDataLength=strlen((const char*)buffer);
  UART1_CR2|=(1<<7);
}
#pragma vector= UART1_T_TC_vector//UART1 Tx complete 中斷
__interrupt void SYS_UART1_TX_IRQHandler(void){
  u8 status=UART1_SR;
  if(status & UART_IRQ_TXE){
    if(UartSendDataLength!=0){
      UART1_DR=*UartSendBuffer;
      UartSendBuffer++;
      UartSendDataLength--;
    }else{
      UART1_CR2&=~(1<<7);
    }
  }
}

注意:筆者使用的是IAR而不是STVP,使用STVP的童鞋,需要參照代碼另做修改。

STM8 UART接收

STM8 UART中斷接收只需要在初始化部分使能串口接收中斷,響應中斷服務程序讀取數據即可:

UART1_CR2|=(1<<6);

這裏附上完整實例代碼:http://download.csdn.net/detail/yuanquanzheng/9743872

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章