收藏官网首页
查看: 7957|回复: 0

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

57

主题

156

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2017-2-16 19:03:23 | 显示全部楼层 |阅读模式
校园创客福利
通用同步异步收发器(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设置的实例代码:
[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]



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表