基于STM32F103C8T6的USART的寄存器配置

        前面学过有关于USART的基本的概念,接下来我们就根据前面的的基本配置来进行寄存器的配置,接下来我来带大家认识有关USART的寄存器。

案例分析

       我们接下实现的功能就是向stm32发送数据,然后stm32原封不动的再把数据发送过来。电脑的话可以借助串口助手来实现数据的收发。

硬件电路的设计

        目前来讲很多电脑都没有串口,所以我们要使用虚拟串口来进行数据的收发

        

        

        

利用轮询的方式来进行数据的收发

首先我们要选择什么端口才能进行数据的收发,引脚的定义手册来看

PA9和PA10分别是USART1的TX和RX,而USART1的时钟总线是挂载到哪个总线上的呢我们来具体看看

        我们通过查找数据手册来看时钟USART1是挂载到APB2上的,我们前面说过APB2的 时钟频率是高达72M/HZ的因此在这里的USART1的传输速率是要比其它几个USART要快的,最高的速率可达到4.5M/S,因此在需要使用高数串口传输数据的时候推荐使用USART1。那我们在配置GPIO的时候我们要把它配置成什么类型呢,首先来看PA9是TX发送端口,是输出模式,因此我们想要达到最大的速率直接配置成复用推挽输出即可,而PA10是输入端口并且不需要受到外界的干扰我们直接配置成浮空输入即可。

USART的波特率寄存器

第一个首先是波特率寄存器,它是来控制数据传输的频率的,前面我们也讲过的,我们需要配置正确的波特率数据才能正确的进行收发,首先常见的波特率有9600,115200,4800,38400等等,

那我们具体应该如何配置呢,我们知道USART1的时钟是挂载到APB2总线上的,这条总线的时钟是72M/HZ,具体的计算方法是我们的时钟是72M/HZ然后要做一个16的分频,然后再除以我们需要的频率就得到了一个数值,我们这拿115200举例

经过上面的计算我们可以得到39.0625这个数,这个数就是我们目前要转换16进制的数,首先是整数部分39转换为16进制为0x27,小数部分为0x1,合起来就是0x271,因为BRR寄存器主要是由整数部分和小数部分组成,因此0X271就是115200所对应的寄存器中的值。

	RCC->APB2ENR=RCC_APB2ENR_IOPAEN|RCC_APB2ENR_USART1EN;
	
	GPIOA->CRH &=~(GPIO_CRH_CNF9|GPIO_CRH_MODE);
	GPIOA->CRH &=~(GPIO_CRH_MODE10|GPIO_CRH_CNF10);
	GPIOA->CRH|=GPIO_CRH_MODE9;
	GPIOA->CRH|=GPIO_CRH_CNF9_1;
	GPIOA->CRH|=GPIO_CRH_CNF10_0;
	
	//初始化USART1
	
	//配置波特率
  USART1->BRR=0X271;

USART控制寄存器CR1

我们初始化了usart1后还需要对它的发送端和接收端进行使能。

这里我们重点看一下发送使能和接收使能。

	//使能发送端和接收端
	USART1->CR1|=USART_CR1_TE|USART_CR1_RE;
	//使能USART1
	USART1->CR1|=USART_CR1_UE;

除了使能位我们还需要重点看一下字长位(M)、校验位控制使能(PCE)、停止位(STOP),因为前面我们介绍串口通讯协议的时候提到,有效数据位、校验位、停止位都能手动进行配置,如字长可以7位、8位、9位都行、校验位可以选择开或者不开、停止位可以选择1个电平、2个电平或者1.5、0.5个电平。当然了,我们这里直接默认的8位数据、不开校验位、停止位用一个电平即可。所以我们根据寄存器描述其实可以知道就是全部置0就行。

	//设置字长,停止位,校验位,全部置为0即可
	
	 USART1->CR1&=~(USART_CR1_M);
	 USART1->CR1&=~(USART_CR1_PCE);
	 USART1->CR1&=~(USART_CR2_STOP);
	

USART状态寄存器SR

在这个状态寄存器中有我们前面已经讲过的TXE、RXNE和IDLE这三个比较重要的位。

//发送一位数据
void USART_SENDBYTE(uint8_t data)
{
	while((USART1->SR&USART_SR_TXE)==0)
		;
	USART1->DR=data;


}
//接收一位数据
uint8_t USART_RECEVEBYTE()
{
   while((USART1->SR&USART_SR_RXNE)==0);
	
	return   USART1->DR;


}

USART数据寄存器DR

我们知道了如何发送数据和接收数据但数据存放在哪里就需要数据寄存器DR

到这的话我们有关USART的寄存器差不多都讲解完毕了。

如果内容上有什么不足的或者内容上有任何错误的欢迎广大网友指正,谢谢!!!!!!!!

### STM32F103C8T6 USART3 配置指南 对于STM32F103C8T6单片机而言,USART3接口的初始化和配置涉及多个方面,包括使能时钟、设置波特率、数据位、停止位以及校验方式等参数。具体实现如下: #### 1. 初始化库与头文件引入 为了简化外设操作,在程序开发过程中通常会采用标准外设库或HAL库来完成硬件抽象层的设计。这里假设使用的是官方提供的Standard Peripheral Library (SPL),则需先包含必要的头文件。 ```c #include "stm32f1xx.h" ``` #### 2. 使能相关功能模块与时钟源 在实际应用中,需要确保USART3及其关联GPIO端口所在的APB1总线处于激活状态,并开启相应的RCC时钟控制寄存器中的对应位。 ```c // Enable GPIOA and UART clock RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); ``` #### 3. 配置引脚复用功能 根据具体的电路连接情况,选择合适的I/O引脚作为UART通信线路(TX/RX)。在此基础上,还需通过修改AFIO寄存器来设定这些引脚的功能属性。 ```c GPIO_InitTypeDef GPIO_InitStructure; /* Configure USART Tx as alternate function push-pull */ 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); /* Configure USART Rx as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); ``` #### 4. 设置串行通讯参数 接下来就是针对USART本身的一些基本特性进行定义了,比如传输速率(即波特率)、字符长度、奇偶检验选项等等。这部分可以通过调用`USART_Init()`函数轻松搞定。 ```c USART_InitTypeDef USART_InitStructure; // Set the baud rate to 115200 bps. USART_InitStructure.USART_BaudRate = 115200; // Word length is set to 8 bits per frame. USART_InitStructure.USART_WordLength = USART_WordLength_8b; // One stop bit used at end of each transmitted byte. USART_InitStructure.USART_StopBits = USART_StopBits_1; // No parity checking performed during transmission/reception. USART_InitStructure.USART_Parity = USART_Parity_No ; // Hardware flow control disabled here. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // Select standard asynchronous mode without LIN protocol support. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // Apply above settings to USART peripheral instance. USART_Init(USART3, &USART_InitStructure); ``` #### 5. 启动USART设备并启用中断服务例程(可选) 最后一步便是正式打开该串行接口以便于后续的数据交换活动;如果希望利用中断机制处理收发事件,则还需要额外注册对应的ISR入口地址至向量表内。 ```c // Enable USART3 interrupt on receive not empty flag. NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // Finally enable both transmitter and receiver circuits within USART module itself. USART_Cmd(USART3, ENABLE); ``` 以上步骤涵盖了从最基础到较为复杂的几个层面,能够帮助开发者快速建立起稳定可靠的异步串行通信链路[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值