通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换。 USART利用分数波特率发生器提供宽范围的波特率选择,支持同步单向通信和半双工单线通信。 在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上。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);
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口。 以下是GPIO设置的实例代码: [url=][/url]
GPIO_InitTypeDef GPIO_InitStructure; //USART1 Tx(PA.09) 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_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure);[url=][/url]
2.3、配置UART相关属性 通过结构体USART_InitTypeDef来确定。UART模式下的字段如下 USART_BaudRate:波特率,视具体设备而定 USART_WordLength:字长 USART_StopBits:停止位 USART_Parity:校验方式 USART_HardwareFlowControl:硬件流控制 USART_Mode:单/双工 最后设置。实例代码为: [url=][/url]
//USART1配置
USART_InitTypeDef USART_InitStructure;
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_Tx | USART_Mode_Rx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); [url=][/url]
别忘了最后要使用USART_Cmd()来启动设备UART1。 2.4、重定向print()函数。 [url=][/url]
int fputc(int ch,FILE *f){ USART1->SR; //USART_GetFlagStatus(USART1, USART_FLAG_TC) 解决第一个字符发送失败的问题 //一个一个发送字符 USART_SendData(USART1, (unsigned char) ch); //等待发送完成 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET); return(ch);}[url=][/url]
最后通过主函数直接输出即可。 [url=][/url]
int main(void){ // USART1 config 9600 8-N-1 USART1_Config(); printf("hello world!");}[url=][/url]
|