STM32 串口简介

来源:本站
导读:目前正在解读《STM32 串口简介》的相关信息,《STM32 串口简介》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《STM32 串口简介》的详细说明。
简介:串口作为 MCU 的重要外部接口,同时也是软件开发重要的调试手段, 其重要性不言而喻。STM32 的串口资源相当丰富的,功能也相当强劲。ALIENTEK 战舰 STM32 开发板所使用的 STM32F103ZET6 最多可提供 5 路串口,有分数波特率发生器、支持同步单线通信和半双工单线通讯、支持 LIN、 支持调制解调器操作、 智能卡协议和 IrDA SIR ENDEC 规范、具有 DMA等。

串口设置的一般步骤可以总结为如下几个步骤:

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()中完成:

voidUSART_DeInit(USART_TypeDef*USARTx);//串口复位

比如我们要复位串口1,方法为:

USART_DeInit(USART1);//复位串口1

3.串口参数初始化。串口初始化是通过USART_Init()函数实现的,

voidUSART_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寄存器发送数据的函数是:

voidUSART_SendData(USART_TypeDef*USARTx,uint16_tData);

通过该函数向串口寄存器USART_DR写入一个数据。

STM32库函数操作USART_DR寄存器读取串口接收到的数据的函数是:

uint16_tUSART_ReceiveData(USART_TypeDef*USARTx);

通过该函数可以读取串口接受到的数据。

在固件库函数里面,读取串口状态的函数是:

FlagStatusUSART_GetFlagStatus(USART_TypeDef*USARTx,uint16_tUSART_FLAG);

这个函数的第二个入口参数非常关键,它是标示我们要查看串口的哪种状态,比如RXNE(读数据寄存器非空)以及TC(发送完成)。例如我们要判断读寄存器是否非空(RXNE),操作库函数的方法是:

USART_GetFlagStatus(USART1,USART_FLAG_RXNE);

我们要判断发送是否完成(TC),操作库函数的方法是:

USART_GetFlagStatus(USART1,USART_FLAG_TC);

6.串口使能。串口使能是通过函数USART_Cmd()来实现的,这个很容易理解,使用方法是:USART_Cmd(USART1,ENABLE);//使能串口

7.开启串口响应中断。有些时候当我们还需要开启串口中断,那么我们还需要使能串口中断,使能串口中断的函数是:

voidUSART_ITConfig(USART_TypeDef*USARTx,uint16_tUSART_IT,FunctionalStateNewState)

这个函数的第二个入口参数是标示使能串口的类型,也就是使能哪种中断,因为串口的中断类型有很多种。比如在接收到数据的时候(RXNE读数据寄存器非空),我们要产生中断,那么我们开启中断的方法是:

USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启中断,接收到数据中断

我们在发送数据结束的时候(TC,发送完成)要产生中断,那么方法是:

USART_ITConfig(USART1,USART_IT_TC,ENABLE);

8.获取相应中断状态。当我们使能了某个中断的时候,当该中断发生了,就会设置状态寄存器中的某个标志位。经常我们在中断处理函数中,要判断该中断是哪种中断,使用的函数是:

ITStatusUSART_GetITStatus(USART_TypeDef*USARTx,uint16_tUSART_IT)

比如我们使能了串口发送完成中断,那么当中断发生了,我们便可以在中断处理函数中调用这个函数来判断到底是否是串口发送完成中断,方法是:

USART_GetITStatus(USART1,USART_IT_TC)

返回值是SET,说明是串口发送完成中断发生。

1.//初始化 IO 串口 1 2.//bound:波特率3.void uart_init(u32 bound)4.{5.GPIO_InitTypeDef GPIO_InitStructure;6.USART_InitTypeDef USART_InitStructure;7.NVIC_InitTypeDef NVIC_InitStructure;8.//①串口时钟使能,GPIO 时钟使能,复用时钟使能9.RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|10.RCC_APB2Periph_GPIOA, ENABLE); //使能 USART1,GPIOA 时钟 11.//②串口复位12.USART_DeInit(USART1); //复位串口 113.//③GPIO 端口模式设置14.GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //ISART1_TX PA.915.GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;16.GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出17.GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA.918.GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //USART1_RX PA.1019.GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入20.GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA.1021.//④串口参数初始化22.USART_InitStructure.USART_BaudRate = bound; //波特率设置23.USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长为 8 位24.USART_InitStructure.USART_StopBits = USART_StopBits_1; //一个停止位25.USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位26.USART_InitStructure.USART_HardwareFlowControl 27.= USART_HardwareFlowControl_None; //无硬件数据流控制28.USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式29.USART_Init(USART1, &USART_InitStructure); //初始化串口30.#if EN_USART1_RX //如果使能了接收31.//⑤初始化 NVIC32.NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;33.NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ; //抢占优先级 334.NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级 335.NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能36.NVIC_Init(&NVIC_InitStructure); //中断优先级初始化37.//⑤开启中断38.USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //开启中断39.#endif40.//⑥使能串口41.USART_Cmd(USART1, ENABLE); //使能串口 42.} 

提醒:《STM32 串口简介》最后刷新时间 2024-03-14 01:09:48,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《STM32 串口简介》该内容的真实性请自行鉴别。