STM32学习笔记-基础外设-USART

STM32学习笔记-基础外设-USART

说明:这个文章综合了截至发布之前所有的博客,用于自己学习记录,顺便分享出来。谢谢!!








一、先贴代码

1、USART基础配置

/*配置USART1中断分组NVIC并使用中断*/
static void USART_NVIC_CFG(void)
{
	NVIC_InitTypeDef NVIC_InitStructure; 

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//嵌套向量中断控制器组选择
 	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//配置 USART 为中断源
 	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢断优先级为 1 
 	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//子优先级为 1 
 	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}
/*USART_GPIO初始化*/
void USART_GPIO_CFG
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA, ENABLE);// 打开串口 GPIO 的时钟
	// 将 USART Tx 的 GPIO 配置为推挽复用模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
 
	// 将 USART Rx 的 GPIO 配置为浮空输入模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/*USART参数配置*/
void USART_CFG(void)
{
	USART_InitTypeDef USART_InitStructure;

	RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1, ENABLE);// 打开串口外设的时钟
 
 // 配置串口的工作参数

	USART_InitStructure.USART_BaudRate = 115200 ; // 配置波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 配置 帧数据字长
	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_ITConfig(USART1, USART_IT_IDLE, ENABLE);
	USART_Cmd(USART1, ENABLE); // 使能串口
 }


char rece_buffer[255];  //接收缓存区
int RxCounter;   //接收了多少字符
uint8_t USART1_rece_Flag=0; //接收一帧的标志位
 /*USART中断服务函数*/
void USART1_IRQHandler(void)
{
	u8 clear=clear;
	
	USART_ClearFlag(USART1,USART_FLAG_TC);
	if(USART_GetITStatus(USART1,USART_IT_RXNE)!=Bit_RESET)       //接收一字节中断 
	{
		rece_buffer[RxCounter++]=USART1->DR;
	}	 
	else if(USART_GetFlagStatus(USART1,USART_FLAG_IDLE)!=Bit_RESET)  //接收一帧中断
	{					
		clear=USART1->SR;
		clear=USART1->DR;	//先读SR在读DR清除USART_FLAG_IDLE
		USART1_rece_Flag=1;
	}
}






2、启用printf函数

#include <stdio.h>

#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE
{
	int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式    
_sys_exit(int x)
{
	x = x;
}
**
  * @brief  重定向重写C函数库中的fputc函数,重定向后可使用printf函数
  * @param  ch:要输出的字节
  * @param  *f:无用
  * @retval 无
  */
int fputc(int ch, FILE *f)
{
    USART_SendData(USART1_HANDLE, (uint8_t)ch);         /* 发送一个字节数据到串口 */
    while (USART_GetFlagStatus(USART1_HANDLE, USART_FLAG_TXE) == RESET);    /* 等待发送完毕 */
    return (ch);
}





二、串口配置步骤

1、打开时钟(RCC配置)
  USART1 的时钟来源于 APB2 总线时钟(最大频率为 90MHz)。USART2、USART3、UART4、UART5的时钟来源于 APB1 总线时钟(最大频率为 45MHz)。:如果是UART1,则挂在APB2桥上,因此采用RCC_APB2PeriphClockCmd()进行初始化,其余的UART2~5均挂在APB1上,采用RCC_APB1PeriphClockCmd()进行初始化。

2、GPIO配置
  GPIO的属性包含在结构体GPIO_InitTypeDef,其中对于TX引脚,GPIO_Mode字段设置为GPIO_Mode_AF_PP(复用推挽输出),GPIO_Speed切换速率设置为GPIO_Speed_50MHz;对于RX引脚,GPIO_Mode字段设置为GPIO_Mode_IN_FLOATING(浮空输入),不需要设置切换速率。最后通过GPIO_Init()使能IO口。

3、NVIC配置
  STM32在只有一个中断的情况下,仍然需要配置优先级,其作用是使能某条中断的触发通道。STM32的中断有至多两个层次,分别是抢占优先级(主优先级)和子优先级(从优先级),而整个优先级设置参数的长度为4位,因此需要首先划分抢占优先级位数和子优先级位数,通过NVIC_PriorityGroupConfig()实现;特定设备的中断优先级NVIC的属性包含在结构体NVIC_InitTypeDef中,其中字段NVIC_IRQChannel包含了设备的中断向量,保存在启动代码中;字段NVIC_IRQChannelPreemptionPriority为主优先级NVIC_IRQChannelSubPriority为从优先级,取值的范围应根据位数划分的情况而定;最后NVIC_IRQChannelCmd字段是是否使能,一般置为ENABLE。最后通过NVIC_Init()来使能这一中断向量。

4、USART配置
  通过结构体USART_InitTypeDef来确定。UART模式下的字段如下:
    USART_BaudRate:波特率(每秒能传输的数据位),缺省值为9600。
    USART_WordLength:字长
    USART_StopBits:停止位
    USART_Parity:校验方式(奇偶校验)
    USART_HardwareFlowControl:硬件流控制
    USART_Mode:单/双工,即收发状态。
    最后通过USART_Init()来设置。




三、部分串口与引脚图

在这里插入图片描述




四、USART BUG总结

STM32中关于串口中断的调试(不断进入发送中断的原因)

STM32 串口中的硬件BUG,请注意!

STM32F103串口BUG——一个神奇的BUG

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值