STM32学习和实践笔记(26):USART配置步骤

发布于:2024-05-08 ⋅ 阅读:(37) ⋅ 点赞:(0)

(USART相关库函数在stm32f10x_usart.c和stm32f10x_usart.h文件中)。

对USART进行配置,具体步骤如下:

1)使能串口时钟及GPIO端口时钟

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

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

2)GPIO端口模式设置,设置串口对应的引脚为复用功能  (也就是对应的引脚不是普通的GPIO功能,而是使用其对应的复用功能 (列如此处的TXD,RXD功能)                           

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;

3)初始化串口参数,包含波特率、字长、奇偶校验等参数                               

void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef*

USART_InitStruct);

typedef struct

{

  uint32_t USART_BaudRate;            //波特率

  uint16_t USART_WordLength;          //字长(有8位和9位两种,通常用8位)

  uint16_t USART_StopBits;            //停止位

  uint16_t USART_Parity;              //校验位

  uint16_t USART_Mode;                //USART模式

  uint16_t USART_HardwareFlowControl; //硬件流控制

} USART_InitTypeDef;

例如:

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

4)使能串口

void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);

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

5)设置串口中断类型并使能                               

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);//开启发送中断

对应的串口中断类型可在stm32f10x_usart.h中查找到

6)设置串口中断优先级,使能串口中断通道

NVIC初始化库函数是NVIC_Init()

7)编写串口中断服务函数                              

USART1_IRQHandler

ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)

{

  ...//执行USART1接收中断内控制

}

void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t

USART_FLAG);

第二个参数为状态标志选项,可选参数可在stm32f10x_usart.h中查找到

例如:

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

{

  u8 r;

  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断

  {

  r =USART_ReceiveData(USART1);//(USART1->DR);  //读取接收到的数据

  USART_SendData(USART1,r);

  while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);

  }

  USART_ClearFlag(USART1,USART_FLAG_TC);

}