stm32之USART串口配置
扫描二维码
随时随地手机看文章
概念
在STM32的参考手册中,串口被描述成通用同步异步收发器(USART),它提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。(好吧我也不是很懂,暂且贴上官方定义,各位看官自己悟吧)
配置步骤
打开时钟(RCC配置)
由于UART的TX和RX和AFIO都挂在APB2桥上,因此采用固件库函数RCC_APB2PeriphClockCmd()进行初始化。UARTx需要分情况讨论,如果是UART1,则挂在APB2桥上,因此采用RCC_APB2PeriphClockCmd()进行初始化,其余的UART2~5均挂在APB1上。
GPIO配置
GPIO的属性包含在结构体GPIO_InitTypeDef,其中对于TX引脚,GPIO_Mode字段设置为GPIO_Mode_AF_PP(复用推挽输出),GPIO_Speed切换速率设置为GPIO_Speed_50MHz;对于RX引脚,GPIO_Mode字段设置为GPIO_Mode_IN_FLOATING(浮空输入),不需要设置切换速率。最后通过GPIO_Init()使能IO口。
NVIC配置
STM32在只有一个中断的情况下,仍然需要配置优先级,其作用是使能某条中断的触发通道。STM32的中断有至多两个层次,分别是抢占优先级(主优先级)和子优先级(从优先级),而整个优先级设置参数的长度为4位,因此需要首先划分抢占优先级位数和子优先级位数,通过NVIC_PriorityGroupConfig()实现;
特定设备的中断优先级NVIC的属性包含在结构体NVIC_InitTypeDef中,其中字段NVIC_IRQChannel包含了设备的中断向量,保存在启动代码中;字段NVIC_IRQChannelPreemptionPriority为主优先级NVIC_IRQChannelSubPriority为从优先级,取值的范围应根据位数划分的情况而定;最后NVIC_IRQChannelCmd字段是是否使能,一般置为ENABLE。最后通过NVIC_Init()来使能这一中断向量。
USART配置
通过结构体USART_InitTypeDef来确定。UART模式下的字段如下:
USART_BaudRate:波特率(每秒能传输的数据位),缺省值为9600。
USART_WordLength:字长
USART_StopBits:停止位
USART_Parity:校验方式(奇偶校验)
USART_HardwareFlowControl:硬件流控制
USART_Mode:单/双工,即收发状态。
最后通过USART_Init()来设置。
代码汇总
voiduart_init(u32bound){GPIO_InitTypeDefGPIO_InitStructure;USART_InitTypeDefUSART_InitStructure;NVIC_InitTypeDefNVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);//使能USART1和GPIOA时钟USART_DeInit(USART1);//复位串口1(各参数置为缺省值)//USART1_TX(发送数据)PA.9引脚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);//初始化PA.9//USART1_RX(接收数据)PA.10引脚GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA.10//NVIC中断向量配置NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级置为3NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;//子优先级置为3,优先级依据不同的中断重要性不同来确定。NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//IRQ通道使能NVIC_Init(&NVIC_InitStructure);//根据上面设置的参数初始化NVIC寄存器//USART初始化设置USART_InitStructure.USART_BaudRate=bound;//波特率为9600;USART_InitStructure.USART_WordLength=USART_WordLength_8b;//字长为8位数据USART_InitStructure.USART_StopBits=USART_StopBits_1;//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);//串口初始化USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//中断开启USART_Cmd(USART1,ENABLE);//串口使能}123456789101112131415161718192021222324252627282930313233343536373839
终