Fork me on GitHub

STM32串口通信

STM32串口通信

串口常用寄存器

  • USART_SR 状态寄存器
  • USART_DR 数据寄存器
  • USART_BRR 波特率寄存器

串口配置的步骤和函数

  1. 串口时钟使能,GPIO时钟使能

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//串口时钟使能
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//GPIO时钟使能
    
  2. 串口复位(可省略)

    USART_DeInit();
    
  3. GPIO端口模式设置

    //由于是是串口通信,所以需要实现端口复用,拿USART1来说,用到了PA9,PA10
    //所以需要将这两个GPIO的模式设置为:复用推挽、浮空输入/带上拉输入
    	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//设置为复用推挽
    	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
    	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
    	GPIO_Init(GPIOA,&GPIO_InitStruct);
    	
    	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入/带上拉输入
    	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
    	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
    	GPIO_Init(GPIOA,&GPIO_InitStruct);
    
  4. 串口参数初始化

    //串口参数初始化主要是对串口通信的波特率等参数进行初始化
    //然后使用 USART_Init() 函数对指定串口进行初始化
        //参数设置
    	USART_InitStruct.USART_BaudRate = 115200;
    	USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    	USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    	USART_InitStruct.USART_Parity = USART_Parity_No;
    	USART_InitStruct.USART_StopBits = USART_StopBits_1;
    	USART_InitStruct.USART_WordLength = USART_WordLength_8b;
    	//初始化函数
    	USART_Init(USART1,&USART_InitStruct);
    
  5. 开启中断并初始化NVIC

    	//开启中断:开启USART1的接收中断,即在USART1接收到数据之后就会开启中断服务
    	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
    
        //初始化中断
    	NVIC_InitStrue.NVIC_IRQChannel = USART1_IRQn;
    	NVIC_InitStrue.NVIC_IRQChannelCmd = ENABLE;
    	NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority = 1;
    	NVIC_InitStrue.NVIC_IRQChannelSubPriority = 1;
    	NVIC_Init(&NVIC_InitStrue);
    
  6. 使能串口

    	USART_Cmd(USART1,ENABLE);
    
  7. 编写中断处理函数

    //本函数是已经定义过的
    void USART1_IRQHandler(void)
    {
    	u8 res;
    	//获取当前串口传输的状态
    	if(USART_GetITStatus(USART1,USART_IT_RXNE)){
    		//对接收到的数据进行赋值
    		res = USART_ReceiveData(USART1);
    		//使用发送函数将接收到的数据进行返回
    		USART_SendData(USART1,res);
    	}
    }
    

完整程序

#include "stm32f10x.h"


void My_USART1_Init(void)
{
	
	GPIO_InitTypeDef GPIO_InitStruct;
	USART_InitTypeDef USART_InitStruct;
	NVIC_InitTypeDef NVIC_InitStrue;
	
	
	//GPIO时钟使能
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//串口时钟使能
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	
	//设置GPIO端口模式
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	//串口初始化
	USART_InitStruct.USART_BaudRate = 115200;
	USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_InitStruct.USART_Parity = USART_Parity_No;
	USART_InitStruct.USART_StopBits = USART_StopBits_1;
	USART_InitStruct.USART_WordLength = USART_WordLength_8b;
	USART_Init(USART1,&USART_InitStruct);
	
	//使能串口
	USART_Cmd(USART1,ENABLE);
	
	//开启中断:开启USART1的接收中断,即在USART1接收到数据之后就会开启中断服务
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
	
	//初始化中断
	NVIC_InitStrue.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStrue.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStrue.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStrue);

}


//中断服务函数
void USART1_IRQHandler(void)
{
	u8 res;
	//获取串口传输状态
	if(USART_GetITStatus(USART1,USART_IT_RXNE)){
		//接收串口数据
		res = USART_ReceiveData(USART1);
		//发送串口数据
		USART_SendData(USART1,res);
	}
}

int main(void)
{
	//测试中断 设置中断优先级分组:将系统的中断优先级设置为2
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  My_USART1_Init();
	while(1)
	{
		USART1_IRQHandler();
	}
}

posted @ 2023-03-07 18:52  Blueshadow^_^  阅读(59)  评论(0编辑  收藏  举报