yujietian 发表于 2017-2-16 19:03:23

【转】STM32串口USART1的使用方法和程序-1

通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换。 USART利用分数波特率发生器提供宽范围的波特率选择,支持同步单向通信和半双工单线通信。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上。    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设置的实例代码:http://common.cnblogs.com/images/copycode.gif
    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);http://common.cnblogs.com/images/copycode.gif

2.3、配置UART相关属性通过结构体USART_InitTypeDef来确定。UART模式下的字段如下USART_BaudRate:波特率,视具体设备而定USART_WordLength:字长USART_StopBits:停止位USART_Parity:校验方式USART_HardwareFlowControl:硬件流控制USART_Mode:单/双工最后设置。实例代码为:http://common.cnblogs.com/images/copycode.gif
   //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); http://common.cnblogs.com/images/copycode.gif

别忘了最后要使用USART_Cmd()来启动设备UART1。2.4、重定向print()函数。http://common.cnblogs.com/images/copycode.gif
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);}http://common.cnblogs.com/images/copycode.gif

最后通过主函数直接输出即可。http://common.cnblogs.com/images/copycode.gif
int main(void){    // USART1 config 9600 8-N-1     USART1_Config();      printf("hello world!");}http://common.cnblogs.com/images/copycode.gif



页: [1]
查看完整版本: 【转】STM32串口USART1的使用方法和程序-1