STM32串口实验

发布者:星辰耀眼最新更新时间:2015-10-09 来源: eefocus关键字:STM32  串口实验 手机看文章 扫描二维码
随时随地手机看文章
STM32串口简介 
 串口作为MCU的重要外部接口,同时也是软件开发重要的调试手段,其重要性不言而喻。现在基本上所有的MCU都会带有串口,STM32自然也不例外。 
STM32的串口资源相当丰富的,功能也相当强劲。ALIENTEK战舰STM32开发板所使用的STM32F103ZET6最多可提供5路串口,有分数波特率发生器、支持同步单线通信和半双工单线通讯、支持LIN、支持调制解调器操作、智能卡协议和IrDA SIR ENDEC规范、具有DMA等。 
5.3节对串口有过简单的介绍,大家看这个实验的时候记得翻过去看看。接下来我们将主要从库函数操作层面结合寄存器的描述,告诉你如何设置串口,以达到我们最基本的通信功能。本章,我们将实现利用串口1不停的打印信息到电脑上,同时接收从串口发过来的数据,把发送过来的数据直接送回给电脑。战舰STM32开发板板载了1个USB串口和1个RS232串口,我们本章介绍的是通过USB串口和电脑通信。 
在4.4.1章节端口复用功能已经讲解过,对于复用功能的IO,我们首先要使能GPIO时钟,然后使能复用功能时钟,同时要把GPIO模式设置为复用功能对应的模式(这个可以查看手册《STM32中文参考手册V10》P110的表格“8.1.11外设的GPIO配置”)。这些准备工作做完之后,剩下的当然是串口参数的初始化设置,包括波特率,停止位等等参数。在设置完成只能接下来就是使能串口,这很容易理解。同时,如果我们开启了串口的中断,当然要初始化NVIC设置中断优先级别,最后编写中断服务函数。 
串口设置的一般步骤可以总结为如下几个步骤: 1) 串口时钟使能,GPIO时钟使能 2) 串口复位 
3) GPIO端口模式设置 4) 串口参数初始化 
5) 开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤) 6) 使能串口 
7) 编写中断处理函数 
下面,我们就简单介绍下这几个与串口基本配置直接相关的几个固件库函数。这些函数和定义主要分布在stm32f10x_usart.h和stm32f10x_usart.c文件中。 
1.串口时钟使能。串口是挂载在APB2下面的外设,所以使能函数为: RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1); 
2.串口复位。当外设出现异常的时候可以通过复位设置,实现该外设的复位,然后重新配置这个外设达到让其重新工作的目的。一般在系统刚开始配置外设的时候,都会先执行复位该外设的操作。复位的是在函数USART_DeInit()中完成: 
void USART_DeInit(USART_TypeDef* USARTx); 比如我们要复位串口1,方法为:  USART_DeInit(USART1);  //复位串口1 
3.串口参数初始化。串口初始化是通过USART_Init()函数实现的, 
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct); 这个函数的的第一个入口参数是指定初始化的串口标号,这里选择USART1。 
第二个入口参数是一个USART_InitTypeDef类型的结构体指针,这个结构体指针的成员变量用来设置串口的一些参数。一般的实现格式为: 
USART_InitStructure.USART_BaudRate = bound;                 //一般设置为9600; 
 
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);                   //初始化串口 
从上面的初始化格式可以看出初始化需要设置的参数为:波特率,字长,停止位,奇偶校验位,硬件数据流控制,模式(收,发)。我们可以根据需要设置这些参数。 
4.数据发送与接收。STM32的发送与接收是通过数据寄存器USART_DR来实现的,这是一个双寄存器,包含了TDR和RDR。当向该寄存器写数据的时候,串口就会自动发送,当收到收据的时候,也是存在该寄存器内。  
STM32库函数操作USART_DR寄存器发送数据的函数是: 
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); 通过该函数向串口寄存器USART_DR写入一个数据。 
STM32库函数操作USART_DR寄存器读取串口接收到的数据的函数是: 
uint16_t USART_ReceiveData(USART_TypeDef* USARTx); 通过该函数可以读取串口接受到的数据。 
5.串口状态。串口的状态可以通过状态寄存器USART_SR读取。
图9.1.1 USART_SR寄存器各位描述 
这里我们关注一下两个位,第5、6位RXNE和TC。 RXNE(读数据寄存器非空),当该位被置1的时候,就是提示已经有数据被接收到了,并且可以读出来了。这时候我们要做的就是尽快去读取USART_DR,通过读USART_DR可以将该位清零,也可以向该位写0,直接清除。 
TC(发送完成),当该位被置位的时候,表示USART_DR内的数据已经被发送完成了。如果设置了这个位的中断,则会产生中断。该位也有两种清零方式:1)读USART_SR,写USART_DR。2)直接向该位写0。 
 状态寄存器的其他位我们这里就不做过多讲解,大家需要可以查看中文参考手册。 在我们固件库函数里面,读取串口状态的函数是: 
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG); 这个函数的第二个入口参数非常关键,它是标示我们要查看串口的哪种状态,比如上面讲解的RXNE(读数据寄存器非空)以及TC(发送完成)。例如我们要判断读寄存器是否非空(RXNE),操作库函数的方法是: 
USART_GetFlagStatus(USART1, USART_FLAG_RXNE); 我们要判断发送是否完成(TC),操作库函数的方法是: 
USART_GetFlagStatus(USART1, USART_FLAG_TC); 
这些标识号在MDK里面是通过宏定义定义的: 
#define USART_IT_PE                          ((uint16_t)0x0028) #define USART_IT_TXE                        ((uint16_t)0x0727) #define USART_IT_TC                          ((uint16_t)0x0626) #define USART_IT_RXNE                        ((uint16_t)0x0525) #define USART_IT_IDLE                       ((uint16_t)0x0424) #define USART_IT_LBD                         ((uint16_t)0x0846) #define USART_IT_CTS                         ((uint16_t)0x096A) #define USART_IT_ERR                        ((uint16_t)0x0060) #define USART_IT_ORE                         ((uint16_t)0x0360) #define USART_IT_NE                          ((uint16_t)0x0260) #define USART_IT_FE                         ((uint16_t)0x0160) 
6, 串口使能。串口使能是通过函数USART_Cmd()来实现的,这个很容易理解,使用方法 是:     
USART_Cmd(USART1, ENABLE);                    //使能串口                   7,开启串口响应中断。有些时候当我们还需要开启串口中断,那么我们还需要使能串口中断,使能串口中断的函数是: 
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT,  FunctionalState NewState) 
这个函数的第二个入口参数是标示使能串口的类型,也就是使能哪种中断,因为串口的中断类型有很多种。比如在接收到数据的时候(RXNE读数据寄存器非空),我们要产生中断,那么我们开启中断的方法是: 
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断,接收到数据中断 我们在发送数据结束的时候(TC,发送完成)要产生中断,那么方法是: 
USART_ITConfig(USART1,USART_IT_TC,ENABLE);  8,获取相应中断状态。当我们使能了某个中断的时候,当该中断发生了,就会设置状态寄存器中的某个标志位。经常我们在中断处理函数中,要判断该中断是哪种中断,使用的函数是:  
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT) 比如我们使能了串口发送完成中断,那么当中断发生了, 我们便可以在中断处理函数中调用这个函数来判断到底是否是串口发送完成中断,方法是: 
USART_GetITStatus(USART1, USART_IT_TC) 返回值是SET,说明是串口发送完成中断发生。
关键字:STM32  串口实验 引用地址:STM32串口实验

上一篇:STM32F4DiscoveryRTC
下一篇:STM32库函数之断言

推荐阅读最新更新时间:2024-03-16 14:34

STM32中DMA的使用
一、DMA的定义: DMA,全称为:Direct Memory Access,即直接存储器访问。DMA传输方式无需CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM 与I/O设备开辟一条直接传送数据的通路,能使CPU 的效率大为提高。 二、stm32的DMA1、DMA2功能介绍。 STM32中 DMA1有7个通道,DMA2有5个通道(DMA2 仅存在大容量产品中)。DMA挂载的时钟为AHB总线,其时钟为72Mhz,所以可以实现高速数据搬运。 下面我们就针对DMA1 进行介绍。 下面我们就针对DMA2进行介绍。 三、DMA1初始化。 1、时钟初始化。 RCC_
[单片机]
<font color='red'>STM32</font>中DMA的使用
对于STM32别名区的理解
1. 什么是位段、位带别名区? 2. 它有什么好处? 答1: 是这样的,记得MCS51吗? MCS51就是有位操作,以一位(BIT)为数据对象的操作, MCS51可以简单的将P1口的第2位独立操作: P1.2=0;P1.2=1 ; 就是这样把P1口的第三个脚(BIT2)置0置。 而现在STM32的位段、位带别名区就为了实现这样的功能。 对象可以是SRAM,I/O外设空间。实现对这些地方的某一位的操作。 它是这样的。在寻址空间(32位地址是 4GB )另一地方,取个别名区空间,从这地址开始处,每一个字(32BIT) 就对应SRAM或I/O的一位。
[单片机]
[STM32系列]你真的会使用SPI接口的NSS引脚吗
SPI接口介绍 SPI是串行外设接口(Serial Peripheral Interface)的缩写,是Motorola公司推出的一种高速的,全双工,同步的通信总线。SPI总线共有4根信号线,分别是:设备选择线、时钟线、串行输出数据线、串行输入数据线。 NSS:从设备使能信号,由主设备控制,低电平有效 SCK:时钟信号,由主设备产生 MOSI:主设备输出从设备输入信号 MISO:主设备输入从设备输出信号 STM32上的NSS STM32上SPI接口的NSS结构图如图1所示,除了外部的NSS引脚,还有内部NSS,且内部NSS状态可以由寄存器独立控制,也正因此,NSS引脚既可作输入也可作输出。 图1 NSS结构图
[单片机]
关于STM32中NVIC的理解,带错误例子
STM32有43个channel的settable的中断源;AIRC(Application Interruptand Reset Register)寄存器中有用于指定优先级的4 bits。这4个bits用于分配preemption优先级和sub优先级,在STM32的固件库中定义如下 /* Preemption Priority Group-------------------------------------------------*/ #define NVIC_PriorityGroup_0 ((u32)0x700) /* 0 bits for pre-emption priority
[单片机]
STM32 输出比较错误及解决
程序1:TIM2输出比较,产生频率为366.2Hz的方波 #include stm32f10x.h void RCC_configuration(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE); //开启GPIO的时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); } void Led_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; //定义GPIO初始化的结构体 GPIO_Init
[单片机]
STM32-跑马灯实验代码分析
工程建立的主要步骤 1.新建3个文件夹:USER、SYSTEM、HARDWARE 2.新建led.c、led.h和test.c 3.在Target目录树上右击Manage Component,新建USER、SYSTEM、HARDWARE,并添加相关C文件(具体见前文 MDK使用方法与技巧 ),跟前面一样HARDWARE组添加led.c文件。 4.在Options for Target Target 1 对话框C/C++选项卡中Include Pathes里添加头文件路径。(这个不可少,否则编译出错,见前文 MDK使用方法与技巧 ,led.h文件不可漏掉) 5.使用SWD方式下载,具体见 MDK使用方法与技巧 ,注意reset
[单片机]
stm32cubemx I2C读取AT24C16
本文对如何使用stm32cube生成I2C工程不作说明,仅对在对AT24Cxx系列的使用时作出易忽略的说明; 1、at24cxx页面结构: 从该图可以看出16K(bit)共有128个页,每页由16byte构成。16k = 128 * 16 * 8; 特别注意:除at24c01和at24c02的页由8个byte构成,其它的都是由16byte构成。(这关系到对芯片的连续读写) 2.at24cxx的设备地址: A:作为设备地址的一部分;P:作为页地址的一部分; 对于大多数人来说都知道I2c设备具有一个设备地址,并且在一条总线上是唯一。若要在一个I2C总线上挂多个AT24CXX系列芯片,则需要A2,A1,A0作为设备地址的一部分
[单片机]
一文了解STM32启动过程
1 概述 说明 每一款芯片的启动文件都值得去研究,因为它可是你的程序跑的最初一段路,不可以不知道。通过了解启动文件,我们可以体会到处理器的架构、指令集、中断向量安排等内容,是非常值得玩味的。 STM32作为一款高端 Cortex-M3系列单片机,有必要了解它的启动文件。打好基础,为以后优化程序,写出高质量的代码最准备。 本文以一个实际测试代码--START_TEST为例进行阐述。 整体过程 STM32整个启动过程是指从上电开始,一直到运行到 main函数之间的这段过程,步骤为(以使用微库为例): ①上电后硬件设置SP、PC ②设置系统时钟 ③软件设置SP ④加载.data、.
[单片机]
一文了解<font color='red'>STM32</font>启动过程
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved