stm32——串口配置一般步骤

2020-07-03来源: eefocus关键字:stm32  串口配置  一般步骤

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


RCC_APB2PeriphClockCmd()


2、串口复位


USART_DeInit(); ——非必需


3、GPIO端口模式设置


GPIO_Init(); ——模式设置为GPIO_Mode_AF_PP


4、串口参数初始化


USART_Init();


5、开启中断并初始化NVIC(当开启中断的时候才需要这个步骤)


NVIC_Init();


USART_ITConfig();


6、使能串口


USART_Cmd();


7、编写中断处理函数


USARTx_IRQHandler();


8、串口数据收发


void USART_SendData();//发送数据到串口,DR


uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据


9、串口传输状态获取


FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);


void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);


相关代码

void uart_init(u32 bound){

  //GPIO端口设置

  GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

 

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

  

//USART1_TX   GPIOA.9

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

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

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

   

  //USART1_RX   GPIOA.10初始化

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10

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

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

 

  //Usart1 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); //根据指定的参数初始化VIC寄存器

  

   //USART 初始化设置

 

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

  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断

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

 

}


中断中的相关代码

void USART1_IRQHandler(void)                //串口1中断服务程序

{

u8 Res;

#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.

OSIntEnter();    

#endif

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)

{

Res =USART_ReceiveData(USART1); //读取接收到的数据

if((USART_RX_STA&0x8000)==0)//接收未完成

{

if(USART_RX_STA&0x4000)//接收到了0x0d

{

if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始

else USART_RX_STA|=0x8000; //接收完成了 

}

else //还没收到0X0D

{

if(Res==0x0d)USAR _RX_STA|=0x4000;

else

{

USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;

USART_RX_STA++;

if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收   

}  

}

}     

     } 

#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.

OSIntExit();   

#endif

}

关键字:stm32  串口配置  一般步骤 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic502059.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32系统学习——USART(串口通信)
下一篇:STM32F4硬件IIC+DMA使用

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32F10X ADC原理详解(STM32F103ZET6)
STM32ADC的工作原理模/数转换器STM32F10x  ADC特点12位逐次逼近型的模拟数字转换器。最多带3个ADC控制器最多支持18个通道,可最多测量16个外部和2个内部信号源。支持单次和连续转换模式转换结束,注入转换结束,和发生模拟看门狗事件时产生中断。通道0到通道n的自动扫描模式自动校准采样间隔可以按通道编程规则通道和注入通道均有外部触发选项转换结果支持左对齐或右对齐方式存储在16位数据寄存器ADC转换时间:最大转换速率 1us。(最大转换速度为1MHz,在ADCCLK=14M,采样周期为1.5个ADC时钟下得到。)ADC供电要求:2.4V-3.6VADC输入范围:VREF- ≤  VIN 
发表于 2020-07-25
<font color='red'>STM32</font>F10X ADC原理详解(<font color='red'>STM32</font>F103ZET6)
STM32控制步进电机程序
、IN3:PC0、IN4:PC13、//步进电机初始化函数void Motor_Init(void){        GPIO_InitTypeDef GPIO_InitStructure;                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//开启时钟                GPIO_InitStructure.GPIO
发表于 2020-07-25
<font color='red'>STM32</font>控制步进电机程序
基于IAR环境下STM32F103单片机读取BME280程序
自己编写的基于IAR环境下STM32F103单片机读取BME280程序,没有太多的寄存器操作,简单易懂,可以直接调用,上电后只要对IO口初始化,调用函数Bme_ReadDigValue()读取校准寄存器参数并保存,再调用函数Bme_Init()初始化之后就可以用函数Bme_ReadStatus()读取传感器状态判断是否读取数据了,也可不判断传感器状态直接读取数据,读取数据直接调用函数ReadBme280()。单片机源程序:void ReadBme280(){        u32 value_ad;        double var1; 
发表于 2020-07-25
STM32步进伺服电机梯形加速源程序 单轴简易运动控制器
步进电机梯形加速程序单片机源程序如下:/*基于STM32的单轴简易运动控制器/脉冲发生器*//*脉冲+方向控制步进伺服电机*//*优化记录:增加急停GPIOC.0、正向极限GPIOC.1、负向极限GPIOC.2等输入IO接点中断修改TIMx_PSC一个寄存器的值,而不是修改TIMx_ARR预加载寄存器+TIMx_CCRx比较值寄存器两个值,缩短中断处理时间定位指令DRVI/DRVA中,目标频率设定过高、而实际输出脉冲数过少时,则不必加速到目标频率即进入减速区*//*DRVI(A);相对定位,输出A(A取绝对值)个脉冲A不能为0若A为正数,则方向为正、GPIOB.0为高电平若A为负数,则方向为负、GPIOB.0为低电平DRVA
发表于 2020-07-25
STM32实现ADS1256进行数据电压采集程序
通过cubeMX配置STM32RCT6的IO口与ads1256ADC模块的连接IO口工作模式SPI,还有接受中断接受状态引脚,最终ADC采集数据经过卡尔曼滤波器滤波输出单片机源程序如下:#include "ads1256.h"int32_t adcVaule = 0x00;float voltage = 0x00;float filterVoltage = 0.0;float filterVoltage2 = 0.0;void delayXus(uint16_t us) {    uint16_t diff = 0xffff - 5 - us;    //设置定时器的计数
发表于 2020-07-25
基于WiFi的网络授时时钟(带实时天气更新)STM32程序设计
本方案采用的是MCU+AT指令的形式开发,MCU是大家比较熟悉的意法半导体公司STM32F103C8T6,WiFi模块使用的是安信可ESP-12F,本方案是一个Demo设计,比较简单,仅实现了功能,算是一个抛砖引玉吧!先上视频演示:https://v.youku.com/v_show/id_XN ... m=a2hzp.8244740.0.0WiFi模块资料链接:wiki点ai-thinker点com/esp8266STM32F103C8芯片资料链接:https://www.stmicroelectronics.c ... 103c8.html#overview硬件部分,由时钟电路+WiFi模块+MCU最小系统+OLED
发表于 2020-07-25
基于WiFi的网络授时时钟(带实时天气更新)<font color='red'>STM32</font>程序设计
小广播
何立民专栏 单片机及嵌入式宝典

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

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