STM32F407 UART

//串口(UART)------------------------:
//1.同步:
        步调一致,两个设备之间的通信速度相同
//2.异步:
        步调不一致,两个设备之间的通信速度不相同

//总结:
        同步通信:有时钟线连接,并且时钟线可以控制两个设备之间的速度,让速度保持一致
        异步通信:没有时钟线连接,需要用户自行规定两个设备的数据传输速度

//单工、半双工、全双工:
        单工:  一根数据线,A与B之间单向传输
        半双工:  一根数据线,A传输给B结束后,B才能给A传输
        双工:  两根数据线,A与B之间能同时相互传递数据
        //说明:一般全双工通信都会有发送端(TX/TXD)和接收端(RX/RXD)
        //会有两根数据线负责数据传输发送要比接收先
        //UART全双工
        
//串行与并行:    数字量由0/1组成,数据一般以字节为单位,1byte=8bit
        串行:  数据一个一个发送
        并行:  多车道,多个数据同时发送
        
//UART:是一种异步全双工串行通信方式
//波特率公式:
            USARTDIV = Fck / (8*(2 - OVER8)) / 波特率;
            DIV_M = (u32)USARTDIV;
            DIV_F = (USARTDIV - DIV_M) * (8 * (2 - over8));


//USART1的初始化方法:
            /*
            函数功能:USART1初始化
            返回值:void
            形参:u32 bps(对应的波特率)
            函数说明:
            USART1_TX   ---  PA9  --- 复用模式
            USART1_RX   ---  PA10  --- 复用模式
            低位复用寄存器:GPIOA->AFR[0]
            高位复用寄存器:GPIOA->AFR[1]
            */


            {
                float USARTDIV = 0;
                u32 DIV_M,DIV_F;
    
                //打开GPIOA的时钟、Usart1的时钟
    
                //PA9、PA10初始化
                1.清零
                2.打开配置模式为复用
    
                //配置复用关系
                根据映射分别配置USART1的TX与RX(AFR)
    
                //USART1初始化
                1.SR
                2.CR1
                3.CR2
    
                //计算波特率
                USARTDIV = 84000000.0 / (8*(2 - OVER8)) / bps;
                DIV_M = (u32)USARTDIV;//强转为整型
                DIV_F = (USARTDIV - DIV_M) * (8 * (2 - OVER8));//小数部分
                USART1->BRR |= DIV_M << 4 | DIV_F;//设置BRR寄存器
    
                //使能USART1
                USART1->CR1 |= 1 << 13;//使能串口1(CR1中)
            }

//发送一字节函数:
/*
    函数功能:发送一字节数据
    返回值:void
    形参:u8 data
    函数说明:
    1.等待数据可以发送
    2.发送数据
*/
void usart1_send_byte(u8 data)
{
    while(!(USART1->SR & 1 << 7));
        
    USART1->DR = data;
}

//接收一字节函数:
/*
    函数功能:接收一字节数据
    返回值:u8
    形参:void
    函数说明:
    1.等待数据可以接收
    2.接收一字节数据
*/
u8 usart1_rec_byte(void)
{
    while(!(USART1->SR & 1 << 5));
    
    return USART1->DR;
}

//发送一字符串数据:
/*
    函数功能:发送一个字符串
    返回值:void
    形参:u8 *str
    函数说明:
    通过while循环,按字节一字节一字节发送字符串,最后在末尾补'\0'
*/
void usart1_send_str(u8 *str)
{
    while(*str != '\0')
    {
        usart1_send_byte(*str);
        str++;     //按字节偏移
    }
    
    usart1_send_byte('\0');     //字符串末尾补零
}


//接收一个字符串数据:
/*
    函数功能:接收一个字符串
    返回值:void
    形参:u8 *str
    函数说明:
    通过为while(1)一字节一字节循环接收数据,在遇到'\r'或'\n'之前结束循环,最后在末尾补0
*/
void usart1_rec_str(u8 *str)
{
    u8 a;
    
    while(1)
    {
        *str = usart1_rec_byte()
        if(*str == '\r')
        {
            break;  
        }
        str++;
    }
    
    *str = '\0';
    a = usart1_rec_byte();     //将末尾的'\n'接收到一个字符中,不然会出错
}

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值