• 第七篇,STM32串口通信编程


    1.通信的基本概念

     

    (1)串行通信和并行通信

    (2)单工,半双工和全双工

     (3)通信速率

        单位时间内传输的比特数表示传输速度,叫做波特率(bps)

    (4)通信协议(串口)

        通信协议就是通信双方约定好的数据格式

    2.串口的硬件连接

        UART ----------------- 通用异步收发器

        USART --------------- 通用同步/异步收发器

    3.stm32的串口开发

    (1)原理图

    USB调试口连接到了CPU的PA9 PA10,它们具有串口复用的功能

    (2)CPU芯片手册

     

     

    (3)串口接口的编程实现

    在工程中添加串口库函数源码

    1)开启GPIOA和USART1的时钟

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

    2)将PA9 PA10配置为复用功能,并且映射到串口1

    GPIO_Init(...); GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);

    3)初始化串口

    void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct); 参数: USARTx - 哪个串口

    USART_InitStruct - 串口初始化结构

    typedef struct

    {

    uint32_t USART_BaudRate; /*!< 波特率 */

    uint16_t USART_WordLength; /*!< 数据位长度 @ref USART_Word_Length */

    uint16_t USART_StopBits; /*!< 停止位长度 @ref USART_Stop_Bits */

    uint16_t USART_Parity; /*!< 校验方式 @ref USART_Parity */

    uint16_t USART_Mode; /*!< 发送/接收模式 @ref USART_Mode */

    uint16_t USART_HardwareFlowControl; /*!< 硬件流控制 @ref USART_Hardware_Flow_Control */ } USART_InitTypeDef;

    4)使能串口

    USART_Cmd(USART1,ENABLE);

    5)数据的发送和接收

    发送:

    //轮询

    void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);

    //传入往哪个串口发送什么数据

    //每次发送前查询上一个数据是否发送完成

    FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);

    //传入哪个串口的什么标志,返回SET表示有该标志,返回RESET表示没有该标志

    //USART_FLAG_TC ----- 发送完成标志

    ———————————————————————————————————————————

    练习:

    实现串口1字符串的发送

    ———————————————————————————————————————————

    //功能函数代码

    1. #include <stm32f4xx.h>
    2. #include <usart.h>
    3. #include <stdio.h>
    4. #include <string.h>
    5. #include <includes.h>
    6. //stm32开发板上运行程序,如果主机运行了调试器,程序就会使用主机的输入输出设备
    7. //这是方式叫半主机模式,printf如果要通过串口打印,必须关闭半主机模式
    8. #pragma import(__use_no_semihosting)
    9. struct __FILE{
    10. int handle;
    11. };
    12. FILE __stdout;
    13. //定义_sys_exit函数避免使用半主机模式
    14. void _sys_exit(int x)
    15. {
    16. x = x;
    17. }
    18. //重定义fputc
    19. int fputc(int ch,FILE *F)
    20. {
    21. //等待上一个数据发送完成
    22. while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
    23. //发送
    24. USART_SendData(USART1,ch);
    25. return ch;
    26. }
    27. void usart1_init(void)
    28. {
    29. GPIO_InitTypeDef GPIO_InitStruct;
    30. USART_InitTypeDef USART_InitStruct;
    31. NVIC_InitTypeDef NVIC_InitStruct;
    32. //1.开启GPIOA和USART1时钟
    33. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
    34. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
    35. //2.配置PA9 PA10为串口功能
    36. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;//复用模式
    37. GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//推挽输出
    38. GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;//高速
    39. GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;//无上下拉
    40. GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
    41. GPIO_Init(GPIOA,&GPIO_InitStruct);
    42. GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
    43. GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
    44. //3.初始化串口 8N1
    45. USART_InitStruct.USART_BaudRate = 115200;//波特率
    46. USART_InitStruct.USART_WordLength = USART_WordLength_8b;//8位数据位
    47. USART_InitStruct.USART_StopBits = USART_StopBits_1;//1位停止位
    48. USART_InitStruct.USART_Parity = USART_Parity_No;//无校验
    49. USART_InitStruct.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;//发送接收模式
    50. USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件流控制
    51. USART_Init(USART1,&USART_InitStruct);
    52. //4.开启串口接收中断(清除中断标志)
    53. USART_ClearITPendingBit(USART1, USART_IT_RXNE);
    54. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    55. //5.初始化NVIC
    56. NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道
    57. NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x2;//抢占优先级
    58. NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x2;//响应优先级
    59. NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能
    60. NVIC_Init(&NVIC_InitStruct);
    61. //.使能串口
    62. USART_Cmd(USART1,ENABLE);
    63. }
    64. //发送一个字符(轮询)
    65. void uart1_putc(char ch)
    66. {
    67. //等待上一个数据发送完成
    68. while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
    69. USART_SendData(USART1,ch);
    70. }

  • 相关阅读:
    回归算法的评估指标
    C++ 运算符
    ROS2/DDS/QoS/主题的记录
    PCL直通滤波和统计滤波算法
    1.1 Metasploit 工具简介
    [附源码]计算机毕业设计微录播室预约管理系统Springboot程序
    华为ensp搭建VRRP主备份配置
    数据结构每日亿题(六)
    ES6学习24~47
    Kafka 为什么那么快?
  • 原文地址:https://blog.csdn.net/weixin_44651073/article/details/125609944