STM32F1的UART4串口配置

发布者:快乐阳光最新更新时间:2017-09-12 来源: eefocus关键字:STM32F1  UART4  串口配置 手机看文章 扫描二维码
随时随地手机看文章

注意是UART4,不是USART4



  在stm32中UART和USART是不相同的

  USART是通用同步/异步串行接收/发送器

  UART是通用异步收发传输器


  简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是 UART。


  USART支持同步模式,因此USART 需要同步时钟信号USART_CK(如STM32 单片机),通常情况同步信号很少使用,因此一般的单片机UART和USART使用方式是一样的,都使用异步模式。


  UART需要固定的波特率,就是说两位数据的间隔要相等。 UART总线是异步串口,一般由波特率产生器(产生的波特率等于传输波特率的16倍)、UART接收器、UART发送器组成,硬件上有两根线,一根用于发送,一根用于接收。 显然,如果用通用IO口模拟UART总线,则需一个输入口,一个输出口。


  UART是一个并行输入成为串行输出的芯片,通常集成在主板上,多数是16550AFN芯片。因为计算机内部采用并行数据,不能直接把数据发到Modem,必须经过UART整理才能进行异步传输,其过程为:CPU先把准备写入串行设备的数据放到UART的寄存器(临时内存块)中,再通过FIFO(First Input First Output,先入先出队列)传送到串行设备,若是没有FIFO,信息将变得杂乱无章,不可能传送到Modem。


  作为接口的一部分,UART还提供以下功能:将由计算机内部传送过来的并行数据转换为输出的串行数据流。将计算机外部来的串行数据转换为字节,供计算机内部使用并行数据的器件使用。在输出的串行数据流中加入奇偶校验位,并对从外部接收的数据流进行奇偶校验。在输出数据流中加入启停标记,并从接收数据流中删除启停标记。处理由键盘或鼠标发出的中断信号(键盘和鼠标也是串行设备)。可以处理计算机与外部串行设备的同步管理问题。


  USART收发模块一般分为三大部分:时钟发生器、数据发送器和接收器。控制寄存器为所有的模块共享。时钟发生器由同步逻辑电路(在同步从模式下由外部时钟输入驱动)和波特率发生器组成。发送时钟引脚XCK仅用于同步发送模式下,发送器部分由一个单独的写入缓冲器(发送UDR)、一个串行移位寄存器、校验位发生器和用于处理不同浈结构的控制逻辑电路构成。使用写入缓冲器,实现了连续发送多浈数据无延时的通信。接收器是USART模块最复杂的部分,最主要的是时钟和数据接收单元。数据接收单元用作异步数据的接收。除了接收单元,接收器还包括校验位校验器、控制逻辑、移位寄存器和两级接收缓冲器(接收UDR)。接收器支持与发送器相同的帧结构,同时支持桢错误、数据溢出和校验错误的检测。USART是一个全双工通用同步/异步串行收发模块,该接口是一个高度灵活的串行通信设备。


综上可以看出,USART相对UART来说是在异步通信的基础上还有同步的功能,USART能够提供主动时钟。


  UAST4的配置

  注意:在使用UART4之前,首先要确保你的单片机是支持UART4的(我用到的单片机是STM32F103vet6),具体是否支持UART4,可以参考数据手册。同时要注意,UART4是挂载到APB1总线上的!






   初始化程序:

   为了方便调试输出,我将USART1也进行了初始化,对比一下不难发现UASRT1的初始化和UART4的初始化几乎相同


  1.              GPIO_InitTypeDef GPIO_InitStructure;  

  2. USART_InitTypeDef USART_InitStructure;  

  3.   

  4. /* config USART1 clock */  

  5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);  

  6.    

  7.   

  8.              RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);    

  9.              RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);  

  10.              RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE); //注意UART4是挂载在APB1总线上的,用RCC_APB1PeriphClockCmd()函数初始化!  

  11.   

  12. /* USART1 GPIO config */  

  13. /* Configure USART1 Tx (PA.09) as alternate function push-pull */  

  14. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;  

  15. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  

  16. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  

  17. GPIO_Init(GPIOA, &GPIO_InitStructure);  

  18.   

  19. /* Configure USART1 Rx (PA.10) as input floating */  

  20. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;  

  21. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  

  22. GPIO_Init(GPIOA, &GPIO_InitStructure);  

  23.       

  24. /* USART1 mode config */  

  25. USART_InitStructure.USART_BaudRate = 115200;  

  26. USART_InitStructure.USART_WordLength = USART_WordLength_8b;  

  27. USART_InitStructure.USART_StopBits = USART_StopBits_1;  

  28. USART_InitStructure.USART_Parity = USART_Parity_No ;  

  29. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  

  30. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  

  31.    

  32. USART_Init(USART1, &USART_InitStructure);   

  33. USART_Cmd(USART1, ENABLE);  

  34.   

  35. //³õʼ»¯UART4-TX-PC10  

  36. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;  

  37. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  

  38. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  

  39. GPIO_Init(GPIOC, &GPIO_InitStructure);  

  40.         //UART-RX-PC11  

  41. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;  

  42. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  

  43.   

  44.         

  45. USART_InitStructure.USART_BaudRate = 9600;  

  46. USART_InitStructure.USART_WordLength = USART_WordLength_8b;  

  47. USART_InitStructure.USART_StopBits = USART_StopBits_1;  

  48. USART_InitStructure.USART_Parity = USART_Parity_No ;  

  49. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  

  50. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  

  51.   

  52. USART_Init(UART4, &USART_InitStructure);   

  53. USART_Cmd(UART4, ENABLE);     

  54. USART_ClearFlag(UART4,USART_FLAG_TC);  



关键字:STM32F1  UART4  串口配置 引用地址:STM32F1的UART4串口配置

上一篇:stm32 堆和栈(stm32 Heap & Stack)
下一篇:STM32串口的部分映射与完全映射

推荐阅读最新更新时间:2024-03-16 15:36

STM32F1系列基本定时器HAL库配置
时钟的概念了解完就趁热打铁进行定时器的简单讲解,定时器的操作是十分重要的,他不仅可以用于计数/定时(两者其实一个道理),还可以生成PWM,输入捕获等等,高级定时器可以用于工业电机上的有关操作。所以,我们专门讲解一波基本定时器,并用它做一个闪烁灯小实验。 定时器简介 在STM32F1上,常规定时器分为三种定时器:高级,通用,基本; 高级定时器的功能涵盖通用定时器,通用定时器功能涵盖基本定时器 以基本定时器实现计数功能,这里说的并不准确,应该说是定时功能, 定时是对周期固定的脉冲信号进行计数如APB(MCU的外设时钟APB),而计数是对周期不确定(可能固定也可能不固定)的脉冲信号进行计数。 更为深入的比喻:就是水杯中装水的
[单片机]
<font color='red'>STM32F1</font>系列基本定时器HAL库<font color='red'>配置</font>
STM32五个串口同时收发函数配置
#include user_usart.h #include stm32f10x_usart.h /*使用microLib的方法*/ /* int fputc(int ch, FILE *f) { USART_SendData(USART1, (uint8_t) ch); while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} return ch; } int GetKey (void) { while (!(USART1- SR & USART_FLAG_RXNE)); return ((int)(USART1-
[单片机]
UCOS2_STM32F1移植详细过程(二)
Ⅰ、 概述 打开上一篇文章新建的工程,是提取的ST标准库里面 源代码文件 和UCOS工程包源代码文件。下载过的朋友可能会知道,直接编译那个工程会有大片的错误和警告,原因在于那个工程是没有经过修改源代码的工程,接下来就是讲述一步一步修改源代码的过程(也就是所谓的移植过程)。 该文接着上一篇文章来讲述“UCOS移植详细过程”,上一篇文章是讲述准备工作、文件提取并整理、新建UCOS工程等工作。该文讲述UCOS移植过程中修改 部分 源代码(底层代码、系统配置等)工作。 Ⅱ、ST芯片配置 配置ST型号的方法有两种:使用标准库源代码配置和工程配置 1.源代码配置 打开工程 - 打开源代码“stm32f10x.h”文件。 使用F103大
[单片机]
UCOS2_STM32F1移植详细过程(二)
2440串口linux编程,S3C2440串口通讯的相关配置
UART配置的相关寄存器如下(按s3c2440手册中的顺序列出): 1.ULCONn寄存器:线性控制寄存器 功能:设置奇偶校验,停止位, 数据位(5-8位) 注意:一般设置为无校验,一个停止位,数据位为8位,也就是常说的“8N1”,此时寄存器值为0x3。(bit =0为正常模式,否则为红外模式); 2.UCONn寄存器:通道n控制器 功能:选择UART时钟源、设置UART中断方式 注意:可选择PCLK、UEXTCLK或FCLK/n。bit =1为回送模式,用于测试;bit 和bit 分别控制传输和接收模式,初学者常设置为中断请求或查询模式,bit =bit =01。 3.UFCONn寄存器:FIFO控制寄存器 功能:用于设
[单片机]
正点原子STM32F4 (12) STM32串口寄存器库函数配置方法
今天讲解串口的程序编写,下面是他的寄存器 在中文参考手册的第26章有介绍它的这些寄存器 在F4的stm32f4_usart.c定义了很多的库函数 1.状态寄存器的库函数 去读取SR寄存器相应的数据然后放到,返回相应的状态标志位的值,它的返回值是一个FlagStatus型 这个值是一个枚举类型,要么是set,要么是reset 2库函数对数据寄存器的函数 第一个是发送数据,第二个是接收数据 发送数据实际上就是把数据写到DR寄存器 接收数据就是读取DR寄存器 设置波特率用的是下面这个函数 先来讲解一下波特率地记算方法 在上一讲串口功能框图中波特率是由: fpclkx/usartd
[单片机]
正点原子STM32F4 (12) STM32<font color='red'>串口</font>寄存器库函数<font color='red'>配置</font>方法
STM32F1系列HAL库配置外部中断——测量pwm频率
一.中断的简单介绍 对于之前的串口配置,之所以把串口中断搁置是因为它牵扯到中断这一概念,而我觉得中断对于像我这样的初学者来说是较为难理解的概念,所以,我专门把中断这个应用拿出来。但是也是很浅显的一点点,毕竟中断牵扯的确实有点多,外部中断(EXIT),串口中断,ADC中断及各种外设中断,我并不想在这里解释太多,因为我自己还有很多地方要学习,所以把外部中断拿来分享一下。 中断 中断是指计算机正在运行程序时,出现某些意外需要主机干预,主机可以暂停正在进行的事情,转而去干预处理意外事件,等到处理完意外事件时,可以继续返回原先被暂停的事情中继续执行。 外部中断 外部中断是单片机实时地处理外部事件的一种内部机制。当某种外部事件发生时,
[单片机]
<font color='red'>STM32F1</font>系列HAL库<font color='red'>配置</font>外部中断——测量pwm频率
STM32之 UART4 和UART5所遇到的问题
最近在写一个人机界面,由于硬件同事布板的问题,必须要用到串口4,先开始我还觉得没什么,就是把USART1改成4以及改下开启时钟和配置引脚。 但是事实证明我的想法是多么愚蠢,调了整整2天,UART4发送很好,但是就是在接收时死活的卡在中断之前,就会进入HardFaultException B HardFaultException。真是百思不得其解,我就一步步调试跟踪,也没有发现任何问题,UART4的配置都是正确的,引脚也都没问题。这两天真是调试的快崩溃了。在网上查询该问题,大家也都没有答案,有些人甚至直接说UART4不能用,说心里话我不相信,别个STM那么大的公司,会推出不能用的功能? 在我最无助的时候
[单片机]
STM32L151C8T6的串口配置
**STM32L151C8T6的串口配置 ////////////////////////////////////////////////////////////////// //加入以下代码,支持printf函数,而不需要选择use MicroLIB #if 1 #pragma import(__use_no_semihosting) //标准库需要的支持函数 struct __FILE { int handle; }; FILE __stdout; //定义_sys_exit()以避免使用半主机模式 _sys_exit(i
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved