找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STM32串口学习_01 -CPU小白

[复制链接]
跳转到指定楼层
楼主
一.STM32串口介绍     
   a.串口的数据包格式为 起始位+数据位+校验位+停止位,所以一般需要设置数据位为8,校验位为1,停止位为1。我们再发送过程中只发送数据,其他的都由硬件来完成了,所以通信的双方在数据包格式配置相同时才能正确通信。
   b.除去数据包格式设置一样外,因为串口大多数都是用异步通信,由于没有时钟信号,所以2个通信设备需约定好波特率,常见的有4800、9600、115200等,波特率一致时才能正确通信。
   c.stm32的库文件中将这些需要配置的参数都写在了USART_InitTypeDef 结构体中,我们只要对其进行赋值,再调用函数USART_Init(),USART_Init函数会将USART_InitTypeDef 结构体中的数据写入相应的寄存器,这样就完成了对32串口的配置。

二.串口初始化(统一初始化)
   a.串口配置时,只有少数值需要时常更改,大部分都是重复内容,因此将常用的这些值做为参数传入。这样调用一个函数可以对所有的串口进行赋值。(串口使用的GPIO在后续的文章中统一配置)借鉴前辈的代码。
   b.串口初始化流程   开外设时钟->配置引脚(统一配置)->配置参数 ->使能中断 ->使能串口

void User_Usart_Init(USART_TypeDef* USARTx, u32 BaudRate, u16 WordLength, u16 StopBits, u16 Parity)
{
    USART_InitTypeDef USART_InitStructure;
    USART_ClockInitTypeDef USART_ClockInitStructure ;

    if(USARTx == USART1)
    {
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);// Enable USART1使能或者失能APB2外设时钟  高速72MHz
    }
    else if(USARTx == USART2)
    {
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//  Enable USART2使能或者失能APB1外设时钟    低速36MHz
    }
    else if(USARTx == USART3)
    {
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//  Enable USART3使能或者失能APB1外设时钟    低速36MHz
    }
    else if(USARTx == UART4)
    {
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE);//  Enable USART4使能或者失能APB1外设时钟    低速36MHz
    }
    else if(USARTx == UART5)
    {
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5,ENABLE);//  Enable USART5使能或者失能APB1外设时钟    低速36MH
    }

    USART_DeInit(USARTx);

    USART_InitStructure.USART_BaudRate = BaudRate;               //波特率
    USART_InitStructure.USART_WordLength = WordLength;        //数据长度
    USART_InitStructure.USART_StopBits = StopBits;                  //一个停止位
    USART_InitStructure.USART_Parity = Parity;                         //无校验
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //禁止硬件流控制
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //Receive and transmit enabled
    USART_Init(USARTx, &USART_InitStructure);                        // Configure the USART1
   
    USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;        //USART Clock disabled
    USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;            //USART CPOL: Clock is active low
    USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;         //USART CPHA: Data is captured on the second edge
    USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;     //USART LastBit: The clock pulse of the last data bit is not output to the SCLK pin
    USART_ClockInit(USARTx, &USART_ClockInitStructure);
    USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE);                  //允许接收寄存器非空中断
    USART_Cmd(USARTx, ENABLE);                                                // Enable USARTx
}

三.拓展待完成
    a.关于不同的芯片串口的数量不同,此时可以使用#ifdef和#endif来解决此问题。
    b.以下程序只是测试使用,代码较乱,串口中断部分,文章借用了正点原子的串口中断部分。
    c.会分三部记录串口的日常使用,后两部分为中断以及读书的记录,会在第三部分完善代码并上传
    d.第一次发帖记录学习,不恰当的地方一起讨论学习。

代码下载: 测试.7z (174.09 KB, 下载次数: 5)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:73435 发表于 2021-7-29 09:35 | 只看该作者
有很多STM32的例程,官方的库也提供了串口示例,看一看例程自己在敲几遍就会了,串口配置不是一个init就可以的,还有时钟,io,中断等相关的都要配置。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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