STM32串口的理解

发布者:温暖心情最新更新时间:2024-08-12 来源: cnblogs关键字:STM32  串口  NVIC 手机看文章 扫描二维码
随时随地手机看文章

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

1) 串口时钟使能,GPIO 时钟使能

2) 串口复位

3) GPIO 端口模式设置

4) 串口参数初始化

5) 开启中断并且初始化 NVIC(如果需要开启中断才需要这个步骤)

6) 使能串口

7) 编写中断处理函数


淡蓝色是以串口1举例,深蓝色是以结构体函数,可拿结构体复制到Keil5中,右键


仔细看结构体里要求的模式等


1.串口时钟使能:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1);

 


2.串口复位:

void USART_DeInit(USART_TypeDef* USARTx);//串口复位

假设,复位串口 1:

USART_DeInit(USART1); //复位串口


3.串口参数初始化:设置波特率,字长,停止位,奇偶校验位,硬件数据流控制,模式(收,发):

void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);

假设,对串口1参数初始化


USART_InitStructure.USART_BaudRate = bound; //波特率;

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

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);

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

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

uint16_t USART_ReceiveData(USART_TypeDef* USARTx);

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

 

5.串口状态:

FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);

RXNE:读取数据

判断读寄存器是否非空(RXNE),操作库函数的方法是:

USART_GetFlagStatus(USART1, USART_FLAG_RXNE);

TC:发送完成

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

USART_GetFlagStatus(USART1, USART_FLAG_TC);


6.串口使能:

USART_Cmd(USART1, ENABLE);

 

7.开启串口响应中断:

void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT,FunctionalState NewState)

收到数据产生中断

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

发送数据开启中断

USART_ITConfig(USART1,USART_IT_TC,ENABLE);

 


8.获取相应中断状态:

USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)

串口发送完成中断,那么当中断发生了, 我们便可以在中断处理函数中调用这

个函数来判断到底是否是串口发送完成中断,方法是:

USART_GetITStatus(USART1, USART_IT_TC)

 

串口例子


//初始化 IO 串口 1

//bound:波特率


void uart_init(u32 bound)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    USART_InitTypeDef USART_InitStructure;

    NVIC_InitTypeDef NVIC_InitStructure;


    //①串口时钟使能,GPIO 时钟使能,复用时钟使能

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能 USART1,GPIOA 时钟


    //②串口复位

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


    //③GPIO 端口模式设置

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //ISART1_TX PA.9

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出

    GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA.9    

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //USART1_RX PA.10

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入

    GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA.10


    //④串口参数初始化

    USART_InitStructure.USART_BaudRate = bound; //波特率设置

    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); //初始化串口

    #if EN_USART1_RX //如果使能了接收


    //⑤初始化 NVIC

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ; //抢占优先级 3

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级 3

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能

    NVIC_Init(&NVIC_InitStructure);  //中断优先级初始化


    //⑤开启中断

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //开启中断

    #endif

    

    //⑥使能串口

    USART_Cmd(USART1, ENABLE); //使能串口

}


关键字:STM32  串口  NVIC 引用地址:STM32串口的理解

上一篇:USART1_IRQHandler 函数的理解
下一篇:中断NVIC优先级的理解

推荐阅读最新更新时间:2024-11-08 11:04

征服stm32 can 标准帧 扩展帧 过滤器配置
如果过滤器配置不好,就会导致发送的数据接收不到,下面是过滤器配置的代码 //配置过滤器 CAN_FilterInitStructure.CAN_FilterNumber=0; //过滤器0 CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位 /*******************************标准帧配置***********************************
[单片机]
stm32 堆和栈(stm32 Heap & Stack)
关于堆和栈已经是程序员的一个月经话题,大部分有是基于os层来聊的。 那么,在赤裸裸的单片机下的堆和栈是什么样的分布呢?以下是网摘: 刚接手STM32时,你只编写一个 int main() { while(1); } BUILD://Program Size: Code=340 RO-data=252 RW-data=0 ZI-data=1632 编译后,就会发现这么个程序已用了1600多的RAM,要是在51单片机上,会心疼死了,这1600多的RAM跑哪儿去了,分析map,你会发现是堆和栈占用的,在startup_stm32f10x_md.s文件中,它的前面几行就有以上定义,这下该明白了吧。 Stack_Size
[单片机]
<font color='red'>stm32</font> 堆和栈(<font color='red'>stm32</font> Heap & Stack)
通用定时器-输入捕获实验
本节定时器PWM输出主要涉及到定时器框图左下方部分,即输入捕获部分 输入捕获工作过程(以通道1为例) 一个通道的框图: 作用:捕获TIMx_CH1通道信号的跳变,并触发捕获中断 我们将此过程拆分为4个部分 1,设置输入捕获滤波器 fDTS是根据TIMx_CR1-CKD 的设置确定的 如果TIMx_CR1-CKD 设置为00,则fTDS=fCK_INT = 72Mhz 如果TIMx_CR1-CKD 设置为10,则fTDS=fCK_INT / 4 = 18Mhz TIMx_CCMR1-ICF 输入捕获1滤波器,设置输入采样频率和数字滤波长度 如果TIMx_CCMR1-IC1F =0011,采样频率fSAMP
[单片机]
通用定时器-输入捕获实验
STM32一键连接JQ8400-FLJQ8900语音模块程序分析
首先是JQ8900.C #include JQ8900.h #include delay.h //初始化PB5使能端口的时钟 //SDA IO初始化 void JQ8900_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOE, ENABLE); //使能PB,PE端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //LED0-- PB.5
[单片机]
stm32专题三十一:电源管理
stm32的电源管理 上电复位与掉电复位(POR PDR): 这个滞回电压,是为了让单片机容忍一定程度的电压波动,而不是只要电压稍微一变化,就立刻掉电复位。 可编程电压监测器PVD: PVD中断的上升沿或下降沿,表示的是VDD电压是超过阈值还是低于阈值,关于PVD中断的描述如下: stm32电源系统 为了方便进行电源管理,STM32 把它的外设、内核等模块跟据功能划分了供电区域,其内部电源区域划分如图: CPU内核为1.8V供电,以降低功耗,整个1.8V供电区域由电压调节器单独供电,有时CPU可以休眠,有时可以不休眠,这是由电压调节器来提供的。 关于时钟的具体描述: 这里,值得注意的是后备供电区
[单片机]
<font color='red'>stm32</font>专题三十一:电源管理
第39节:判断数据头来接收一串数据的串口通用程序框架
开场白: 上一节讲了判断数据尾的程序框架,但是在大部分的项目中,都是通过判断数据头来接收数据的,这一节要教会大家两个知识点: 第一个:如何在已经接收到的一串数据中解析数据头协议并且提取有效数据。 第二个:无论是判断数据头还是判断数据尾,无论是单片机还是上位机,最好在固定协议前多发送一个填充的无效字节0x00,因为硬件原因,第一个字节往往容易丢失。 具体内容,请看源代码讲解。 (1)硬件平台: 基于朱兆祺51单片机学习板。 (2)实现功能: 波特率是:9600 。 通讯协议:EB 00 55 XX YY 加无效填充字节后,上位机实际上应该发送:00 EB 00 55 XX YY 其中第1位00是无效填充字节,防止由
[单片机]
基于TMS320VC8420多信道缓冲串口的DMA方式数据传输
    摘要: 介绍TMS320VC8420的多信道缓冲串口(McBSP)的基础上,分析了其控制寄存器的配置和工作过程,并给出了直接存储器访问(DMA)方式下利用McBSP进行通信的方法及程序代码。     关键词: McBSP 子地址寄存器 DMA TMS320VC5402是TI公司C54x系列定点DSP芯片中的新产品它集中了此系列早期产品的优点,并提供了许多新的功能,开发和使用更加方便。C5402具有灵活的指令系统和操作性能,它可选择助记符指令或算术指令作为编程指令,同时支持汇编语言和C语言的单独或混合编程。C5402采用改进的Harvanl处理结构,指令流水线操作。计算和处理速度很高,系统单指令周期可达
[应用]
STM32中断优先级实例
本例示范了如何使用嵌套向量中断控制器(Nested Vectored Interrupt Controller)来设置各个中断的优先级(Preemption Priority和SubPriority)。 设置2条外部中断线路(线路3和线路4)在每一个输入信号下降沿产生中断,开启SysTick中断。 这3个中断的优先级设置如下: EXTI Line3: PreemptionPriority = PreemptionPriorityValue SubPriority = 0 EXTI Line4: PreemptionPriority = 0 SubPriority = 1 Sys
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved