173 2438 5004
KEROS加密芯片——品牌直销 | 免费样品 | 技术支持
当前位置:网站首页 > 资讯中心 正文 资讯中心

stm32f103几个uart

keros@mark 2023-04-06 资讯中心

stm32f103有几个i2c

stm32f103有几个i2c

STM32F103是一个产品系列,不同型号有不同配置的外部接口。

例如R4、R6、C4、C6只有一路I_C接口,其余有两路I_C接口。

STM32F系列属于中低端的32位ARM微控制器,该系列芯片是意法半导体(ST)公司出品,其内核是Cortex-M3 [1] 。

该系列芯片按片内Flash的大小可分为三大类:小容量(16K和32K)、中容量(64K和128K)、大容量(256K、384K和512K)。

芯片集成定时器Timer,CAN,ADC,SPI,I2C,USB,UART等多种外设功能。

stm32扩展4路串口

stm32扩展4路串口,可以用串口扩展芯片,这类芯片非常多,可选一两款外围元件少,电路简单的芯片。

推荐一,国产的,双串口芯片CH432

CH432 是双UART 芯片,包含两个兼容16C550 的异步串口,支持半双工收发自动切换和IrDA 红外编解码,支持最高4Mbps 的通讯波特率,可以用于单片机/嵌入式系统的RS232 串口扩展、带自动硬件速率控制的高速串口、RS485 通讯、IrDA 通讯等。

第二款,TL16C554。

这两个芯片在使用时外围件最少,电路相对简单些。

stm32f103单片机下,usart接口与哪几个寄存器相关

看手册啊,这个东西没人能记住的。

一般都有控制寄存器,状态寄存器,中断寄存器,数据寄存器,每种单片机都不一样。

串口还有波特率的分频寄存器这些。

想简单点直接用官方库文件。

stm32f103vetx有多少个串口

五个。

而现在比较就行的stm32单片机,常常有五个串口之多,所以它可以同时接它本身拥有的串口数量,当然这个串口不能速率过快,且必须分配好中断优先级,否则可能因串口中断太频繁,导致部分串口通信异常。

stm32can通信和串口的区别

一、简介

STM32F103ZET6有3个USART(通用同步和异步收发器) + 2个UART(通用异步收发器)

分别是USART1,USART2,USART3

和UART4,UART5

二、USART和UART有什么区别呢?

当进行异步通信时,这两者是没有区别的。区别在于USART比UART多了同步通信功能,同步通信需要STM32提供时钟来同步的,

这个同步通信功能可以把USART当做SPI来用,比如用USART来驱动SPI设备。同步通信的连接示例图:

其中RX,TX,SCLK引脚的定义,在数据手册上都可以找到:百为stm32开发板光盘\芯片数据手册\数据手册STM32F103xC STM32F103xD STM32F103xE.pdf

这个区别在初学STM32的时候我们不需要去深入研究,只要知道USART有很多功能,除了全双工异步通信之外,还包括支持同步通信和单线半双工通信,支持LIN(局部互连网),智能卡协议和IrDA红外通信,以及调制解调器(CTS/RTS)等操作。

三、数据通信格式

我们用得最多的是全双工异步通信功能,下面我们来研究下怎么通过串口1(USART1)来收发信息,和printf功能的实现。

通常串口通信的数据格式如下图:

我们需要设置的数据有通信速率,数据字长,奇偶检验位,停止位。一个典型的设置是115200波特率,8位数据,无奇偶校验,1位停止位。

这个设置在固件函数库里面,我们是通过设置USART_InitStructure结构体,然后调用USART_Init函数来实现的:

USART_InitStructure.USART_BaudRate = 115200; //设置通信波特率为115200

USART_InitStructure.USART_WordLength = USART_WordLength_8b; //设置通信数据格式为8位数据

USART_InitStructure.USART_StopBits = USART_StopBits_1; //设置停止位为1位

USART_InitStructure.USART_Parity = USART_Parity_No ; //设置为无奇偶校验

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //设置为无硬件流控制,即无CTS/RTS控制

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //设置发送使能,接收使能

USART_Init(USART1, USART_InitStructure); //调用USART_Init,把上面的参数分别设置进USART的控制寄存器USART1-CR1,USART1-CR2,USART1-CR3

USART_Cmd(USART1, ENABLE); //使能串口

大家发现,在2.0固件库的USART例程里并没有看到USART1,因为是它用USARTx宏代替的,

其中USARTx是platform_config.h里定义的,大概是这个样子:

#ifdef USE_USART1

#define USARTx USART1

#define GPIOx GPIOA

#define RCC_APB2Periph_GPIOx RCC_APB2Periph_GPIOA

#define GPIO_RxPin GPIO_Pin_10

#define GPIO_TxPin GPIO_Pin_9

#endif

只有定义了USE_USART1,上面的#ifdef USE_USART1和#endif之间的内容才会被编译,所以在platform_config.h里也需要定义USE_USART1:

#define USE_USART1

这里GPIO_Pin_9是串口1的发送引脚,GPIO_Pin_10是串口1的接收引脚,也可以从百为STM32开发板的电路图上看出来:

四、串口引脚配置

上面USART_Init函数配置了USART1的数据通信格式,但串口能工作的前提是需要配置相应的TX,RX的引脚,这个是通过GPIO_Configuration函数来配置的:

void GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //打开USART1时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //打开AFIO时钟

/* 配置 USARTx_Tx 为复用推挽输出 */

GPIO_InitStructure.GPIO_Pin = GPIO_TxPin;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOx, GPIO_InitStructure);

/* 配置 USARTx_Rx 为输入悬空 */

GPIO_InitStructure.GPIO_Pin = GPIO_RxPin;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOx, GPIO_InitStructure);

}

五、收发数据

配置好USART1使用的引脚,数据通信格式,下面就可以收发数据了,

USART_GetFlagStatus函数可以读取收发状态等,读取状态标志可以是以下几个:

发送数据示例:

USART_SendData(USART1, 'a'); //发送一个字符a

接收数据示例:

u16 RxData;

RxData = USART_ReceiveData(USART1); //从USART1接收数据到RxData变量

下面是串口通信printf程序里的主要功能,上电打印一串信息,把接收到的数据回显到PC上:

/* 用printf打印一串信息到PC的超级终端或串口调试软件上 */

printf("\n\rUSART Printf Example: retarget the C library printf function to the USART\n\r");

while (1)

{

if(USART_GetFlagStatus(USARTx,USART_FLAG_RXNE)==SET) //判断是否有数据要接收

{

i = USART_ReceiveData(USARTx); //接收数据

printf("%c\n\r",i0xff); //回显到PC的超级终端或串口调试软件上

}

}

六、printf的实现

上面的printf是怎么实现的呢,这个是C标准库里定义的函数,我们是怎样把它的输出重定向到串口的呢?

我们知道printf是调用fputc函数来打印的,所以我们只要把fputc函数重定义就可以了:

#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

PUTCHAR_PROTOTYPE

{

/* 调用USARTx发送一个字符*/

USART_SendData(USARTx, (u8) ch);

/* 等待发送完成 */

while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET)

{

}

return ch;

}

另外还要加上头文件

#include "stdio.h"

还要注意的是,在工程里要勾上USE MicroLIB

STM32F103V系列的ARM处理芯片有5个串口

一般我们指的串口就特指的是USART,你上面的UARST应该是写错了。SPI,I2C可以统称为串行通信。STM32F103系列最多好像只有3个串口,具体对应的位置,在对应芯片技术手册的ping map描述里面有说明,而且可以灵活映射的。

本文标签:stm32f103几个uart

产品列表
产品封装
友情链接