首先我们先要根据原理图来确认我们用的串口接到了那个引脚
我这边的串口1为例,接收端是PA10,发送端是PA9首先我们需要配置PA9和PA10.
把接受端配置成浮空输入,完全靠引脚来判断。把发送端配置成复用推挽模式,并打开GPIOA的时钟和复用时钟多的看代码吧,我把注释都写在每一个操作后了,要用只需要改一下.h文件的引脚宏定义。
.h文件
#ifndef __HAL_USART_H__
#define __HAL_USART_H__
#define USART1_RX_PORT GPIOA
#define USART1_RX_Pin GPIO_Pin_10
#define USART1_TX_PORT GPIOA
#define USART1_TX_Pin GPIO_Pin_9
void hal_USARTInit(void);
#endif
.c文件
#include "stm32f10x.h" // Device header
#include "hal_usart.h"
static void hal_USARTConfig(void);//声明
static void hal_USARTConfig(void)//配置函数不让外部改变
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);//打开串口1和GPIOA的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//打开复用时钟AFIO
GPIO_InitStructure.GPIO_Pin = USART1_RX_Pin;//配置PA10引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度配置成50MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //模式配置成浮空模式
GPIO_Init(USART1_RX_PORT, &GPIO_InitStructure);//初始化函数来根据结构体参数来配置GPIO_Pin_10
GPIO_InitStructure.GPIO_Pin = USART1_TX_Pin;//配置PA9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度配置成50MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//模式配置成复用推挽输出
GPIO_Init(USART1_TX_PORT, &GPIO_InitStructure);//初始化函数来根据结构体参数来配置GPIO_Pin_9
//串口1结构体内含的参数,根据参数来配置串口
USART_InitStructure.USART_BaudRate=115200;//串口1的波特率
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//流控制,一般不打开,
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//模式设置成发送和接收
USART_InitStructure.USART_Parity=USART_Parity_No;//将0 宏定义成USART_Parity_No,代表无校验
USART_InitStructure.USART_StopBits=USART_StopBits_1;//0代表停止位是1位
USART_InitStructure.USART_WordLength=USART_WordLength_8b;//数据长度是8位
USART_Init(USART1,&USART_InitStructure);//将参数设置到串口1
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//使能接收中断
USART_ITConfig(USART1,USART_IT_TXE,DISABLE);//关闭发送中断,发送中断由自己决定当有数据要发送时由程序打开,发送完后需要关闭
USART_Cmd(USART1,ENABLE);//使能串口1
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//分组,将中断分到0组
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;//确认中断是串口中断
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//子优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//主优先级
NVIC_Init(&NVIC_InitStructure);//将参数配置到中断中
}
void hal_USARTInit(void)//用初始化函数调用,初始化,留给外部一个接口//在主函数调用
{
hal_USARTConfig();
}
static void hal_DebugSendByte(unsigned char Dat)//串口发送函数static代表仅在该.c文件中调用
{
USART_SendData(USART1, Dat);//将接收到的数据发送出去//库函数
USART_ITConfig(USART1, USART_IT_TXE, ENABLE); //使能发送中断
}
void USART1_IRQHandler(void)//串口中断服务函数
{
unsigned char dat;
if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)//当有数据时
{
dat = USART_ReceiveData(USART1);//将数据给dat
hal_DebugSendByte(dat);//将接收到的数据在通过串口发送到串口助手
USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除标志位
}
if(USART_GetITStatus(USART1,USART_IT_TXE) != RESET)//发送模式
{
USART_ClearITPendingBit(USART1, USART_IT_TXE);//先清除标志位
USART_ITConfig(USART1, USART_IT_TXE, DISABLE);//发送完成后将关闭发送中断
}
}
代码就分享到这里了,如果对你有帮助可以帮我点点赞,谢谢。文章来源:https://www.toymoban.com/news/detail-538909.html
欢迎提出我的不足文章来源地址https://www.toymoban.com/news/detail-538909.html
到了这里,关于STM32 串口的初始化(内附详细代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!