找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2604|回复: 0
打印 上一主题 下一主题
收起左侧

STM8L051F3 寄存器版 串口驱动

[复制链接]
跳转到指定楼层
楼主
ID:46381 发表于 2019-3-9 20:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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 长茺
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空闲状态为高电平,如果不设置,会莫名奇妙的发送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      这个要搞懂
    //如果需要使用其他引脚作为串口发送接收引脚,请在这里选择

}
void UART1_CLK_EN()
{
  CLK_PCKENR1_PCKEN15=1;//开启USART外设时钟
}
void UART1_CLK_DIS()
{
  CLK_PCKENR1_PCKEN15=0;//开启USART外设时钟
}
void UART1_Mode_Config()
{

    //设置串口工作方式

    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 =0x03;//the BRR2 should be programmed before BRR1

    USART1_BRR1 =0x68;

    USART1_CR2_TEN=1;//使能发送
//    USART1_CR2_TIEN=0;//打开发送中断
    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  发送 接收 接收中断
  UART1_NVID_Config();
}
void Uart1_Send_Data(unsigned char  data)
{
  while(0       ==      USART1_SR_TXE);        //判断发送数据寄存器是否为空
  USART1_DR     =       data;                //向发送寄存器写入数据  
}
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空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表