STM32基础之库函数串口的使用(串口1)

       高容量的STM32(STM32F103ZET6为例)具有5个串口,想知道具体管脚对应的串口可以看 https://blog.csdn.net/m0_58832575/article/details/124085911?spm=1001.2014.3001.5501

里面对比了两种不同STM32所对应的定时器管脚。

硬件连接

        串口所对应的GPIO得有相对应的初始化,而串口很强大最多有五个管脚,所对应的GPIO的模式也不同。

TX:发送数据输出引脚。                           

RX:接收数据输入引脚。

                 通常使用的都是全双工模式,所以Tx设置为推挽复用输出,Rx设置为浮空输入。

 

                                         STM32F103ZET6五个串口对应的接线方式

串口常用的库函数

函数名作用形式参数、返回值形式参数1形式参数2
USART_Init()串口初始化2、0串口号串口配置结构体
USART_DeInit()复位1、0串口号
USART_Cmd()串口使能函数2、0串口号ENABLE(使能的意思)
USART_ITConfig()串口中断使能3、0串口号

参数2:中断的形式

参数3:ENABLE

USART_SendData()发送数据2、0串口号发送的数据
USART_ReceiveData()接收数据1、1串口号
USART_GetFlagStatus()获取状态标志位2、1串口号标志方式
USART_ClearFlag()清除状态标志位2、0串口号标志方式
USART_GetITStatus()获取中断状态标志位2、0串口号中断方式
USART_ClearITPendingBit()清除中断状态标志位2、0串口号中断方式

中断方式:

USART_IT_PE          :             
USART_IT_TXE                   
USART_IT_TC                     
USART_IT_RXNE    :接收中断 :接收到数据产生中断(用的最多一种,其余我也没用知道资料)         
USART_IT_IDLE                    
USART_IT_LBD                      
USART_IT_CTS                      
USART_IT_ERR                      
USART_IT_ORE                     
USART_IT_NE                       
USART_IT_FE    

标志方式  :本人暂时还没有用到,等用到在解释,知道怎么用也可以留在评论区,谢谢              

串口1的配置过程

1、先开启串口1和GPIOA时钟,Tx,Rx挂接在GPIOA上 

	RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA,ENABLE);//打开GPIOA的时钟
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1,ENABLE);//打开串口1的时钟

 2、初始化串口

    USART_InitTypeDef USART_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);//使能串口

3、初始化GPIOA

    GPIO_InitTypeDef GPIO_InitStruct;//GPIO初始化指针

    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//Rx
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz ;
	
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING ;//Tx
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
	GPIO_InitStruct.GPIO_Speed =GPIO_Speed_50MHz ;

    GPIO_Init(GPIOA,&GPIO_InitStruct);

4、若使用串口中断

	NVIC_InitTypeDef NVIC_Initstrue;//若开启中断,则需要这个中断初始化结构体

	//若需要中断
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//USART_IT_RXNE:开启接收中断
	

	NVIC_Initstrue.NVIC_IRQChannel=USART1_IRQn;			//储存在stm32f10x.h头文件中
	NVIC_Initstrue.NVIC_IRQChannelCmd=ENABLE;//使能中断
	NVIC_Initstrue.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级
	NVIC_Initstrue.NVIC_IRQChannelSubPriority=1;//响应优先级
	NVIC_Init(&NVIC_Initstrue);
    
    //需要中断时,需要在主函数中定义分组

/*
    int main() 
	{
	    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//定义分组,第二组,2位控制抢占优先级,2位响应优先级
		while()
		{
				
		}
	}
*/

5、完整初始化

    GPIO_InitTypeDef GPIO_InitStruct;//GPIO初始化结构体
	USART_InitTypeDef USART_InitStruct;//串口初始化结构体
	NVIC_InitTypeDef NVIC_Initstrue;//若开启中断,则需要这个中断初始化结构体
	
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1,ENABLE);
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//Rx
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz ;
	
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING ;//Tx
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
	GPIO_InitStruct.GPIO_Speed =GPIO_Speed_50MHz ;
	
	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;//每次发送接收数据长度
	
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	USART_Init(USART1,&USART_InitStruct);
	USART_Cmd(USART1,ENABLE);
	
	//若需要中断
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//USART_IT_RXNE:开启接收中断
	

	NVIC_Initstrue.NVIC_IRQChannel=USART1_IRQn;						//在stm32f10x.h头文件里面找到
	NVIC_Initstrue.NVIC_IRQChannelCmd=ENABLE;//使能中断
	NVIC_Initstrue.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级
	NVIC_Initstrue.NVIC_IRQChannelSubPriority=1;//响应优先级
	NVIC_Init(&NVIC_Initstrue);

6、中断个服务函数

//中断服务函数放在这里也是可以操作的
//中断服务函数,函数名必须是这个,不能改变
void USART1_IRQHandler()
{
	uint8_t dat;
	if(USART_GetITStatus (USART1,USART_IT_RXNE))//中断类型标志函数
	{
		dat=USART_ReceiveData (USART1);//接收数据函数
		USART_SendData (USART1,dat);//发送数据函数
	}
		
}

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛定谔的猫咪死了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值