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

您所在的位置:网站首页 串口设置的一般步骤 STM32串口的设置和库函数的介绍

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

2024-07-13 09:15| 来源: 网络整理| 查看: 265

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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3