STM32F1-串口1改串口2
  fLutY3C6VwgE 2023年11月19日 13 0

一、串口1源代码

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 

}

二、串口2源代码

void uart_init(u32 bound){
  //GPIO端口设置
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
	 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB2Periph_AFIO, ENABLE);
  
	//USART1_TX   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //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	  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA10
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

  //Usart1 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART2_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(USART2, &USART_InitStructure); //初始化串口1
  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断
  USART_Cmd(USART2, ENABLE);                    //使能串口1 

}

三、区别与注意事项

从下图中可以观察出,串口1配置开启了串口和IO口的时钟,而串口2则增加了一个AFIO复用时钟
也就是说如果改成串口2,3应该增加开启复用的时钟(3没试过,2实测成功)

STM32F1-串口1改串口2_串口

STM32F1-串口1改串口2_初始化_02

关于不开启keil的Microlib模式使用printf的方法?

这个函数原子的代码是封装好了的,调用usart头文件直接可以使用,但是需要注意的是?

STM32F1-串口1改串口2_初始化_03

如上图,如果是想用串口2输出printf则需要把fputc里面的USART1换成USART2

函数可以直接拷贝,实测成功,如有错误欢迎指正一起进步!


2023-7-1 优化串口部分代码

优化各个参数为宏定义 方便移植和修改

先贴代码 可以直接用我现在这一版本 实测可用 只需修改 UART_X 这个参数就可以在串口1 2 3中切换

#include "usart2.h"
//方便移植修改 只需要在修改数字即可快速配置串口
//1-UART1 2-UART2 3-UART3
#define UART_X 2

#if UART_X == 1
    #define UARTGPIO   GPIOA
		#define UART_C     USART1
		#define UART_TXD   GPIO_Pin_9
    #define UART_RXD   GPIO_Pin_10	
    #define UARTAPB    RCC_APB2Periph_GPIOA
		#define UARTCLK    RCC_APB2Periph_USART1
		#define UARTIRQN_X USART1_IRQn		
#elif UART_X == 2
    #define UARTGPIO   GPIOA
		#define UART_C     USART2
		#define UART_TXD   GPIO_Pin_2
    #define UART_RXD   GPIO_Pin_3	
    #define UARTAPB    RCC_APB2Periph_GPIOA
		#define UARTCLK    RCC_APB1Periph_USART2
		#define UARTIRQN_X USART2_IRQn		
#elif UART_X == 3
    #define UARTGPIO   GPIOB
		#define UART_C     USART3
		#define UART_TXD   GPIO_Pin_10
    #define UART_RXD   GPIO_Pin_11	
    #define UARTAPB    RCC_APB2Periph_GPIOB
		#define UARTCLK    RCC_APB1Periph_USART3
		#define UARTIRQN_X USART3_IRQn		
#endif
	

void uart2_init(u32 bound){
  //GPIO端口设置
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
	 
  RCC_APB2PeriphClockCmd(UARTAPB, ENABLE);
  RCC_APB1PeriphClockCmd(UARTCLK, ENABLE);
  
	//USART_TX
  GPIO_InitStructure.GPIO_Pin = UART_TXD; 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
  GPIO_Init(UARTGPIO, &GPIO_InitStructure);//初始化GPIOA.9
   
  //USART_RX	  
  GPIO_InitStructure.GPIO_Pin = UART_RXD;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_Init(UARTGPIO, &GPIO_InitStructure);//初始化GPIOA.10  

  //NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = UARTIRQN_X;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级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(UART_C, &USART_InitStructure);     //初始化串口
  USART_ITConfig(UART_C, USART_IT_RXNE, ENABLE);//开启串口接受中断
  USART_Cmd(UART_C, ENABLE);                    //使能串口

}



void USART2_IRQHandler(void)                	//串口1中断服务程序
	{
	u8 Res;
	if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
		{
		  Res =USART_ReceiveData(USART2);	//读取接收到的数据			
    } 
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月19日 0

暂无评论

推荐阅读
  tprTMCWDkFAR   2023年12月07日   13   0   0 头文件#include初始化
  UYSNSBVoGd8R   2023年12月08日   13   0   0 引脚#include#define
fLutY3C6VwgE