任何USART通信,需要用到2个对外连接的引脚:RxD,TxD;

 RxD是输入引脚,用于串行数据接收;

 TxD是输出引脚,用于串行数据发送;

SCLK引脚:发生器时钟输出(同步模式下,异步模式下不需要)

  在IrDA模式(红外模式)下需要下列引脚:

    IrDA_RDI: 红外模式下的数据输入;

    IrDA_TDO:红外模式下的数据输出;

  调制解调模式下需要:

    nCTS:清除发送;

    nRTS:发送请求;

数据的接收/发送过程示意图:

  

异步串行通信协议需要定义以下5个内容:

  1、起始位  2、数据位(8/9位,9位的话包含奇偶校验位,8位一字节)

  3、奇偶校验位(第9位)

  4、停止位(1、1.5、2位)

  5、波特率设置(速度,波特率决定移位寄存器速度)

异步通信时,双方设置必须一致

USART用途:

 芯片间的近距离通信:

  

  

 芯片与pc机通信:

模块与模块之间远距离通信:借助RS485芯片-------can总线是在485上面发展起来的;

  RS-485接口的最大传输距离可达3000米;

USART内部关于寄存器控制:

USART发送设置:

   1、通过在USART_CR1寄存器上置位UE位来激活USART

   2、设置USART_CR1的M位来定义字长;

   3、设置USART_CR2中停止位的位数;

     如果采用多缓冲器通信,配置USART_CR3中的DMA使能位(DMAT),按多缓冲器通信中的描述配置DMA寄存器;

    4、设置USART_CR1中的TE位,发送一个空闲帧作为第一次数据发送;

    5、利用USART_BRR寄存器选择要求的波特率;

   6、把要发送的数据写进USART_DR寄存器(若数据发送完成由硬件清除);在只有一个缓冲器的情况下,重复步骤6;

 #include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h" #define GPIOA_ODR_A (GPIOA_BASE+0x0C)
#define GPIOA_IDR_A (GPIOA_BASE+0x08)
#define GPIOA_ODR_B (GPIOB_BASE+0x0C)
#define GPIOA_IDR_B (GPIOB_BASE+0x08)
#define GPIOA_ODR_C (GPIOC_BASE+0x0C)
#define GPIOA_IDR_C (GPIOC_BASE+0x08)
#define GPIOA_ODR_D (GPIOD_BASE+0x0C)
#define GPIOA_IDR_D (GPIOD_BASE+0x08)
#define GPIOA_ODR_E (GPIOE_BASE+0x0C)
#define GPIOA_IDR_E (GPIOE_BASE+0x08) #define BitBand(Addr, BitNum) *((volatile unsigned long *)((Addr&0xF0000000)+0x2000000 +((Addr&0xfffff)<<5)+(BitNum<<2)))
#define PAout(n) BitBand(GPIOA_ODR_A, n)
#define PAin(n) BitBand(GPIOA_IDR_A, n) /*******************************************************************************
* Function Name : RCC_Configuration
* Description : Configures the different system clocks.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void RCC_Configuration(void)
{
/*---------------使用外部RC晶振----------*/
RCC_DeInit(); //设置时钟为缺省值
RCC_HSEConfig(RCC_HSE_ON); //使能外部高速晶振
while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);//等待HSE准备就绪 // FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //使能指令预取
// FLASH_SetLatency(FLASH_Latency_2); //等待2个周期 RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK = SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2 = HCLK
RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK1 = HCLK/2
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //PLLCLK = 72MHZ
RCC_PLLCmd(ENABLE); //Enable PLLCLK
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait PLL is ready RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //SYSCLK = PLLCLK
while(RCC_GetSYSCLKSource()!= 0x08); //Wait PLLCLK as system clock //---------打开相应外设时钟--------------------
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能APB2外设的GPIOA的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);  //使能USART1时钟
} void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //选择PA.3
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管脚频率为50MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //输出模式为推挽输出
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化GPIOA寄存器 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //选择PA.10
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管脚频率为50MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//输入为浮空输入
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化GPIOA寄存器
} int main()
{
float div;
u16 M, F, BRR;
u32 Bound;
u8 data = 'A';
//USART1模块的设置:UE使能、M位来定字长 、停止位的位数、
//TE位; BRR寄存器选择要求的波特率, RCC_Configuration(); //打开系统时钟
GPIO_Configuration(); //引脚设置
USART1->CR1 |= (<<);
USART1->CR1 &= ~(<<);
USART1->CR2 &= ~(<<);
USART1->CR1 |=(<<);
//Tx / Rx 波特率 = fck/(16 *USARTDIV )
//波特率=9600; fck=72M
//小数部分=0.75×16=12 = 0x
Bound = ;
div = (float)(**)/(Bound*);
M = div;
F = (div-M)*;
//拼接数据
BRR = (M<<)+F;
USART1->BRR = BRR; //发送字符‘A’到USART1的TXD
for(F=;F<;F++)
{
USART1->DR = data;
data++;
while((USART1->SR &(<<)) == ) //等待发送完成才能再次发送
;
} return ;
}

USART接收设置:

  1、将USART_CR1寄存器的UE置1来激活USART.

  2、编程USART_CR1的M位定义字长;

  3、在USART_CR2中编写停止位的个数;

    注意:如果需多缓冲通信,选择USART_CR3中的DMA使能位(DMAT)。按多缓冲器通信所要求的配置DMA寄存器;

  4、利用波特率寄存器USART_BRR选择希望的波特率;

  5、设置USART_CR1的RE位,激活接收器,使它开始寻找起始位;

    当一字符被接收到时:

      RXNE位被置位,它表明移位寄存器的内容被转移到RDR.

      如果RXNEIE位被设置,产生中断;

      在接收期间如果检测到帧错误,噪音或者溢出错误,错误标志将被置起;

stm32之USART通信的更多相关文章

  1. STM32串口USART通信总结

    一.GPIO设置USART的初始化 /**************************实现函数******************************************** *函数原型: ...

  2. STM32的串口通信

    本篇文章主要讲解一个在开发过程中经常使用到的一个外设---串口. 串口是绝大多数 MCU 中不可或缺的一个外设,同时也是我们开发中经常使用的一种调试手段,所以在STM32的学习中,串口的配置使用也是必 ...

  3. STM32的USART DMA传输(转)

    源:STM32的USART DMA传输 问题描述: 我有一个需求,AD采得一定数目的数据之后,由串口DMA发出,由于AD使用双缓冲,所以每次开始DMA的时候都需要重新设置开始的内存地址以及传输的数目( ...

  4. STM32串行通信USART解说笔记

    STM32串行通信USART程序例举链接:http://blog.csdn.net/dragon12345666/article/details/24883111 1.STM32串行通信USART的相 ...

  5. STM32 IIC双机通信—— HAL库硬件IIC版

    参考传送门 关于IIC的原理这里我就不多说了,网上有很多很好的解析,如果要看我个人对IIC的理解的话,可以点击查看,这里主要讲一下怎样利用STM32CubeMx实现IIC的通讯,经过个人实践,感觉HA ...

  6. [stm32] NRF24L01+USART搞定有线和无线通信

    前言 一般进行远程监控时,2.4G无线通信是充当远程数据传输的一种方法.这时就需要在现场部分具备无线数据发送装置,而在上位机部分由于一般只有串口,所以将采集到的数据送到电脑里又要在上位机端设计一个数据 ...

  7. (三)stm32之串口通信DMA传输完成中断

    一.DMA功能简介 首先唠叨一下DMA的基本概念,DMA的出现大大减轻了CPU的工作量.在硬件系统中,主要由CPU(内核).外设.内存(SRAM).总线等结构组成,数据经常要在内存和外设之间,外设和外 ...

  8. stm32之USART学习

    首先,我是看着这位博主的文章受到的启发,进而加深了自己对USART的理解.下面是自己改装并实验过的程序. 原文:http://www.cnblogs.com/greatwgb/archive/2011 ...

  9. STM32串口USART的使用方法和程序

    通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换. USART利用分数波特率发生器提供宽范围的波特率选择,支持同步单向通信和半 ...

随机推荐

  1. POJ 3167 Cow Patterns(模式串浮动匹配)

    题目链接:http://poj.org/problem?id=3167 题意:模式串可以浮动的模式匹配问题给出模式串的相对大小,需要找出模式串匹配次数和位置. 思路:统计比当前数小,和于当前数相等的, ...

  2. RAC ORA-12170 ora-12535/tns-12535

    现象:开发人员抱怨RAC数据库出现了时连得上时连不上的情况,用SQLPLUS一试,果然有这样的情况: SQL> conn system/*******@bjyd 已连接. SQL> con ...

  3. relative、absolute和float

    relative.absolute和float   position:relative和position:absolute都可以改变元素在文档中的位置,都能激活元素的left.top.right.bo ...

  4. PHP学习(变量)

    PHP学习(变量) 1. PHP属于松散类型,创建变量时不用指定类型. 2.变量命名规范: 1)第一个字符必须是$ 2)$后的第一个字符必须是 字母 或 下划线 3)其他字符可以是 字母, 数字, 下 ...

  5. A Byte of Python 笔记(12)python 标准库:sys、os,更多内容

    第14章 python 标准库 Python标准库是随Python附带安装的,它包含大量极其有用的模块. sys 模块 sys 模块包含系统对应的功能.如 sys.argv 列表包含命令行参数. # ...

  6. 【转载】关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型

    1.#!/usr/bin/python 是用来说明脚本语言是 python 的 是要用 /usr/bin下面的程序(工具)python,这个解释器,来解释 python 脚本,来运行 python 脚 ...

  7. C++获取当前机器内网IP地址

    /*头文件*/ #include "winsock2.h" #pragma comment(lib,"ws2_32.lib") /*Hui 获取当前服务器IP* ...

  8. Android系统设置— android.provider.Settings

    android.provider.Settings Intent intent = new Intent(android.provider.Settings.ACTION_SETTINGS); sta ...

  9. Noip2010提高组总结

    将Noip2010重新做了一遍,第一遍做下来居然只有290分,比当年浙江的一等线低了20分,因为各种坏习惯丢掉了许多分数,Noip时需要特别注意! T1:机器翻译 第一题直接暴力,内存足够所以不用循环 ...

  10. 如何判断一个变量是数组Array类型

    在很多时候,我们都需要对一个变量进行数组类型的判断.JavaScript中如何判断一个变量是数组Array类型呢?我最近研究了一下,并分享给大家,希望能对大家有所帮助. JavaScript中检测对象 ...