一、串口通信概念

1、缩写

USART:Universal Synchronous/Asynchronous Receiver/Transmitter

通用同步/异步接收和发送器

2、用处

(1)同步通信

双方必须先建立同步,即双方的时钟要调整到一个频率,收发双发不停地发送和接受连续的同步比特流。

(2)异步通信

接收端必须时刻做好接受准备,而发送端则可以选择何时进行发送,但是发送时需要加一个开始标志和一个结束标志,表示一个发送阶段。

异步通信的优势在于简单。

3、分类

4、STM32F103Cx:拥有3个USART

RX:表示是接受端

TX:表示时发送端

二、STM32的USART寄存器配置

1、每个USART口:共有7个设置寄存器

①一个状态寄存器(USART_SR)

②一个数据寄存器(USART_DR):它是由两个寄存器组成的,一个给发送用(发送寄存器 TDR),一个给接收用(接收寄存器 RDR)

③一个波特率寄存器(USART_BRR)

④一个控制寄存器1(USART_CR1)

⑤一个控制寄存器2(USART_CR2)

⑥一个控制寄存器3(USART_CR3)

⑦一个保护时间和预分频寄存器(USART_GTPR)

2、在固件函数库的 “stm32f10x_map.h”文件中,对应的定义:

/*---------------- Universal Synchronous Asynchronous Receiver Transmitter --*/
typedef struct
{
vu16 SR;
u16 RESERVED0;
vu16 DR;
u16 RESERVED1;
vu16 BRR;
u16 RESERVED2;
vu16 CR1;
u16 RESERVED3;
vu16 CR2;
u16 RESERVED4;
vu16 CR3;
u16 RESERVED5;
vu16 GTPR;
u16 RESERVED6;
} USART_TypeDef; //用结构体USART_TypeDef定义USARTx串口,(即定义 USARTx串口的7个设置寄存器)

3、寄存器详细功能表

(1)状态寄存器(USART_SR)

(2)数据寄存器

(3)比特率寄存器

(4)控制寄存器

(5)控制寄存器2

(6)控制寄存器3

(7)保护时间和预分频寄存器(USART_GTPR)

三、STM32串口通信编程

1、编程步骤

(1)编程时,USARTx串口的具体配置是从USARTx寄存器组开始。首先,用结构体USART_TypeDef 定义 USARTx寄存器组。有代码,有封装好了的哈哈哈哈a

#include "bsp_usart1.h"

void USART1_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure; /* config USART1 clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); /* USART1 GPIO config */
/* Configure USART1 Tx (PA.09) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure USART1 Rx (PA.10) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure); /* USART1 mode config */
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(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
}

(2)初始化函数有了的话,我们可以直接进行下一步功能的编程

//×Ö·û´®·¢ËÍ
/*
ÏÈÁ¬½Ó´®¿Ú£¬´ò¿ª´®¿Ú£¬Ñ¡Ôñ115200²¨ÌØÂÊ£¬
Ñ¡¶Ô¶Ë¿Ú£¬ÏÂÔØ³ÌÐò£¬µçÄÔ½ÓÊÕµ½×Ö·û´®£¬
µçÄÔ·¢ËÍ×Ö·û´®£¬³¤¶ÈСÓÚ100£¬µ¥Æ¬»úÈ«²¿
½ÓÊպ󷵻ظøµçÄÔ¡£Ò²¿ÉÒÔÐ޸ijÌÐò£¬½ÓÊÕ
Ò»¸ö·µ»ØÒ»¸ö£¬¿ÉÒÔ·¢ËÍÈÎÒⳤ¶ÈµÄ×Ö·û´®£¬
´úÂëÔÚ×¢ÊͲ¿·Ö£¬·¢ËÍÊý×Ö»òÕß×Öĸ£¬ÏÔʾ
µÄÊÇÊý×Ö¼Ó1£¬»òÕß×Öĸ¼Ó1.
´®¿Ú·¢Ë͵ÄÊÇ×Ö·ûµÄASCIIÂ룬Êý×Ö0¡ª9ÊÇ
0x30-0x39,a-zÊÇ0x61-0x7a,A-ZÊÇ0x41-0x5a
¿ÉÒÔÑ¡Ôñ´®¿ÚÏÔʾ·½Ê½ÎªHEXÏÔʾ£¨Ê®Áù½øÖÆÏÔʾ£©
²é¿´½á¹û¡£
*/
#include "stm32f10x.h"
#include "bsp_usart1.h"
void USART1_Config(void);
uint_least8_t ch[100],re[100],i,j;
#define endchar '.' //ÊäÈëµÄ×Ö·û´®½áÊø·û
void delay(void)
{
uint16_t i=6000;
while(i--);
}
unsigned char display[]="ÄÏÇ¿µç×ÓÉè¼ÆÐ­»á401ʵÑéÊÒ¡£";//µ¥Æ¬»ú·¢Ë͸øPC»úµÄ×Ö·û´®
/*
int main(void)
{
USART1_Config(); //´®¿Ú³õʼ»¯
for(j=0;display[j]!='\0';j++) //·¢ËÍ×Ö·û´®
{
USART_SendData(USART1,display[j]); //·¢ËÍÒ»¸öÊý¾Ý
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //µÈ´ý·¢ËͽáÊø
}
while(1)
{
while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); //µÈ´ýPC»úµÄÊý¾Ýµ½À´
i = USART_ReceiveData(USART1); //½ÓÊÕÊý¾Ý
if(i=='9')i='0'-1;
if(i=='z')i='a'-1;
if(i=='Z')i='A'-1;
USART_SendData(USART1,i+1); //·¢ËÍÒ»¸öÊý¾Ý
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//µÈ´ý·¢ËͽáÊø
}
}
*/
/*
*/
int main(void)
{
USART1_Config(); //´®¿Ú³õʼ»¯
for(j=0;display[j]!='\0';j++) //·¢ËÍ×Ö·û´®
{
USART_SendData(USART1,display[j]); //·¢ËÍÒ»¸öÊý¾Ý
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //µÈ´ý·¢ËͽáÊø
}
while(1)
{
while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); //µÈ´ýPC»úµÄÊý¾Ýµ½À´
re[0] = USART_ReceiveData(USART1); //½ÓÊÕÊý¾Ý
i=0;
while(re[i]!=endchar) //Êý¾Ý»¹Ã»·¢ËͽáÊø
{
i++;
while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);//µÈ´ýÊý¾Ýµ½À´
re[i] = USART_ReceiveData(USART1); //½ÓÊÕÊý¾Ý
}
for(j=0;j<i+1;j++)ch[j]=re[j]; //¸´ÖÆ×Ö·û´®
delay(); //´úÌæÊµ¼ÊÓ¦ÓÃÖеĴ¦Àíº¯Êý
for(j=0;j<i;j++) //·¢Ë͸øPC»ú
{
USART_SendData(USART1,ch[j]); //·¢ËÍÒ»¸öÊý¾Ý
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//µÈ´ý·¢ËͽáÊø
}
}
}

电赛菜鸟营培训(三)——STM32F103CB之串口通信的更多相关文章

  1. 电赛菜鸟营培训(二)——STM32F103CB之中断控制

    一.中断的概念 中断可以理解为一个有激励给它就会立马给你响应的一个东东.就是说在你执行main函数的内容时,当有这个触发时便会跳转到这个中断内存,执行这段代码. Attention: 1.中断的用法, ...

  2. 电赛菜鸟营培训(一)——STM32F103CB之LED控制

    一.STM32F103C8 引脚分布 二.LED的共阴.共阳接法 这里应该是七段数码管的接法. 限流电阻选择为470,在Multism中仿真,也需要接入,否则会出现闪烁情况.或者直接更改属性. 三.消 ...

  3. 电赛菜鸟营培训(四)——STM32F103CB之ADC转换

    一.ADC概念 实现模拟信号转换成数字信号就是这样子= = 二.代码框架 #include "stm32f10x.h" void delay(u32 kk) { while(kk- ...

  4. 电赛菜鸟营培训(零)——Keil环境搭建

    一.Keil开发软件安装 1.安装keil软件 2.使用注册机进行破解 将方框内的ID号复制到注册机,然后得到License,放到最底下就可以完成了. 二.Keil工程搭建 表示参考数据手册,在这里建 ...

  5. 电赛菜鸟营培训(五)——OLED屏幕的使用

    一.取模软件的使用 首先进行设置 然后可以生成显示这个字母的代码,列优先,先按列画8行,然后再继续画下一列.汉字为16*16,字母为8*8,对应生成相应个数的ox代码. 二.STM32烤写OLED # ...

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

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

  7. TI MSP430工程配置及2019年电赛A题编程示例(使用430 F5529)

    配置 第一步:右击工程,选择Options 第二步:在General Options的Target选项卡里选择对应的器件Device,这里是MSP430G2231 第三步:在Debugger里选择FE ...

  8. 【系列】关于NJUPT电赛自控方向第一次积分赛的总结

    本人是NJUPT电子科学与技术专业大一摸鱼狗一枚.本博客旨在总结与分享个人准备电赛所学知识,同时也是为了防止遗忘,锻炼写文章的能力.目前电赛方向为自控方向.主要研究方向为单片机.图像处理.自动控制相关 ...

  9. [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(三)

    一步步打造一个简单的 MVC 电商网站 - BooksStore(三) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore &l ...

随机推荐

  1. 【转】 浅谈Radius协议

    浅谈Radius协议 2013-12-03 16:06 5791人阅读 评论(0) 收藏 举报  分类: Radius协议分析(6)  从事Radius协议开发有段时间了,小弟不怕才疏学浅,卖弄一下, ...

  2. svn命令在linux下的使用

    svn命令在linux下的使用 SVN软件版本管理 三 12th, 2008 转载本站文章请注明,转载自:扶凯[[url]http://www.php-oa.com[/url]] 本文链接: [url ...

  3. 9个 SSH常用命令选项

    9个 SSH常用命令选项 SSH 是什么 SSH(全称 Secure Shell)是一种加密的网络协议.使用该协议的数据将被加密,如果在传输中间数据泄漏,也可以确保没有人能读取出有用信息.要使用 SS ...

  4. linux 的iptables防火墙

    .a文件就是*.o文件的集合, 是object文件的归档文件, 所以, 用nm -A  ???.a看到的 symbolic符合名称都是 相应的,  包含的  .o文件.... linux 2.4内核中 ...

  5. #iPhone6与iPhone6Plus适配#如何在Xcode 6中创建 PCH 文件

    本文永久链接http://www.cnblogs.com/ChenYilong/p/4008086.html   新建文件 ⌘+N选择 iOS/Mac -> Other -> PCH Fi ...

  6. Nginx反向代理 负载均衡

    nginx 这个轻量级.高性能的 web server 主要可以干两件事情: 〉直接作为http server(代替apache,对PHP需要FastCGI处理器支持): 〉另外一个功能就是作为反向代 ...

  7. 手动安装ubuntu视频播放器插件的方法

    新安装的ubuntu14.04在浏览器里面都不能看视频,提示缺少播放器插件,而且有一个安装的按钮,但是点击之后往往提示找不到,这就要手动安装了.第一步:首先运行一下更新命令吧sudo apt-get ...

  8. CameraFacingBillboard

    原地址:http://www.cnblogs.com/88999660/ 描述 这个脚本使得它被连接到配合本身相机的对象.这对于要经常面对镜头,并以同样的方式了,因为它是有用的广告牌. 用法 将这个脚 ...

  9. ZeroMQ(java)中的数据流SessionBase与SocketBase

    前面的文章中已经比较的清楚了ZeroMQ(java)中如何在底层处理IO, 通过StreamEngine对象来维护SelectableChannel对象以及IO的事件回调,然后通过Poller对象来维 ...

  10. 做网站用UTF-8还是GB2312 & 各国语言对应字符集

    经常我们打开外国网站的时候出现乱码,又或者打开很多非英语的外国网站的时候,显示的都是口口口口口的字符, WordPress程序是用的UTF-8,很多cms用的是GB2312. ● 为什么有这么多编码? ...