USART作为一种标准接口在运用中非常常见。本文侧重剖析其作为UART的装备和运用办法。
1、STM32固件库运用外围设备的首要思路
在STM32中,外围设备的装备思路比较固定。首要是使能相关的时钟,一方面是设备自身的时钟,另一方面假如设备经过IO口输出还需求使能IO口的时钟;最终假如对应的IO口是复用功用的IO口,则还有必要使能AFIO的时钟。
其次是装备GPIO,GPIO的各种特点由硬件手册的AFIO一章详细规则,较为简略。
接着相关设备需求假如需求运用中止功用,有必要先装备中止优先级,后文胪陈。
然后是装备外围设备的相关特点,视详细设备而定,假如设备需求运用中止方法,有必要使能相应设备的中止,之后需求使能相关设备。
最终假如设备运用了中止功用,则还需求填写相应的中止服务程序,在服务程序中进行相应操作。
2、UART的装备过程
2.1、翻开时钟
我们UART的TX和RX和AFIO都挂在APB2桥上,因而选用固件库函数RCC_APB2PeriphClockCmd()进行初始化。UARTx需求分状况评论,假如是UART1,则挂在APB2桥上,因而选用RCC_APB2PeriphClockCmd()进行初始化,其他的UART2~5均挂在APB1上。
2.2、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口。
以下是TX引脚设置的实例代码:
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = UART_TX_PIN[COM];
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(UART_TX_PORT[COM], &GPIO_InitStructure);
2.3、中止优先级的装备
这是STM32比较古怪的当地,在只要一个中止的状况下,依然需求装备优先级,其作用是使能某条中止的触发通道。STM32的中止有至多两个层次,分别是先占优先级和从优先级,而整个优先级设置参数的长度为4位,因而需求首要区分先占优先级位数和从优先级位数,经过NVIC_PriorityGroupConfig()完成;
特定设备的中止优先级NVIC的特点包含在结构体NVIC_InitTypeDef中,其间字段NVIC_IRQChannel包含了设备的中止向量,保存在发动代码中;字段NVIC_IRQChannelPreemptionPriority为主优先级,NVIC_IRQChannelSubPriority为从优先级,取值的规模应根据位数区分的状况而定;最终NVIC_IRQChannelCmd字段是是否使能,一般定位ENABLE。最终经过NVIC_Init()来使能这一中止向量。实例代码如下:
/* Configure theNVIC Preemption Priority Bits */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
/* Enable the USARTy Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
2.4、装备UART相关特点
经过结构体USART_InitTypeDef来确认。UART方式下的字段如下
USART_BaudRate:波特率,视详细设备而定
USART_WordLength:字长
USART_StopBits:中止位
USART_Parity:校验方法
USART_HardwareFlowControl:硬件流操控
USART_Mode:单/双工
最终经过USART_Init()来设置。实例代码为:
USART_InitStructure.USART_BaudRate= 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);
最终还要运用USART_Cmd()来发动设备UART。
2.5、中止的服务程序的规划
现在运用了UART的两个中止USART_IT_RXNE(接纳缓存补空中止)和USART_IT_TXE(发送缓存空中止),前一个中止确保了一旦有数据接纳到就进入中止以接纳特定长度的数据,后一个中止一共一旦发完一个数据就进入中止函数,确保接连发送一段数据。一个设备的一切中止都包含在一个中止服务程序中,因而有必要首要分清楚这次呼应的是哪一个中止,运用USART_GetITStatus()函数确认;选用USART_ReceiveData()函数接纳一个字节数据,选用USART_SendData()函数发送一个字节数据,当封闭中止时选用USART_ITConfig()失能呼应的中止。实例程序:
voidUART4_IRQHandler(void)
{
if(USART_GetITStatus(UART4,USART_IT_RXNE) != RESET)
{//当检测掉读入中止
RxBuffer[RxCounter++] = USART_ReceiveData(UART4);
if (RxCounter ==NbrOfDataToRead)
{
USART_ITConfig(UART4, USART_IT_RXNE, DISABLE); //制止中止
}
}
if(USART_GetITStatus(UART4, USART_IT_TXE) != RESET)
{
/* Write one byte to the transmit data register */
USART_SendData(UART4, TxBuffer[TxCounter++]);
if(TxCounter ==NbrOfDataToTransfer)
{
//TxCounter = 0;
/* Disable the USARTy Transmit interrupt */
USART_ITConfig(UART4, USART_IT_TXE, DISABLE);
}
}
}
其间主程序与中止服务程序经过全局变量来通讯,这也是一种多进程同享存储区的表现方式。