找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3341|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STM8L051F3 寄存器版 串口驅(qū)動(dòng)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:46381 發(fā)表于 2019-3-9 20:25 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include "Config.h"


u8 Uart_Receive_Flag=0;
u8 Uart_Send_len=0;
u16 Uart_Receive_len=0;
u8 Uart_Receive_Ack_len=0;      //期望 接收到的ACK 長(zhǎng)茺
u8 Uart_Send_Buf[UART_SEND_LEN];     
u8 Uart_Receive_Buf[UART_RECEIVE_LEN];

void UART1_IO_Config(void)
{

  PA_DDR_DDR3 =0;//輸入
  PA_CR1_C13  =1;//上拉輸入
  PA_CR2_C23 =0;


  PA_ODR_ODR2 =1;
  PA_CR1_C12  =1;//推挽輸出
  PA_CR2_C22  =1;//輸出擺率10M   
  PA_DDR_DDR2 =1;//輸出高電平,TX空閑狀態(tài)為高電平,如果不設(shè)置,會(huì)莫名奇妙的發(fā)送0x00


    //開啟引腳的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 =1;//PC2,PC3      這個(gè)要搞懂
    //如果需要使用其他引腳作為串口發(fā)送接收引腳,請(qǐng)?jiān)谶@里選擇

}
void UART1_CLK_EN()
{
  CLK_PCKENR1_PCKEN15=1;//開啟USART外設(shè)時(shí)鐘
}
void UART1_CLK_DIS()
{
  CLK_PCKENR1_PCKEN15=0;//開啟USART外設(shè)時(shí)鐘
}
void UART1_Mode_Config()
{

    //設(shè)置串口工作方式

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

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

    //設(shè)置波特率

    //波特率設(shè)置為9600

    // 2000000/9600=208    //2000000是此時(shí)系統(tǒng)的主時(shí)鐘頻率,默認(rèn)8分頻,16M/8=2M

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

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

    USART1_BRR1 =0x68;

    USART1_CR2_TEN=1;//使能發(fā)送
//    USART1_CR2_TIEN=0;//打開發(fā)送中斷
    USART1_CR2_REN=1;//使能接收.
    USART1_CR2_RIEN=1;//打開接收中斷

}
void UART1_NVID_Config()
{


}

void UART1_Config()
{  
  UART1_IO_Config();
  UART1_CLK_EN();
  UART1_Mode_Config();// 9600 8 1  發(fā)送 接收 接收中斷
  UART1_NVID_Config();
}
void Uart1_Send_Data(unsigned char  data)
{
  while(0       ==      USART1_SR_TXE);        //判斷發(fā)送數(shù)據(jù)寄存器是否為空
  USART1_DR     =       data;                //向發(fā)送寄存器寫入數(shù)據(jù)  
}
void Uart1_Send_String(u8 *data,u8 len,u8 enter_en)
{

u8 i=0;

for(i=0;i<len;i++)
{
  Uart1_Send_Data(data[i]);
}
if(ENTER_EN          ==     enter_en )
{
  Uart1_Send_Data(0x0D);
  Uart1_Send_Data(0x0A);
}
}
void UART_Receive_Buf_Clear()
{

  Uart_Receive_len      =       0;
  Uart_Receive_Flag     =       0;
}
void Send_ADC_Value(void)
{
  Uart1_Send_String("val= ",5,ENTER_DIS);
  Uart1_Send_Data(VDD_Value1/10 +0x30);
  Uart1_Send_Data(VDD_Value1%10 +0x30);
  Uart1_Send_String("V",1,ENTER_EN);
}




#pragma vector=USART_T_TXE_vector

__interrupt void USART_TX_ISR (void)

{
  if(USART1_SR_TC==1);


}


#pragma vector=USART_R_RXNE_vector

__interrupt void USART_RX_ISR(void)

{
  u8 ch;
  if(1  ==      USART1_SR_RXNE)

  {
     Uart_Receive_Flag          |=       TRUE;
     if(0x8000    !=      (Uart_Receive_len&0x8000))
     {
        Uart_Receive_Buf[Uart_Receive_len++]        =       USART1_DR;
        if((Uart_Receive_len>=UART_RECEIVE_LEN)||(Uart_Receive_len>=Uart_Receive_Ack_len))
        {
          Uart_Receive_len     |=      0x8000;
        }
     }
     else
     {
      ch        =       USART1_DR;
     }
  }


}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表