STM8L的USART1串口通信詳解 含例程

STM8L除了可以進行串口通信,還可支持紅外通信,智能卡協議,這些功能後續會開發,發佈程序源碼。STM8L還可以使用DMA緩存數據,減少CPU負擔,爲了簡單起見,本文沒有用到DMA功能。

只需要簡單的配置發送的字長度,停止位數,波特率,打開發送接收,就可以進行串口數據收發。下圖爲串口發送數據流程。
對於串口發送數據,需要注意的是,打開發送後,數據發送完成,如果不關閉中斷,程序會一直進入中斷。所以在確保數據發送完成後,需關閉中斷,退出發送數據。
本文通過週期性(500ms)的向上位機發送一組數據,來演示STM8L的串口通信。串口接收部分程序也已經調試好,只需把while循環中的程序註釋掉,設置斷點,查看上位機發送來的數據即可。
下圖爲串口助手接收到STM8L每隔500ms發送過來的一組數據。

/****************************************************************************************

*開發環境:IAR for stm8 v1.40.1

*硬件平臺:STM8L-DISCOVERY

*功能說明:每隔500ms通過PC3引腳向上位機發送一組數據。串口配置爲:波特爲9600,8個數據位,1個停止位,無奇偶校驗。

*作    者:茗風

****************************************************************************************/


#include"iostm8l152c6.h"

#include"stdbool.h"

#include"stdint.h"


#define TXBUF_SIZE 9

#define RXBUF_SIZE 25

bool bTX_finished=false;

bool bRX_finished=false;//串口接收完一幀數據標誌位

uint8_t ui8TX_number = 0;

uint8_t ui8RX_counter=0;

uint8_t ui8TX_buffer[TXBUF_SIZE]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99};

uint8_t ui8RX_buffer[RXBUF_SIZE];

/******************************************************************************************************

*  名    稱:void delay_10ms(uint8_t x_ms)

*  功    能:延時10ms

*  入口參數:無

*  出口參數:無

*  說    明:

*  範    例:無

******************************************************************************************************/

void delay_100ms(void)

{

  uint8_t i,j;

  for(i=0;i<255;i++)//2*255個指令週期

    for(j=0;j<255;j++);//2*255個指令週期

  //delay_10ms共消耗 x_ms*2*255+2*x_ms個指令週期  

  //255*2*255+2*255=130610us=130ms

  //此延時函數,延時時間爲130ms

  //16M/8/2=1M 一個指令週期爲1us

}


/******************************************************************************************************

* 名             稱:void UART_Init(void)

* 功            能:UART定時器初始化系統

* 入口   參數:無

* 出口   參數:無

* 說       明:UART初始化爲 9600 1 8 n

* 範      例:無

******************************************************************************************************/

void UART_Init(void)

{

    /*********************************/

    PC_DDR_DDR2 =0;//輸入

    PC_CR1_C12  =1;//上拉輸入

    PC_CR2_C22 =0;

    

    PC_ODR_ODR3 =1;

    PC_CR1_C13  =1;//推輓輸出

    PC_CR2_C23  =1;//輸出擺率10M    

    PC_DDR_DDR3 =1;//輸出高電平,TX空閒狀態爲高電平,如果不設置,會莫名奇妙的發送0x00

    


    CLK_PCKENR1_PCKEN15=1;//開啓USART外設時鐘

    

    //開啓引腳的UART功能

    //00: USART1_TX on PC3 and USART1_RX on PC2

    //01: USART1_TX on PA2 and USART1_RX on PA3

    //10: USART1_TX on PC5 and USART1_RX on PC6

    SYSCFG_RMPCR1_USART1TR_REMAP =0;//PC2,PC3

    //如果需要使用其他引腳作爲串口發送接收引腳,請在這裏選擇

    

    

    //設置串口工作方式

    USART1_CR1_M =0;//1 start bit,8 data bit,n stop bit

    USART1_CR3_STOP0=0;USART1_CR3_STOP1=0;//1 stop bit

    //設置波特率

    //波特率設置爲9600

    // 2000000/9600=208    //2000000是此時系統的主時鐘頻率,默認8分頻,16M/8=2M

    //208(DEC)=00D0(HEX)

    USART1_BRR2 =0x00;//the BRR2 should be programmed before BRR1

    USART1_BRR1 =0x0D;


//    USART1_CR2_TEN=0;//使能發送

//    USART1_CR2_TIEN=0;//打開發送中斷

    USART1_CR2_REN=1;//使能接收

    USART1_CR2_RIEN=1;//打開接收中斷

}

void main(void)

{

//  GPIO_Init();

  UART_Init();

  asm("rim");               //enable interrupts

  while(1)

  {

    ui8TX_number=9;

    USART1_CR2_TEN=1;//打開發送

    USART1_CR2_TIEN=1;//打開發送中斷

    delay_100ms();

    delay_100ms();

    delay_100ms();

    delay_100ms();

//    asm("wfi");

  }

}

/*************************************************************************************************** ***

* 名 稱: UART_OnTx()

* 功 能: UART的Tx事件處理函數

* 入口參數:無

* 出口參數:無

* 說 明:發送ui8TX_buffer數組中的數據,發送完成後,置位bTX_finished標誌位,下一次進入中斷後關閉發送

* 範 例:無

******************************************************************************************************/


#pragma vector=USART_T_TXE_vector

__interrupt void USART_TX_ISR (void)

{

  static uint8_t cnts=0;

  if(bTX_finished && USART1_SR_TC==1)

  {

    bTX_finished=false;

    USART1_CR2_TIEN=0;//關閉發送中斷

    USART1_CR2_TEN=0;//關閉發送

  }

  else if(USART1_SR_TC==1)

  {

    USART1_DR=ui8TX_buffer[cnts++];

    if(cnts==ui8TX_number)

    {

      cnts=0;

      bTX_finished=true;

    }

  }

}

/******************************************************************************************************

* 名               稱: UART_OnRx()

* 功         能: UART的Tx事件處理函數

* 入口           參數:無

* 出口           參數:無

* 說               明: 

* 範              例:無

******************************************************************************************************/

#pragma vector=USART_R_RXNE_vector

__interrupt void USART_RX_ISR(void)

{

  static uint8_t ui8RX_temp=0;

  if(USART1_SR_RXNE==1)

  {

    ui8RX_temp = USART1_DR;

  }

}

 

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