STM32F1笔记(三)UART/USART

UART:Universal Asynchronous Receiver/Transmitter(通用异步收/发器)

USART:Universal Synchronous/Asynchronous Receiver/Transmitter(通用同步/异步串行收/发器)

从命名即可看出USART就是UART的基础上添加了同步功能。通常把UART/USART称为串口。

串口包含TLL电平和232的串口,485等电气特性的串口。232、485通常应用于工业。

串口配置的一般步骤可以参考正点原子的总结:

1、串口时钟使能,GPIO时钟使能;

2、串口复位;(我不知道这一步的意义,去掉似乎也没影响,求大神指点)

3、GPIO端口模式的配置;

4、串口参数初始化;

5、初始化NVIC并开启中断;

6、使能串口;

7、编写中断服务函数。

配置示例:

void Usart3_Init(unsigned int BaudRate)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);USART_DeInit(USART3);//USART3_TX   GPIOB.10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);//USART3_RX	  GPIOB.11GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOB, &GPIO_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);USART_InitStructure.USART_BaudRate = BaudRate;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(USART3, &USART_InitStructure);USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);USART_Cmd(USART3, ENABLE);
}

注意:在此示例中GPIO的速率配置为50M,其实没必要那么高,可降低至2M。速率越高,噪声越大,功耗越高。

在配置代码中,开启了接收中断。在日常串口使用中,都会规定通信协议。通信协议的解析,通常在中断服务函数里进行。

通信协议通常由帧头,数据,帧尾三部分组成。

帧头不正确,不继续处理后续接收到的内容。

帧尾不正确,对数据不进行处理。

示例:

帧头由两部分组成,校验信息和数据长度。示例中断校验信息,赋值给unsigned char的变量,相加后为0。这是特殊的帧头。

    unsigned char chr = 0;chr += (0xAA + 0xBB + 0xCC + 0xDD + 0xEE + 0x04);printf("chr=%X\n", chr);

数据长度通常只指数据的长度,不包含帧头校验信息和帧尾的长度。

帧尾可以是CRC等校验方式。可包含长度也可不包含,计算数据的CRC。目的是确保数据的一致性。

串口中断服务函数示例:

void USART3_IRQHandler(void)
{       if(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == SET){USART_ClearITPendingBit(USART3, USART_IT_RXNE);g_usart3_recv_data = USART_ReceiveData(USART3);switch(g_usart3_recv_state){case USART3_RECV_FIRST_FRAME_HEAD:if(MKLM_FIRST_FRAME_HEAD == g_usart3_recv_data){g_usart3_recv_state = USART3_RECV_SECOND_FRAME_HEAD;   }else{g_usart3_recv_state = USART3_RECV_FIRST_FRAME_HEAD;             }break;case USART3_RECV_SECOND_FRAME_HEAD:if(MKLM_SECOND_FRAME_HEAD == g_usart3_recv_data){g_usart3_recv_state = USART3_RECV_FIRST_LENGTH;}else{g_usart3_recv_state = USART3_RECV_FIRST_FRAME_HEAD;             }break;case USART3_RECV_FIRST_LENGTH:g_Usart3_recv_struct.length = g_usart3_recv_data;g_Usart3_recv_struct.length <<= 8;g_usart3_recv_state = USART3_RECV_SECOND_LENGTH; break;case USART3_RECV_SECOND_LENGTH:g_Usart3_recv_struct.length |= g_usart3_recv_data;g_usart3_recv_length = 0;g_usart3_recv_state = USART3_RECV_ADDRESS; break;case USART3_RECV_ADDRESS:g_Usart3_recv_struct.address = g_usart3_recv_data;g_usart3_recv_length++;g_usart3_recv_state = USART3_RECV_ORDER;break;case USART3_RECV_ORDER:g_Usart3_recv_struct.order = g_usart3_recv_data;g_usart3_recv_length++;g_usart3_recv_state = USART3_RECV_ACTION; break;case USART3_RECV_ACTION:g_Usart3_recv_struct.action = g_usart3_recv_data;g_usart3_recv_length++;g_usart3_recv_state = USART3_RECV_FIRST_CRC;break;case USART3_RECV_FIRST_CRC:g_Usart3_recv_struct.crc16 = g_usart3_recv_data;g_Usart3_recv_struct.crc16 <<= 8;g_usart3_recv_length++;g_usart3_recv_state = USART3_RECV_SECOND_CRC;break;case USART3_RECV_SECOND_CRC:g_Usart3_recv_struct.crc16 |= g_usart3_recv_data;g_usart3_recv_length++;if(g_usart3_recv_length == g_Usart3_recv_struct.length){g_recv_status = RECEIVE_OK;}else {g_recv_status = RECEIVE_LENGTH_ERROR;}g_usart3_recv_flag = USART3_RECV_SECCESS;g_usart3_recv_length = 0;g_usart3_recv_state = USART3_RECV_FIRST_FRAME_HEAD;break;default:break;}}
}

STM32使用printf的方法。

在魔术棒里勾选Use MicroLIB(默认是不勾选的)

如果不勾选会出现在BEAB BKPT 0xAB 死循环,如下图

 

以串口2为例,在串口2相关.c里(可在任何位置,为防混乱放在需要配置给printf的串口文件里)

加入以下代码(别忘了添加包含头文件stdio.h)

#include <stdio.h>int fputc(int ch, FILE* stream)
{while (!(USART2->SR & USART_FLAG_TXE));USART_SendData(USART2, (uint8_t)ch);return ch;
}

就可以调用printf了,调用前别忘了相关串口要初始化。

Uart2_Init(9600); while(1)
{printf("Hello World!\r\n");delay_ms(100);
}

通过串口助手可以看到现象

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

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

相关文章

python安装界面翻译_python环境搭建

如果想要运行python需要有解释器和编辑器。 什么是解释器 解释器我们可以把它理解成翻译官&#xff0c;它是将我们写的python代码翻译成计算机能够懂得机器语言。 然后计算机收到解释器的命令来干活&#xff0c;最终再将结果反馈在解释器中。 解释器推荐使用anaconda3 什么是an…

进阶篇-用户界面:4.Android中常用组件

1.下拉菜单 在Web开发中&#xff0c;HTML提供了下拉列表的实现&#xff0c;就是使用<select>元素实现一个下拉列表&#xff0c;在其中每个下拉列表项使用<option>表示即可。这是在Web开发中一个必不可少的交互性组件&#xff0c;而在Android中的对应实现就是Spinne…

http的“无连接”指的是_http协议无状态中的 quot;状态quot; 到底指的是什么?...

引子&#xff1a;最近在好好了解http&#xff0c;发现对介绍http的第一句话【http协议是无状态的&#xff0c;无连接的】就无法理解了&#xff1a;无状态的【状态】到底指的是什么&#xff1f;&#xff01;找了很多资料不仅没有发现有一针见血正面回答这个问题的&#xff0c;而…

个人日志-7.4

姓名 刘鑫 时间 2016.7.4 学习内容 完善需求分析报告。撰写数据库设计说明书。初步安排计划概要设计说明书。调整项目开发计划说明书。 所遇问题 无 解决方案 无 转载于:https://www.cnblogs.com/liuxin13070013/p/5641967.html

STM32F1笔记(五)外部中断EXTI

STM32的每个IO都可以作为外部中断的中断输入口。 STM32F103的中断控制器支持19个外部中断/事件请求。每个中断设有状态为&#xff0c;每个中断/事件都有独立的触发和屏蔽设置。 STM32F103的19个外部中断为&#xff1a; EXTI线0~15&#xff1a;对应外部IO口的输入中断。 EXT…

STM32F1笔记(六)独立看门狗IWDG

STM32F1内置了两个看门狗&#xff0c;独立看门狗IWDG和窗口看门狗WWDG&#xff0c;可以用来检测和解决由软件错误引起的故障。 IWDG最适合应用于那些需要看门狗作为一个在主程序之外&#xff0c;能够完全独立工作&#xff0c;并且对时间精度要求较低的场合。WWDG最适合那些要求…

在JSF 2中对定制验证器进行参数化

在JSF 2中编写自定义验证器并不复杂。 您实现Validator接口&#xff0c;添加FacesValidator批注&#xff0c;并在faces-config.xml中插入Validator声明&#xff0c; 仅此而已 。 一块蛋糕。 但是&#xff0c;让我们考虑以下情形&#xff1a; 您需要自定义日期验证器&#xff0c…

STM32F1笔记(七)WWDG窗口看门狗

窗口看门狗与独立看门狗最大的不同是中断&#xff0c;窗口看门狗拥有一个提前唤醒中断。也就是在快要产生复位的前一段时间&#xff08;T[6:0]0x40&#xff09;来提醒需要进行喂狗&#xff0c;否则将复位。因此当窗口看门狗的计数器值减到0x40的时候&#xff0c;产生中断&#…

groovy怎样从sql语句中截取表名_Mysql和SQL

基本概念1.数据库DataBase简称&#xff1a;DB2.什么数据库&#xff1f;——用于存储和管理数据的仓库。存储过程是一个预编译的SQL语句&#xff0c;优点是允许模块化的设计&#xff0c;就是说只需创建一次&#xff0c;以后在该程序中就可以调用多次。3.数据库的特点&#xff1a…

STM32F1笔记(八)时钟

STM32有五种时钟源 1、HSI。高速内部时钟&#xff0c;RC振荡器&#xff0c;频率为8MHz。 2、HSE。高速外部时钟&#xff0c;可接石英/陶瓷谐振器&#xff0c;或者借外部时钟源&#xff0c;频率范围为4MHz~16MHz。 3、PLL。锁相环倍频输出&#xff0c;其时钟输入源可选择为HS…

java常用工具类(一)

一、String工具类 package com.mkyong.common; import java.util.ArrayList; import java.util.List; /** * * String工具类. <br> * * author 宋立君 * date 2014年06月24日 */ public class StringUtil { private static final int INDEX_NO…

python可以下载百度文库_不用下载券也能下载百度文库资料,Python帮你轻松搞定...

大家可能平时都有在百度文库下载文档的经历&#xff0c;费尽心思好不容易在文库找了一份可以用的资料&#xff0c;一看需要用下载券下载&#xff0c;搞的人很烦。 有的人为了节省时间&#xff0c;就任性办理了个文库VIP&#xff0c;再也不用纠结怎么下文档了。如果你是一个百度…

STM32F1笔记(九)通用定时器

STM32F1的定时器分为TIME1/8等高级定时器&#xff0c;TIME2~5等通用定时器&#xff0c;TIME6/7基本定时器。三者的区别主要参考《STM32中文参考手册》里特性的每种定时器主要特性的异同。 先看中文手册中通用定时器的简介&#xff1a; 通用定时器的寄存器有一个比较有趣的地方…

c++保存图标到dll_自动保存邮件附件至指定文件夹

最近有个需求&#xff0c;ERP系统会自动发很多csv附件到我邮箱&#xff0c;我需要把这些附件上传到FTP服务器&#xff0c;服务器会把这些csv的数据写到另外一个系统的数据库。每次大概有30个邮件&#xff0c;每个邮件有一个附件&#xff0c;而且附件的名字都一样&#xff0c;是…

有时在Java中,一个布局管理器是不够的

在开发Java Swing应用程序时&#xff0c;最经常的是&#xff0c;我们需要在多个嵌套面板中使用多个布局管理器。 通常这不是问题&#xff0c;并且被认为是几乎所有人类已知语言的所有UI开发的常规做法。 但是&#xff0c;大多数情况下&#xff0c;对于UI中的每个面板&#xff0…

python中print的用法_Python中print函数简单使用总结

Python中print函数简单使用总结 print函数是Python的入门&#xff0c;每一个学习python的人都绕不开这个函数&#xff0c;下面介绍一下这个函数的用法。 打开电脑&#xff0c;选择python软件&#xff0c;下面选择python 3.7为例进行介绍&#xff0c;点击python 3.7&#xff0c;…

STM32F1笔记(十)PWM

PWM&#xff1a;Pulse Width Modulation&#xff0c;脉冲宽度调制。是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单来说就是对脉冲宽度的控制。 在《STM32中文参考手册》里可以看到 占空比&#xff1a;占空比是指在一个脉冲循环内&#xff0c;通电时…

从GlassFish 3.x扩展到WebLogic 12c Server

Oracle针对GlassFish服务器的策略的主要目标之一是“与Fusion Middleware and Products集成”&#xff08;来源&#xff1a; Community Roadmap&#xff0c;2010年5月 &#xff09;。 在今年早些时候&#xff0c;您听到了很多关于两台服务器合而为一的恐惧和谣言。 看到这两种产…

hashset去重原理_基于simhash的文本去重原理

互联网网页存在着大量重复内容&#xff0c;必须有一套高效的去重算法&#xff0c;否则爬虫将做非常多的无用功&#xff0c;工作时效性无法得到保证&#xff0c;更重要的是用户体验也不好。业界关于文本指纹去重的算法众多&#xff0c;如 k-shingle 算法、google 提出的simhash …

解决express video 手机无法播放的问题

http://stackoverflow.com/questions/24976123/streaming-a-video-file-to-an-html5-video-player-with-node-js-so-that-the-video-c 项目地址 https://github.com/shenggen1987/mp4-demo express index.jade extends layoutblock contenth1 titlep Welcome to #{title}vid…