STM32串口的设置和库函数的介绍

发布者:科技革新者最新更新时间:2017-09-17 来源: eefocus关键字:STM32串口  库函数 手机看文章 扫描二维码
随时随地手机看文章

串口设置的一般步骤可以总结为如下几个:
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)

3串口参数初始化


void USART_Init()函数: 



     voidUSART_Init(USART_TypeDef*USARTx,USART_InitTypeDef*USART_InitStruct);

作用:

          根据指定参数初始化相应串口(波特率,字长,停止位,奇偶校验,硬件流控制等)

           主要是用来初始化寄存器BRR以及CR1,CR2,CR3控制寄存器

使用范例:

         USART_InitTypeDefUSART_InitStructure;  

         USART_InitStructure.USART_BaudRate= 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.void USART_Cmd()函数: 


原型:

      voidUSART_Cmd(USART_TypeDef*USARTx,FunctionalStateNewState);

作用:

            使能相应的串口,用来设置寄存器CR1的串口使能位

 使用范例:

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


5.void USART_ITConfig()函数: 

原型:     voidUSART_ITConfig(USART_TypeDef*USARTx,

   uint16_t    USART_IT, FunctionalStateNewState);

 作用:开启串口相应中断,设置串口控制寄存器

  使用范例:

            USART_ITConfig(USART1,USART_IT_RXNE, ENABLE); //开启读数据寄存器非空中断


6.USART_SendData()函数: 

原型:


       voidUSART_SendData(USART_TypeDef* USARTx, uint16_t Data);

  作用:

            发送数据到串口。

 使用范例:

          USART_SendData(USART1,0x12);                    

7.uint16_tUSART_ReceiveData()函数: 

原型: uint16_t USART_ReceiveData(USART_TypeDef*USARTx)

获取串口最新接受的值。

 使用范例:

     USART_ReceiveData(USART1);

8.四个状态标志相关的函数:


FlagStatusUSART_GetFlagStatus(USART_TypeDef*USARTx,uint16_t USART_FLAG);

void USART_ClearFlag(USART_TypeDef*USARTx,uint16_t USART_FLAG);


ITStatusUSART_GetITStatus(USART_TypeDef*USARTx,uint16_t USART_IT);


void USART_ClearITPendingBit(USART_TypeDef*USARTx,uint16_t USART_IT);


以下是一个完整的初始化串口函数和一个中断服务函数:

//初始化IO 串口1 
//bound:波特率
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时钟
   USART_DeInit(USART1);  //复位串口1
//USART1_TX   PA.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); //初始化PA9
   
    //USART1_RX  PA.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA10


   //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;//一般设置为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); //初始化串口
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
    USART_Cmd(USART1, ENABLE);                    //使能串口 


}



void USART1_IRQHandler(void)                //串口1中断服务程序
{
u8 Res;
#ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使用ucosII了.
OSIntEnter();    
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART1);//(USART1->DR);//读取接收到的数据

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)USART_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;//接收数据错误,重新开始接收 
}  
}
}    
     } 

#ifdef OS_TICKS_PER_SEC//如果时钟节拍数定义了,说明要使用ucosII了.
OSIntExit();   
#endif


关键字:STM32串口  库函数 引用地址:STM32串口的设置和库函数的介绍

上一篇:STM32串口设定流程总结
下一篇:STM32的nvic之理解

推荐阅读最新更新时间:2024-03-16 15:37

STM32串口发送数据第一个字节丢失问题
STM32串口发送必须先检测状态,否则第一个字节无法发出,发送完毕,必须检测发送状态是否完成,否则,发送不成功,使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01 0x02 0x03 0x04..接收端收到的数据为:0x02 0x03 0x04,第一个数据丢失。换成发送别的数值的数据,如0x06 0x0ff,则接收到0x0ff,0x06丢失。错误依旧。 故障排除过程: 1、刚开始怀疑是接收端的错误,我是使用电脑串口,运行串口辅助调试工具接收,换成其他软件后,发现故障依旧,而且电脑软件一直是开启状态,不像和电脑软件有关。 2、使用单步调试,单步运行各个发送指令,都正常。能收到0x01
[单片机]
STM32库函数SystemInit()的理解
SystemInit()这个函数出现在main()函数的第一行,可以看出它的重要性。以前关于SystemInit()这个函数从来没有关心过,只知道这是进行 STM32 系统初始化的一个函数。今天决定仔细看看,重新开始STM32的学习。这个函数在system_stm32f10x.c中,此C文件主要就是干具体硬件配置相关的工作。 void SystemInit (void) { RCC- CR |= (uint32_t)0x00000001; #ifndef STM32F10X_CL RCC- CFGR &= (uint32_t)0xF8FF0000; #else RCC- CFGR &= (uint32_
[单片机]
STM32小白入门(第六天)-------串口通信
今天要讲的是串口通信,个人觉得挺重要的,以后USART、蓝牙通信,485等等都要用到串口,面试官也喜欢问一些串口的问题,比如问你串口参数,数据位几位,波特率多少,还会问你怎样设置串口等等。 一、串口概述 1. 定义 串口通信是一种设备间非常常用的串行,以比特位的形式发送或接收数据,电子工程师经常使用这种方式来调试数据。 2. 开发板硬件用于串口跟PC相连的时候有以下注意事项: A. 使用到usb转串口,所以得安装驱动 B. 跳线帽要进行短接 二、程序设计 1、设置引脚功能复用 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE)
[单片机]
<font color='red'>STM32</font>小白入门(第六天)-------<font color='red'>串口</font>通信
stm32驱动Lora串口模块
本文使用的硬件 stm32MCU+亿佰特-Lora串口模块,型号E32-433T20D 定义各配置字节 //////////////////////////////////////////// /*配置报文头部选项*/ #define HEAD_Save 0xC0//配置后掉电保存 #define HEAD_NotSave 0XC1//配置后掉电不保存 //////////////////////////////////////////// /*奇偶校验选项*/ #define SPED_Partity_8N1 0x00//不校验,1停止位【默认】 #define SPED_Partity
[单片机]
<font color='red'>stm32</font>驱动Lora<font color='red'>串口</font>模块
STM32串口接收使用DMA双缓冲
#define IMAGE_BUFFER_SIZE 100 //以字为单位 经试验,增大这个数值速度并未提升 u32 Image_Buffer1 ={0}; u32 Image_Buffer2 ={0}; //OV2640 JPEG模式接口配置 void OV2640_JpegDcmiInit(void) { DCMI_InitTypeDef DCMI_InitStructure; DMA_InitTypeDef DMA_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; //NVIC /*** Configures the DCMI to interface with the
[单片机]
再造STM32---第六部分:自己写库—构建库函数雏形
本章参考资料: 《STM32F4xx 中文参考手册》 、 《STM32F429 规格书》 虽然我们上面用寄存器点亮了 LED,乍看一下好像代码也很简单,但是我们别侥幸以后就可以一直用寄存器开发。在用寄存器点亮 LED 的时候,我们会发现 STM32 的寄存器都是 32 位的,每次配置的时候都要对照着《STM32F4xx 参考手册》中寄存器的说明,然后根据说明对每个控制的寄存器位写入特定参数,因此在配置的时候非常容易出错,而且代码还很不好理解,不便于维护。所以学习 STM32 最好的方法是用软件库,然后在软件库的基础上了解底层,学习遍所有寄存器。 本讲建议看火哥视频,很重要。 6.1 什么是 STM32 函数库:
[单片机]
再造STM32---第六部分:自己写库—构建<font color='red'>库函数</font>雏形
MPLAB X IDE使用心得
这几天花了很大的力气,终于把官方给的库函数成功烧录到入门的以太网套件中,终于能点亮板子上的led。这也没有白费我这几天的努力。 下面,就简单的介绍我的开发心得吧 (1)开发环境的配置 首先,我们需要下载和安装MPLABX-v2.10,harmony_v0_80_01b,xc32-v1.32这三个软件。我对这三个软件做简单的说明:MPLABX-v2.10是一个用于开发Microchip单片机和数字信号控制器的应用。可以开发Microchip的8位,16位,32位等的单片机。功能很强大。 harmony_v0_80_01b是一个固件库,里面有PIC32相关的例程和一些应用的API。xc32-v1.32是一个编译器。八折
[单片机]
MPLAB X IDE使用心得
CubeMX 5.5 修改HAL库库函数版本
最初我是按照软件推荐,自动按安装的1.15的。 为了和正点原子的例程统一库函数版本,就下载了1.11。 但是在工程配置界面始终没有办法修改 hal库 版本的选择: 关闭CubeMX,使用记事本打开工程文件: 修改版本号: 重新打开工程,库版本修改成功: 工程生成成功:
[单片机]
CubeMX 5.5 修改HAL库<font color='red'>库函数</font>版本
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

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