串口通信寄存器/库函数配置、实例编写

常用的串口相关寄存器

  • USART_SR状态寄存器
  • USART_DR数据寄存器
  • USART_BRR波特率寄存器

串口操作相关库函数(省略入口参数):

void USART_Init(); //串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能
void USART_Cmd();//使能串口
void USART_ITConfig();//使能相关中断void USART_SendData();//发送数据到串口,DR
uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据FlagStatus USART_GetFlagStatus();//获取状态标志位
void USART_ClearFlag();//清除状态标志位
ITStatus USART_GetITStatus();//获取中断状态标志位,若有数据到来则返回一。
void USART_ClearITPendingBit();//清除中断状态标志位

在这里插入图片描述

FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
例如我们要判断读寄存器是否非空(RXNE),操作库函数的方法是:
USART_GetFlagStatus(USART1, USART_FLAG_RXNE);
我们要判断发送是否完成(TC),操作库函数的方法是:
USART_GetFlagStatus(USART1, USART_FLAG_TC);

在这里插入图片描述

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);

在这里插入图片描述

void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);

波特率计算方法:

在这里插入图片描述在这里插入图片描述
串口配置的一般步骤

  • 串口时钟使能,GPIO时钟使能,都是这一个函数:
RCC_APB2PeriphClockCmd();
  • 串口复位:
USART_DeInit(); 这一步不是必须的
  • GPIO端口模式设置:
GPIO_Init(); 
TX的模式设置为GPIO_Mode_AF_PP
RX的模式设置为浮空输入( GPIO_Mode_IN_FLOATING)
或带上拉输入(GPIO_Mode_IPU)
  • PS :外设的GPIO的MODE配置:
    在这里插入图片描述

  • 串口参数初始化:

USART_Init();
这个函数的第一个入口参数是指定初始化的串口标号,这里选择 USART1。
第二个入口参数是一个 USART_InitTypeDef 类型的结构体指针,这个结构体指针的成员变量用
来设置串口的一些参数。一般的实现格式为:
USART_InitStructure.USART_BaudRate = bound; //波特率设置;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为 8 位数据格式
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(USART1, &USART_InitStructure); //初始化串口从上面的初始化格式可以看出初始化需要设置的参数为:波特率,字长,停止位,奇偶校验位,
硬件数据流控制,模式(收,发)。我们可以根据需要设置这些参数。
  • 开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)
 NVIC_Init();USART_ITConfig();
  • 使能串口:
USART_Cmd();
  • 编写中断处理函数:
USARTx_IRQHandler();
  • 串口数据收发:
void USART_SendData();//发送数据到串口,DR
uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据
  • 串口传输状态获取:
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);

USART.h部分代码:

#ifndef __UART_H
#define __UART_H
#include "stm32f10x.h"void My_Usart_Init(void);//串口、GPIO、中断初始化函数
void USART1_IRQHandler(void);//中断函数#endif

USART.c部分代码:

#include "USART.h"
void My_Usart_Init(void)
{USART_InitTypeDef USART_InitStrue;GPIO_InitTypeDef GPIO_InitSture;NVIC_InitTypeDef NVIC_InitSture;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIOA时钟使能RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//串口时钟使能USART_DeInit( USART1);//串口复位GPIO_InitSture.GPIO_Pin=GPIO_Pin_9;GPIO_InitSture.GPIO_Mode=GPIO_Mode_AF_PP;//设置GPIOA.9的模式是复用推挽输出GPIO_InitSture.GPIO_Speed=GPIO_Speed_10MHz;GPIO_Init(GPIOA,&GPIO_InitSture);//GPIO初始化GPIO_InitSture.GPIO_Pin=GPIO_Pin_10;GPIO_InitSture.GPIO_Mode= GPIO_Mode_IN_FLOATING;//设置GPIOA.10的模式是浮空输入GPIO_InitSture.GPIO_Speed=GPIO_Speed_10MHz;GPIO_Init(GPIOA,&GPIO_InitSture);//GPIO初始化USART_InitStrue.USART_BaudRate=115200;//波特率115200USART_InitStrue.USART_WordLength=USART_WordLength_8b;//8个数据位USART_InitStrue.USART_StopBits=USART_StopBits_1;//一个停止位USART_InitStrue.USART_Parity=USART_Parity_No;//无奇偶校验位USART_InitStrue.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//收发模式USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_Init(USART1,&USART_InitStrue);//串口初始化USART_Cmd(USART1,ENABLE);//串口使能USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启接收中断,第一个参数是要使能哪个串口的中断。//第二个参数是确定使能中断的类型USART_IT_RXNE是接收缓冲区非空//当接受缓冲区非空的时候触发中断,TC是发送完成触发中断NVIC_InitSture.NVIC_IRQChannel=USART1_IRQn;//指出是哪一个通道(在stm32f10x.h中可查看通道)NVIC_InitSture.NVIC_IRQChannelCmd=ENABLE;NVIC_InitSture.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitSture.NVIC_IRQChannelSubPriority=1;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断设置分组NVIC_Init(&NVIC_InitSture);//中断初始化
}void USART1_IRQHandler(void)//中断函数
{u8 read;if(USART_GetITStatus(USART1,USART_IT_RXNE)){read=USART_ReceiveData(USART1);//读取数据USART_SendData(USART1,read);}
}

main.c部分代码:

#include "stm32f10x.h"
#include "USRT.h"int main(void)
{	My_Usart_Init();while(1);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272328.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用docker安装Mongodb

下载mongo3.2的docker镜像: docker pull mongo:3.2 使用docker命令启动: docker run -p 27017:27017 --name mongo \ -v /mydata/mongo/db:/data/db \ -d mongo:3.2 查看已经成功启动

移动端meta标签

现在的手机或平板电脑等移动设备上的浏览器默认都有双击放大的设置&#xff0c;如何阻止双击放大&#xff1f;user-scalableno <!-- 禁止缩放 --> <meta name”viewport” content”widthdevice-width,initial-scale1.0,maximum-scale1.0,user-scalableno”> <!…

正点原子stm32--串口通信实验讲解里关于USART_RX_STA的问题与思考

这篇博文讲的挺详细的可以参考以下&#xff1a; USART_RX_STA详解

什么是真正的程序员?

什么是真正的程序员 这篇文章的原文来自&#xff1a;A Little Printf Story作者仿照《小王子》中的情节&#xff0c;通过小printf遇见的不同类型的程序员&#xff0c;最后悟出什么才是真正的程序员&#xff01;第一次翻译有很多不妥&#xff0c;欢迎留言指正。 文章略长&#x…

为什么会出现docker

docker镜像&#xff0c;一次构建&#xff0c;到处运行

docker和虚拟机的区别

虚拟机缺点&#xff1a; docker和虚拟机的不同之处&#xff1a;

独立看门狗实验

为什么要看门狗 在由单片机构成的微型计算机系统中&#xff0c;由于单片机的工作常常会受到来自外界电磁场的干扰&#xff0c;造成程序的跑飞&#xff0c;而陷入死循环&#xff0c;程序的正常运行被打断&#xff0c;由单片机控制的系统无法继续工作&#xff0c;会造成整个系统…

Manthan, Codefest 16

暴力 A - Ebony and Ivory import java.util.*; import java.io.*;public class Main {public static void main(String[] args) {Scanner cin new Scanner (new BufferedInputStream (System.in));int a cin.nextInt ();int b cin.nextInt ();int c cin.nextInt ();for…

docker资源

Docker资源 Docker官方英文资源&#xff1a; docker官网&#xff1a;http://www.docker.com Docker windows入门&#xff1a;https://docs.docker.com/windows/ Docker Linux 入门&#xff1a;https://docs.docker.com/linux/ Docker mac 入门&#xff1a;https://docs.do…

ios apple pay 证书配置

一 环境配置 需要开发者账号 开发者中心https://developer.apple.com/membercenter/index.action 添加一个APP IDs二&#xff0e;配置Merchant IDs商业ID 下面进行appids和商业id的绑定 之后在回到appids中查看id中的apple pay&#xff0c;发现已经变为可使用状态了 接下来是为…

STM32 通用定时器基本原理

STM32F10x系列总共最多有8个定时器&#xff1a; 三种STM32定时器区别&#xff1a; 通用定时器功能特点描述&#xff1a; ①、 STM32 的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定时器功能特点包括&#xff1a; 位于低速的APB1总线上(时钟来源可以是APB1的时钟) 16 位向上、向…

初识-Android之智能短信项目相关技术整理

标签页切换采用传统的TabHost&#xff1a; 采用TabActivty实现TabHost。 效果图-后补&#xff1a; 相关技术详解推荐&#xff1a; http://blog.csdn.net/zhouli_05/article/details/7696054 这里我解决了一个TabActivity和子Activity共享TabActivity的OptionMenu的问题&#xf…

STM32 定时器中断

通用定时器工作过程&#xff1a; 时钟选择&#xff1a; 计数器时钟可以由下列时钟源提供&#xff1a; 内部时钟(CK_INT)外部时钟模式1&#xff1a;外部输入脚(TIx)外部时钟模式2&#xff1a;外部触发输入(ETR)内部触发输入(ITRx)&#xff1a;使用一个定时器作为另一个定时器…

Debian8.3.0下安装Odoo8.0步骤

Debian8.3.0下安装Odoo8.0的方法 假设你已经安装好了Debian 系统&#xff0c;使用root帐号执行如下命令 # apt-get update && apt-get upgrade # Install system updates # apt-get install sudo # Make sure sudo is installed 使用如下命令来创建一个Odoo用户&am…

STM32 PWM输出实验

定时器用来产生PWM输出&#xff1a; STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出&#xff0c;这样&#xff0c;STM32 最多可以同时产生…

docker镜像和容器区别

docker镜像 docker容器&#xff0c;容器是用镜像创建的运行实例

域名相关的一些基础知识

DNS DNS&#xff0c;Domain Name System或者Domain Name Service(域名系统或者域名服务)。域名系统为Internet上的主机分配域名地址和IP地址。由于网络中的计算机都必须有个IP地址&#xff0c;这样相互之间才能通信&#xff0c;但让我们记住一大串的IP地址来访问网站显然是不可…