stm32——串口配置一般步骤

发布者:GoldenDream最新更新时间: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  串口配置  一般步骤 引用地址:stm32——串口配置一般步骤

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

推荐阅读最新更新时间:2024-11-07 17:28

STM32自打包的UART串口通讯编程方法
在对通讯时间要求比较高的时候,就需要自己对UART的通讯底层直接进行操作。我以STM32单片机为例,讲一下比较快速的UART编程方法。——其实不止是STM32这么处理,我以前使用过51的单片机,TI的MSP单片机,三菱的16位单片机,都可以采用这种方法。 基本的处理思路如下: 1. UART接收的处理方法 打开UART的接收中断,每收到一个字节就放到接收缓冲区,同时更新接收指针。当连续100ms没有收到接收字符,则认为本次帧接收完毕,置位帧接收完成标志,由主程序进行处理。 2. UART发送的处理方法 将需要发送的数据放到发送缓冲区,设置发送长度。然后发送第一个字节,并打开发送中
[单片机]
STM32运行RTC时死机
阿莫论坛中有个帖子,15楼对死机的原因作出了正确解释, http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3589802&bbs_page_no=12&bbs_id=9999 引用如下: 我也碰到这个问题了,只要设置时间,就停在了RTC_WaitForLastTask(); 发现是由于RTC配置的问题。 在RTC初始化程序中,我们一般要查看BKP寄存器中的数据,判断后备电源是否掉电过。 如果掉电过,则初始化。没有在不执行。 但要设置时钟的话,必需允许PWR和BKP时钟,并允许读取BKP。 而如果仅电源掉电而后备电池不掉电的话,PWR和BKP时钟是没有开放的。 这样就等不
[单片机]
STM32 Keil MDK数据类型定义
/* Copyright (C) ARM Ltd., 1999 */ /* All rights reserved */ /* * RCS $Revision: 138251 $ * Checkin $Date: 2008-10-07 12:02:11 +0100 (Tue, 07 Oct 2008) $ * Revising $Author: agrant $ */ #ifndef __stdint_h #define __stdint_h #ifndef __STDINT_DECLS #define __STDINT_DECLS #undef __CLIBNS #ifdef __cpl
[单片机]
嵌入式stm32学习:I2C-读写EEPROM
bsp_i2c_gpio.h #ifndef _BSP_I2C_GPIO_H #define _BSP_I2C_GPIO_H #include stm32f4xx.h #include inttypes.h #define EEPROM_I2C_WR 0 /* 写控制bit */ #define EEPROM_I2C_RD 1 /* 读控制bit */ /* 定义I2C总线连接的GPIO端口,用户只需要修改下面四行代码即可任意改变SCL和SDA的引脚 */ #define EEPROM_I2C_GPIO_PORT GPIOB #define EEPROM_I2C_G
[单片机]
STM32+DMA+UART+ADC+内部温度传感器
由于文件很多,只列举几个关键的文件。 ADC.c #include STM32Lib\stm32f10x.h u16 ADCCov ; volatile bool ADC_Ok=FALSE; static DMA_InitTypeDef DMA_InitStructure; static ADC_InitTypeDef ADC_InitStructure; //ADC,内部温度传感器配置 void ADCTEMP_Configuration(void) { /* 允许ADC */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); /* ADC1 */ ADC_InitSt
[单片机]
STM32_TEST.axf: Error: L6218E: Undefi
STM32_TEST.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_md.o). 此问题错误提示已经十分清楚的告诉你错在哪里了,Undefined symbol SystemInit ,翻译过来就是:SystemInit 这个符号没有定义,随后的小括号告诉你了,是在startup_stm32f10x_md.o这个文件里面被提及的,这个.o文件在工程里面并没有,它是一个在编译的时候根据.c/.s文件生成的。所以我们只需要找到工程里面的.s或者.c即可,这里对应这个名字的就是startup_stm32f10x_
[单片机]
stm32矩阵键盘输入多位数据
目的:实现矩阵键盘的多位数据输入 思路:使用while循环来规避掉循环检测中键盘的重复输入。 注:键盘检测程序资源众多,此处不列举了。 参数: key_back():键盘检测函数,返回值为key_val(键值),无摁键时返回no_ipt(无按键时的回传值,自订) 方法: //进入while开始键盘检测,获得输入值后回传 u8 key_input_part(void) { while(1) { if( key_back()!= no_ipt) {return key_back();} } } //循环输入,将数据整合为多位并返回,函数传参为输入位数 u16 key_input(int a) { int
[单片机]
可以快速用STM32实现什么?
一、前言 假如你会使用8051,会写C语言,那么STM32本身并不需要刻意地学习。 我们要考虑的是, 我可以快速用STM32实现什么?为什么使用STM32而不是8051? 是因为51的频率太低,无法满足计算需求? 是51的管脚太少,无法满足众多外设的IO? 是51的功耗太大,电池挺不住? 是51的功能太弱,而你要使用SPI、I2C、ADC、DMA? 是51的内存太小而你要存储的东西太多? 当你需要使用STM32某些功能,而51实现不了的时候, 那STM32自然不需要学习,你会直接去寻找STM32某方面的使用方法。 比如要用spi协议的网卡、要使用串口通信、要使用rtos等等... 快速上手的学习步骤 我们假定大家已经对STM32的
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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