Stm32串口通信学习笔记
一,串口通信的配置过程(库函数)
1.定义与串口相关的初始化结构体
GPIO_InitTypeDef GPIO_InitStructure;//
USART_InitTypeDef
USART_InitStructure;
NVIC_InitTypeDef
NVIC_InitStructure;
通用IO口,串行接口.嵌套向量中断控制寄存器(NVIC)
2.配置与串口通信相关的时钟
GPIO,USART,AFIO(复用端口)时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,
ENABLE);
3.分别配置GPIO,USART,NVIC的结构体参数, 并根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器
GPIO_InitStructure.GPIO_Pin
= GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//USART1_RX PA.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//Usart1 NVIC
配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3
;
NVIC_InitStructure.NVIC_IRQChannelSubPriority
= 3; //
NVIC_InitStructure.NVIC_IRQChannelCmd
= ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器USART1
//USART 初始化设置
USART_InitStructure.USART_BaudRate
= bound;//一般设置为9600;
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);
4开启中断,使能串口
USART_ITConfig(USART1, USART_IT_RXNE,
ENABLE);//开启中断
USART_Cmd(USART1,
ENABLE); //使能串口
5.写相应的,中断服务函数
注意:PC机向STM32发送数据时,要考虑到两点:
1. PC机什么时候,发送数据结束
2. stm32允许结束数据的大小
当PC机发送完数据后,stm32如何知道?我们假设PC机发送数据已回车键结束,那么PC的最后一个字符一定是/n(0x0a);所以我们可以通过检测每一个字节的数据是否为0x0a,若是则接受完成.若不是则继续接受.STM32接受数据时,如何知道接受寄存器已满,我们假设接受寄存器的容量为64bit,并且我们可以设计一个标志,当有一个数据存储的接受寄存器是,标志加1,那么当标志为0x40时,表示STM32接受寄存器已满,不允许继续接受,此时接收结束.
|