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

常用的串口相关寄存器

  • 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 查看已经成功启动

什么是真正的程序员?

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

为什么会出现docker

docker镜像,一次构建,到处运行

docker和虚拟机的区别

虚拟机缺点: docker和虚拟机的不同之处:

独立看门狗实验

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

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官方英文资源: docker官网:http://www.docker.com Docker windows入门:https://docs.docker.com/windows/ Docker Linux 入门:https://docs.docker.com/linux/ Docker mac 入门:https://docs.do…

STM32 通用定时器基本原理

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

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

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

STM32 定时器中断

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

Debian8.3.0下安装Odoo8.0步骤

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

STM32 PWM输出实验

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

docker镜像和容器区别

docker镜像 docker容器,容器是用镜像创建的运行实例

域名相关的一些基础知识

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

定时器输入捕获实验

输入捕获简介: 输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能。STM32 的输入捕获,简单的说就是通过检测 TIMx_CHx 上的边沿信号,在边沿信号发生跳变&a…

Linux查看内置命令和非内置命令帮助的几种方法(man、help、info)

❤️作者主页:IT技术分享社区 ❤️作者简介:大家好,我是IT技术分享社区的博主,从事C#、Java开发九年,对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉: 数据库领域优质创作者🏆&#x…