高容量的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);//发送数据函数
}
}