本文我们将了解STM32与外部设备通过串口通信的方式。
所谓串口通信,其实是一个类似于计算机网络的概念,它有物理层,比如规定用什么线通信,几伏特算高电平,几伏特算低电平。传输层,通信前要发RTS,CTS。每一层都有不同的协议所约束。在STM32中采用的USART就是其中之一。
USART模块由GPIO_InitTypeDef结构体控制,它的定义如下
typedef struct { u32 USART_BaudRate; // 波特率 u16 USART_WordLength; // 字长 u16 USART_StopBits; // 停止位 u16 USART_Parity; // 校验位 u16 USART_Mode; // USART 模式 u16 USART_HardwareFlowControl; // 硬件流控制 } USART_InitTypeDef;
外部设备的输入输出分别使用GPIOA的9号和10号管脚,因此我们要先把管脚输入输出模式配置好
GPIO_InitTypeDef GPIO_USART_INIT; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_USART_INIT.GPIO_Pin = GPIO_Pin_9; GPIO_USART_INIT.GPIO_Speed = GPIO_Speed_50MHz; GPIO_USART_INIT.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA,&GPIO_USART_INIT); GPIO_USART_INIT.GPIO_Pin = GPIO_Pin_10; GPIO_USART_INIT.GPIO_Speed = GPIO_Speed_50MHz; GPIO_USART_INIT.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA,&GPIO_USART_INIT);
然后我们设置USART,将波特率设置为9600,禁用硬件流控制模式,工作模式允许发送和接收,不设置校验位,数据位为8比特,在帧尾传输1个停止位。
USART_InitTypeDef USART_INIT; USART_INIT.USART_BaudRate = 9600; USART_INIT.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_INIT.USART_Mode = USART_Mode_Rx|USART_Mode_Tx; USART_INIT.USART_Parity = USART_Parity_No; USART_INIT.USART_StopBits = USART_StopBits_1; USART_INIT.USART_WordLength = USART_WordLength_8b; USART_Init(USART1,&USART_INIT); USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
当然,处理器不可能时时刻刻检查串口有没有信息传来,因此我们刚刚学习的中断就派上了用场,如果串口传输了信息,那么则请求中断并进行处理。
NVIC_InitTypeDef NVIC_USART_INIT; NVIC_USART_INIT.NVIC_IRQChannel = USART1_IRQn; NVIC_USART_INIT.NVIC_IRQChannelPreemptionPriority = 2; NVIC_USART_INIT.NVIC_IRQChannelSubPriority = 1; NVIC_USART_INIT.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_USART_INIT); USART_Cmd(USART1,ENABLE);
中断函数(待续)