一.原生串口通讯

  • 原生的串口通信主要是控制器跟串口的设备或者传感器通信,不需要经过电平转换芯片来转换电平,直接就用TTL电平通信
  • 比如: GPS模块、GSM模块、串口转WIFI模块、HC04蓝牙模块

二. 串口与PC通讯

  • USB转串口主要用于设备跟电脑通信
  • 电平转换芯片一般有CH340、PL2303、CP2102、FT232
  • 使用的时候电脑端需要安装电平转换芯片的驱动

三. RS232标准串口通讯

  • RS232标准串口主要用于工业设备直接通信
  • 电平转换芯片一般有MAX3232,SP3232

四. STM32串口

1. 内部结构

寄存器 功能
TX 数据发送
RX 数据接收
SCLK 时钟,仅同步通信时使用(不常用)
nRTS 发送请求(不常用)
nCTS 允许发送 (不常用)

2. 串口引脚分布

注意:串口一是APB2总线, 其他是APB1总线

3. 串口引脚重定义

参见复用重映射和调试I/O配置寄存器(AFIO_MAPR)

4. 串口寄存器

(1). 串口数据寄存器 USART_DR

USART_DR, 9位有效
USART_DR一个地址对应了两个物理内存。包含一个发送数据寄存器TDR和一个接收数据寄存器RDR。

(2). 串口数据寄存器 USART_CR1 USART_CR2 用来配置串口

(3). 串口波特率寄存器USART_BRR

五. 串口相关结构体

1. 串口初始化结构体 USART_InitTypeDef

typedef struct
{uint32_t USART_BaudRate;            /*!< This member configures the USART communication baud rate.The baud rate is computed using the following formula:- IntegerDivider = ((PCLKx) / (16 * (USART_InitStruct->USART_BaudRate)))- FractionalDivider = ((IntegerDivider - ((u32) IntegerDivider)) * 16) + 0.5 */uint16_t USART_WordLength;          /*!< Specifies the number of data bits transmitted or received in a frame.This parameter can be a value of @ref USART_Word_Length */uint16_t USART_StopBits;            /*!< Specifies the number of stop bits transmitted.This parameter can be a value of @ref USART_Stop_Bits */uint16_t USART_Parity;              /*!< Specifies the parity mode.This parameter can be a value of @ref USART_Parity@note When parity is enabled, the computed parity is insertedat the MSB position of the transmitted data (9th bit whenthe word length is set to 9 data bits; 8th bit when theword length is set to 8 data bits). */uint16_t USART_Mode;                /*!< Specifies wether the Receive or Transmit mode is enabled or disabled.This parameter can be a value of @ref USART_Mode */uint16_t USART_HardwareFlowControl; /*!< Specifies wether the hardware flow control mode is enabledor disabled.This parameter can be a value of @ref USART_Hardware_Flow_Control */
} USART_InitTypeDef;
  • USART_BaudRate: 设置波特率,如9600,115200等
  • USART_WordLength: 设置数据长度。具体值:USART_WordLength_8b 或 USART_WordLength_9b
  • USART_StopBits: 设置停止位大小
  • USART_Parity: 奇偶校验
  • USART_Mode: 设置收发使能

发送接收都使能

USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //发送接收都使能

2.同步时钟初始化结构体 (用的少)

typedef struct
{uint16_t USART_Clock;   /*!< Specifies whether the USART clock is enabled or disabled.This parameter can be a value of @ref USART_Clock */uint16_t USART_CPOL;    /*!< Specifies the steady state value of the serial clock.This parameter can be a value of @ref USART_Clock_Polarity */uint16_t USART_CPHA;    /*!< Specifies the clock transition on which the bit capture is made.This parameter can be a value of @ref USART_Clock_Phase */uint16_t USART_LastBit; /*!< Specifies whether the clock pulse corresponding to the last transmitteddata bit (MSB) has to be output on the SCLK pin in synchronous mode.This parameter can be a value of @ref USART_Last_Bit */
} USART_ClockInitTypeDef;

六. 串口相关库函数

1. 串口初始化函数 USART_Init()

void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)

示例:

USART_InitStructure.USART_BaudRate=115200; //设置波特率
USART_InitStructure.USART_WordLength=USART_WordLength_8b; //设置数据长度
USART_InitStructure.USART_StopBits=USART_StopBits_1; //设置停止位长度
USART_InitStructure.USART_Parity=USART_Parity_No; //设置奇偶校验位
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //设置硬件流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //设置收发使能
USART_Init(USART2, &USART_InitStructure);
USART_Cmd(USART2, ENABLE);

2. 中断配置函数 USART_ITConfig()

void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState)

例:使能接受完毕中断USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

3. 串口使能函数 USART_Cmd

void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState)

4. 数据发送函数 USART_SendData()

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)

5. 数据接收函数 USART_ReceiveData

uint16_t USART_ReceiveData(USART_TypeDef* USARTx)

6.中断状态位获取函数 USART_GetITStatus

ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)

7. 编程方法

例子:

  • 完整的串口发送, 可以printf, 可以发送 8位字 16位半字节 字符串等

  • 中断接收功能 , 当有外部数据输入时会产生中断, 中断后将得到的 再发送出去,同时点亮RGB

  • 可以控制RGB灯的亮灭, PC端输入:0,1,2可以点亮RGB~

psb_usart.h文件(这个文件将5个串口都定义好了, 通过选择编译来确定串口)

#ifndef __BSP_USART_H
#define __BSP_USART_H#include "stm32f10x.h"
#include <stdio.h>//用哪个串口就把哪个置1
#define DEBUG_USART1     1
#define DEBUG_USART2     0
#define DEBUG_USART3     0
#define DEBUG_USART4     0
#define DEBUG_USART5     0#if DEBUG_USART1
// 串口1-USART1
#define  DEBUG_USARTx                   USART1
#define  DEBUG_USART_CLK                RCC_APB2Periph_USART1
#define  DEBUG_USART_APBxClkCmd         RCC_APB2PeriphClockCmd
#define  DEBUG_USART_BAUDRATE           115200// USART GPIO 引脚宏定义
#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOA)
#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd#define  DEBUG_USART_TX_GPIO_PORT       GPIOA
#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_9
#define  DEBUG_USART_RX_GPIO_PORT       GPIOA
#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_10#define  DEBUG_USART_IRQ                USART1_IRQn
#define  DEBUG_USART_IRQHandler         USART1_IRQHandler#elif DEBUG_USART2
//串口2-USART2
#define  DEBUG_USARTx                   USART2
#define  DEBUG_USART_CLK                RCC_APB1Periph_USART2
#define  DEBUG_USART_APBxClkCmd         RCC_APB1PeriphClockCmd
#define  DEBUG_USART_BAUDRATE           115200// USART GPIO 引脚宏定义
#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOA)
#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd#define  DEBUG_USART_TX_GPIO_PORT       GPIOA
#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_2
#define  DEBUG_USART_RX_GPIO_PORT       GPIOA
#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_3#define  DEBUG_USART_IRQ                USART2_IRQn
#define  DEBUG_USART_IRQHandler         USART2_IRQHandler#elif DEBUG_USART3
//串口3-USART3
#define  DEBUG_USARTx                   USART3
#define  DEBUG_USART_CLK                RCC_APB1Periph_USART3
#define  DEBUG_USART_APBxClkCmd         RCC_APB1PeriphClockCmd
#define  DEBUG_USART_BAUDRATE           115200// USART GPIO 引脚宏定义
#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOB)
#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd#define  DEBUG_USART_TX_GPIO_PORT       GPIOB
#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_10
#define  DEBUG_USART_RX_GPIO_PORT       GPIOB
#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_11#define  DEBUG_USART_IRQ                USART3_IRQn
#define  DEBUG_USART_IRQHandler         USART3_IRQHandler#elif DEBUG_USART4
//串口4-UART4
#define  DEBUG_USARTx                   UART4
#define  DEBUG_USART_CLK                RCC_APB1Periph_UART4
#define  DEBUG_USART_APBxClkCmd         RCC_APB1PeriphClockCmd
#define  DEBUG_USART_BAUDRATE           115200// USART GPIO 引脚宏定义
#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOC)
#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd#define  DEBUG_USART_TX_GPIO_PORT       GPIOC
#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_10
#define  DEBUG_USART_RX_GPIO_PORT       GPIOC
#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_11#define  DEBUG_USART_IRQ                UART4_IRQn
#define  DEBUG_USART_IRQHandler         UART4_IRQHandler#elif DEBUG_USART5
//串口5-UART5
#define  DEBUG_USARTx                   UART5
#define  DEBUG_USART_CLK                RCC_APB1Periph_UART5
#define  DEBUG_USART_APBxClkCmd         RCC_APB1PeriphClockCmd
#define  DEBUG_USART_BAUDRATE           115200// USART GPIO 引脚宏定义
#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD)
#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd#define  DEBUG_USART_TX_GPIO_PORT       GPIOC
#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_12
#define  DEBUG_USART_RX_GPIO_PORT       GPIOD
#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_2#define  DEBUG_USART_IRQ                UART5_IRQn
#define  DEBUG_USART_IRQHandler         UART5_IRQHandler#endifvoid USART_Config(void);
void Usart_SendByte(USART_TypeDef* pUSARTx, uint8_t data);
void Usart_SendHalfWord(USART_TypeDef* pUSARTx, uint16_t data);
void Usart_SendArray(USART_TypeDef* pUSARTx, uint8_t *array,uint8_t num);
void Usart_SendStr(USART_TypeDef* pUSARTx, char *str);
#endif  /* __BSP_USART_H */

psb_usart.c

#include "psb_usart.h"
static void NVIC_Config(void)
{NVIC_InitTypeDef NVIC_InitStruct;//中断初始化结构体NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//先设组NVIC_InitStruct.NVIC_IRQChannel = DEBUG_USART_IRQ;//中断源NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;//主优先级NVIC_InitStruct.NVIC_IRQChannelSubPriority=7;//从优先级NVIC_InitStruct.NVIC_IRQChannelCmd= ENABLE; //中断使能NVIC_Init(&NVIC_InitStruct); //中断初始化
}
void USART_Config(void)
{//0.变量定义区GPIO_InitTypeDef GPIO_InitStructure; //创建一个GPIO_InitTypeDef类型的数据USART_InitTypeDef USART_InitStruct;//串口初始化结构体//1.配置GPIODEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE); //开启时钟// 将USART Tx的GPIO配置为推挽复用模式GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);// 将USART Rx的GPIO配置为浮空输入模式GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);//2.初始化串口DEBUG_USART_APBxClkCmd(RCC_APB2Periph_USART1,ENABLE);USART_InitStruct.USART_BaudRate = DEBUG_USART_BAUDRATE; //波特率USART_InitStruct.USART_WordLength = USART_WordLength_8b;//8位数据为USART_InitStruct.USART_StopBits = USART_StopBits_1; //停止位1USART_InitStruct.USART_Parity = USART_Parity_No;  //无奇偶校验USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //发送接收都使能USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流 USART_Init(USART1, &USART_InitStruct);//初始化串口//3.中断配置NVIC_Config();// 使能串口接收中断USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);    //4. 使能串口USART_Cmd(DEBUG_USARTx, ENABLE);}
/*----------------------------------------------------------------------*/
//5. 编写发送函数//发送一个字节
void Usart_SendByte(USART_TypeDef* USARTx,uint8_t data)
{USART_SendData(USARTx, data);while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE)==RESET);
}
//发送两个字节
void Usart_SendHalfWord(USART_TypeDef* USARTx,uint16_t data)
{uint8_t tempH, tempL;tempL =  data & 0xFF;tempH =  (data>>8) & 0xFF;Usart_SendByte(USARTx,tempH);Usart_SendByte(USARTx,tempL);
}
//发送一个数组
void Usart_SendArray(USART_TypeDef* USARTx,uint8_t *array, uint8_t num)
{uint8_t i;for(i=0;i<num;i++){Usart_SendByte(USARTx,*array++);}while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
}
//发送一个字符串
void Usart_SendStr(USART_TypeDef* pUSARTx, char *str)
{uint8_t i=0;do{Usart_SendByte(pUSARTx, *(str+i));i++;}while(*(str+i) != '\0');while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TC) == RESET );
}//重定向c库函数printf到串口,重定向后可使用printf函数和putchar函数
int fputc(int ch, FILE *f)
{/* 发送一个字节数据到串口 */USART_SendData(DEBUG_USARTx, (uint8_t) ch);/* 等待发送完毕 */while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);     return (ch);
}/*----------------------------------------------------------------------*/
//6. 编写接收函数
uint16_t Rev_Byte(void)
{return USART_ReceiveData(DEBUG_USARTx);
}///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{/* 等待串口输入数据 */while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);return (int)USART_ReceiveData(DEBUG_USARTx);
}
/*----------------------------------------------------------------------*/

中断部分

#include "stm32f10x_it.h"
#include "psb_usart.h"
#include "led.h"//省略未修改内容void DEBUG_USART_IRQHandler(void)
{uint8_t ucTemp;if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET){       ucTemp = getchar();USART_SendData(DEBUG_USARTx,ucTemp); switch(ucTemp){case '0':LED_R(ON);LED_G(OFF);LED_B(OFF);break;case '1':LED_R(OFF);LED_G(ON);LED_B(OFF);break;case '2':LED_R(OFF);LED_G(OFF);LED_B(ON);break;default:LED_R(OFF);LED_G(OFF);LED_B(OFF);break;}}
}

main.c随便写

#include "stm32f10x.h"
#include "led.h"
#include "psb_usart.h"int main(void)
{uint8_t a[11]= {0,1,2,3,4,5,6,7,8,9,10};LED_GPIO_Config();USART_Config();LED_B(OFF);LED_R(OFF);LED_G(OFF);//Usart_SendByte(DEBUG_USARTx,0x08);//Usart_SendHalfWord(DEBUG_USARTx,0xabcd);//Usart_SendArray(DEBUG_USARTx, a,11);//Usart_SendStr(DEBUG_USARTx,"滚滚长江东逝水\n");//printf("浪花淘尽英雄~\n");printf("PC端输入:0,1,2可以点亮RGB~\n");
}

http://www.taodudu.cc/news/show-6366874.html

相关文章:

  • 关于MAX232芯片总是发热的问题
  • 【DSP】QA
  • 解决了一次模块间TTL串口不能通讯的问题
  • MAX232与MAX3232的区别
  • MAX3232芯片与stm32芯片通信硬件线路连接和引脚说明
  • 嵌入式学习笔记——STM32的USART通信概述
  • 记忆力减退之----SP3232---STM32
  • 自助式数据可视化BI工具的代表作云蛛系统的业务覆盖及客户
  • 外包公司
  • 大连云计算产业为10万中小企业建起“云平台”
  • 大连软交会开幕 人工智能成热点话题
  • 大连实习之报告总结——————我的感悟与收获
  • 云端开发“大连模式”已具雏形
  • 牛客网机试题
  • Oracle批量插入UUID数据
  • 华信培训1.17
  • sdi线缆标准_HD-SDI 高清视频同轴电缆
  • 线材-电子线载流能力
  • Apache2.2(OS 64)指定的网络名不再可用的处理
  • Apache报错指定的网络名不再可用解决方案
  • Shell脚本相关命令
  • 超实用的15个shell脚本,有手就会,拿走不谢
  • 离散数学 第六章 函数
  • 【LaTex】2.5 集合论
  • 离散数学 学习笔记-Day4
  • python实现阿列金分类法
  • 快鲸智慧社区平台:快速提升“智慧社区”服务水平
  • 无线网络技术—wimax技术
  • 关于无线
  • 什么是智慧社区 智慧社区解决方案概括

STM32一文通(8) 串口通讯相关推荐

  1. STM32 CubeIDE(九)串口通讯

    STM32 CubeIDE(九)串口通讯 串口通讯 串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式,电子工程师在 ...

  2. Arduino处理STM32中的多个串口通讯问题

    简 介: 对于在Arduino下开发STM32的程序,对于STM32所具有的三个硬件USART进行测测试.结果显示可以使用这些串口完成相应的数据的输入与输出.但是涉及到以下两个问题,还没有得到解决:问 ...

  3. STM32_USART 串口通讯详解

    对51单片机有了解的都知道51单片机的串口通讯工作原理,我们单片机使用的电平TTL电平,为了使我们的的单片机与PC进行通信,就需要一个电平转换芯片,把TTL电平转换为USB电平(使用的USB接口,如果 ...

  4. 《STM32从零开始学习历程》——USART串口通讯实验篇1——中断接收与发送

    <STM32从零开始学习历程>@EnzoReventon USART串口通讯实验篇1--中断接收与发送 最近开始接触了STM32F4xx系列单片机,对于我这个从零开始学习的小白来说,可谓困 ...

  5. stm32串口通讯问题

    stm32串口通讯问题 在串口试验中,串口通讯不正常,则可能会出现以下问题: 1. 配置完成后,串口没有任何消息打印. 原因:1,端口配置有问题,需要重新检查I/O口的配置 2,接线有问题,检查接线是 ...

  6. 串行口方式二 波特率_一文就能看懂“串口通讯”的概念、3个通讯方式、9大注意事项...

    串行通信是数据处理设备和外围设备之间最广泛使用的信息传输方法.每个设备可能是您的个人电脑或移动设备在运行串行协议.该协议是一种安全可靠的通信形式,由源主机(发送方)和目的主机(接收方)制定一套规则.为 ...

  7. STM32学习:串口通讯(proteus仿真)

    文章目录 前言 一.相关知识点 二.电路搭建与硬件配置 1.proteus电路搭建 1.COMPIM元件 2.VIRTUAL TERMINAL虚拟终端元件 3.整体电路: 2.CubeMx硬件电路配置 ...

  8. 迪文串口屏幕DMG10600T101_01WTR实现图片切换并和串口通讯

    1.我用的迪文屏幕,型号为DMG10600T101_01WTR,分辨率为1024*600,基本参数是10寸的,12V供电的电阻触摸屏,带两个串口通讯. 产品背面有一个电平切换的电阻,如下图,如果是用于 ...

  9. STM32的USART串口通讯程序(查询方式)

    STM32的USART串口通讯程序(查询方式) 文章目录 STM32的USART串口通讯程序(查询方式) 一.USART介绍 1.异步通信: 2.同步通信: 二.CubeMX创建项目 1.点击ACCE ...

最新文章

  1. 反爬虫——使用chrome headless时一些需要注意的细节
  2. B - Collisions
  3. oracle ssl发送邮件,使用javax.mail发送带有ssl的电子邮件
  4. 程序员高薪盛宴背后:程序员正在消失?
  5. 在 Mac OS X Lion 下修改 Hosts 的四种方法
  6. kafka分区停留在UnderReplicated状态
  7. java ajax 联动菜单_java结合jQuery.ajax实现左右菜单联动刷新列表内容
  8. dqn在训练过程中loss越来越大_深度强化学习——从DQN到DDPG
  9. url 编码 js url传参中文乱码解决方案
  10. 《神经网络与深度学习》课程笔记(2)-- 神经网络基础之逻辑回归
  11. 5.3 Zend_Log_Filter
  12. html 播放wav,js播放wav文件(源码)
  13. 阿里云短信发送SDK
  14. 前端技术-HTML5与CSS
  15. his系统管理工具配置服务器,HIS系统(his管理系统)V3.0.1 官网版
  16. java编程找出吸血鬼数字,Java 找到四位数的所有吸血鬼数字 基础代码实例
  17. “我36岁了,还得对28岁的领导赔笑脸”:中年人的职场,心酸自知
  18. Python被编进小学教材了?啥时纳入高考……
  19. Android Studio 报错提示:Skipped due to earlier error
  20. 傲腾+NVMe如何让VK节省数亿美元?

热门文章

  1. 微信小程序 识别身份证,银行卡
  2. 创新创业名词解释_“大众创业万众创新”相关名词解释总汇
  3. 麒麟 android os,华为自研麒麟OS国产手机系统却要继续用安卓,居然是这个原因!...
  4. mysql验证索引正确性_mysql索引测试
  5. 每个人的心里都有两头狼
  6. 消除QTreeWidgetItem外层虚线框
  7. oracle的时间各式,Oracle9i日期格式几点说明
  8. vue-tree-chart
  9. 基于分区表的物化视图快速刷新以及维护
  10. 芋道 Spring Boot 对象转换 MapStruct 入门