STM8S103之串口查詢發送+中斷髮送

 

本篇博文最後修改時間:2017年08月04日 18:29。

 

一、簡介

本文以STM8S103F3P6編程爲例,介紹STM8S103F3P6串口中斷髮送。

 

二、實驗平臺

電腦平臺:Windows7 64位旗艦

編譯軟件:IAR

硬件平臺:STM8S103F3P6

 

三、版權聲明

博主:_懵懂

聲明:此博客僅供參考不做任何商業用途,最終解釋權歸原博主所有。

原文地址:http://blog.csdn.NET/qq_18842031

懵懂之MCU交流羣:136384801

 

四、實驗前提

1、在進行本文步驟前,請先安裝IAR  EWSTM8-EV-1311版本;準備好STM8S103F3P6硬件平臺。

         

五、基礎知識

暫無

 

六、源碼地址

暫無

 

七、實驗內容

1.系統時鐘初始化爲內部16M

  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);    //時鐘   初始化時鐘爲1分頻 16M   2分頻8M

 

2.初始化串口

void Init_UART1(void)
{
  UART1_DeInit();                            //恢復串口所有寄存器
  UART1_Init((u32)9600,                      //波特率9600
             UART1_WORDLENGTH_8D,            //8位
             UART1_STOPBITS_1,               //停止位1
             UART1_PARITY_NO,               
             UART1_SYNCMODE_CLOCK_DISABLE,   
             UART1_MODE_TXRX_ENABLE);
  UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);  //使能接收中斷
//  UART1_ITConfig(UART1_IT_TC, ENABLE);       //使能發送中斷  發送中斷使能是那裏需要才使能
  UART1_Cmd(ENABLE);
}

 

3.編寫查詢方式發送數據入口

void UART1_Send(uint8_t *dat,uint8_t len)
{
  uint8_t i = 0;
  for(i=0; i<len; i++)
  {
    while(( UART1_GetFlagStatus(UART1_FLAG_TXE)==RESET));
    UART1_SendData8(*dat++);
  }
}

 

4.編寫中斷方式發送數據入口

uint8_t Rxd_buf[20];       //接收數組
uint8_t Rxd_len;            //接收長度
uint8_t Rxd_F;              //接收標誌位
uint8_t Txd_buf[20];       //發送數組
uint8_t Txd_len;            //發送長度
uint8_t Txd_F;              //發送標誌位

void Send(uint8_t dat)
{
  while(( UART1_GetFlagStatus(UART1_FLAG_TXE)==RESET));
    UART1_SendData8(dat);
}
uint8_t Set_UART1Interrupt(uint8_t *lV_dat,uint8_t lV_len)
{
  if(Txd_len != 0)
  {
    return FALSE;
  }
  
  for(Txd_len=0;Txd_len <lV_len;Txd_len++)  //將數據裝到全局變量中
    Txd_buf[Txd_len]=lV_dat[Txd_len];
  
  UART1_ITConfig(UART1_IT_TC, ENABLE);       //使能發送中斷  
  return TRUE;
}

 

5.編寫主函

void main(void)  
{
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);    //內部時鐘16M
  Init_UART1();
  enableInterrupts();
  UART1_Send("Hi\n",3);                //查詢發送
  Set_UART1Interrupt("Hello\n",6);     //中斷髮送數據
  while(1);
}

 

6.編寫中斷服務函數

 INTERRUPT_HANDLER(UART1_TX_IRQHandler, 17)
 {
  static uint8_t lV_num;              //記錄已經發送數據的長度
  
  Send(Txd_buf[lV_num++]);
  if(lV_num == Txd_len)                      //發送數據的長度和需要發送數據的長度相等  就關閉發送中斷
  {
    lV_num = 0;
    (void) memset(Txd_buf,0,Txd_len);
    Txd_len = 0;
    UART1_ITConfig(UART1_IT_TC, DISABLE);       //禁止發送中斷  
  }
  return; 
 }

 

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