学习各种硬件,串口是必不可少的也是首要学习的外设,因为有了串口之后,就可以和硬件进行简单的交互,也能更加方便的验证所写的程序的正确性。
STM32拥有多个USART,支持多种模式的配置,具体的可以参照STM32的相关手册进行学习
再来看一下USART的功能框图:
在使用任何一个外设功能之前,都要看看它所对应的功能框图,这样有助于理解功能的使用。
接下来看一下关于USART的相关寄存器和可操作的库函数。
最后还需要看一张关于GPIO的USART的引脚复用:
因为USART与外界沟通是用控制器的GPIO引脚的复用功能,所以在使用USART功能之前需要把GPIO配置成相应的输入输出模式。
同时如果需要开启中断,还要进行中断通道的使能,和优先级的分组设置。
#include "stm32f10x.h"
/**
* @brief 初始化GPIO,默认速度为GPIO_Speed_50MHz;
*
* @param GPIO分组
* @param GPIO引脚
* @param GPIO引脚模式
* @retval None
*/
void GPIO_init(GPIO_TypeDef * GPIOx,u16 GPIO_Pin,GPIOMode_TypeDef Mode)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=Mode;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOx,&GPIO_InitStruct);
}
/**
* @brief 初始化USART
*
* @param 波特率,数据位数,停止位,发送接收模式
* @retval None
*/
void UART_init(int BaudRate,u16 WordLength,u16 StopBits,u16 Parity,u16 Mode)
{
USART_InitTypeDef USART_InitStruct;
USART_InitStruct.USART_BaudRate=BaudRate;
USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode=Mode;
USART_InitStruct.USART_Parity=Parity;
USART_InitStruct.USART_StopBits=StopBits;
USART_InitStruct.USART_WordLength=WordLength;
USART_Init(USART1,&USART_InitStruct);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
USART_Cmd(USART1,ENABLE);
}
/**
* @brief 初始化中断向量
*
* @param 中断通道,抢占优先级,相应优先级,使能/失能
* @retval None
*/
void NVIC_init(u8 NVIC_IRQChannel,u8 NVIC_IRQChannelPreemptionPriority,u8 NVIC_IRQChannelSubPriority,u8 NVIC_IRQChannelCmd)
{
NVIC_InitTypeDef NVIC_InitStrue;
NVIC_InitStrue.NVIC_IRQChannel=NVIC_IRQChannel;
NVIC_InitStrue.NVIC_IRQChannelCmd=NVIC_IRQChannelCmd;
NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=NVIC_IRQChannelPreemptionPriority;
NVIC_InitStrue.NVIC_IRQChannelSubPriority=NVIC_IRQChannelSubPriority;
NVIC_Init(&NVIC_InitStrue);
}
int main()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
GPIO_init(GPIOA,GPIO_Pin_9,GPIO_Mode_AF_PP);
GPIO_init(GPIOA,GPIO_Pin_10,GPIO_Mode_IN_FLOATING);
NVIC_init(USART1_IRQn,1,1,ENABLE);
GPIO_init(GPIOA,GPIO_Pin_0,GPIO_Mode_Out_PP);
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
UART_init(115200,USART_WordLength_8b,USART_StopBits_1,USART_Parity_No,USART_Mode_Tx|USART_Mode_Rx);
while(1);
}
void USART1_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART1,USART_IT_RXNE))
{
res=USART_ReceiveData(USART1);
USART_SendData(USART1,res);
}
}
最后的那个函数是串口接收中断的响应函数,主要串口接收到了数据,响应的标志位置1之后就进入到中断函数中,前提是要使能串口接收中断。
以上程序是是实现了串口的接收和发送,发送接收进来的数据。