【STM32】HAL库-串口USART

2023-05-16

USART简介

通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。

USART利用分数波特率发生器提供宽范围的波特率选择。
一个波特率寄存器(USART_BRR),12位的整数和4位小数

任何USART双向通信至少需要两个脚:
接收数据输入(RX)和发送数据输出(TX)

当发送器被激活并且不发送数据时,TX引脚处于高电平
在起始位期间,TX脚处于低电平,在停止位期间处于高电平。

发送和接收由一共用的波特率发生器驱动,当发送器和接收器的使能位分别置位时,分别为其产生时钟。

在这里插入图片描述

空闲符号和端口符号

  • 空闲符号是一个帧,并且全部由1组成,空闲帧后面跟着下一个数据帧的起始位。(空闲帧包含停止位)

空闲符号被视为完全由’1’组成的一个完整的数据帧,后面跟着包含了数据的下一帧的开始位(‘1’的位数也包括了停止位的位数)。

  • 断开符号是一个帧,并且全部有0组成,断开帧后面跟着一个停止位。

断开符号被视为在一个帧周期内全部收到’0’(包括停止位期间,也是’0’)。在断开帧结束时,发送器再插入1或2个停止位(‘1’)来应答起始位。

在这里插入图片描述
当起始位为1位,数据位为8位,停止位为1位时:

  • 空闲帧包括了停止位。

  • 断开帧是10位低电平,后跟停止位。

发送(TX)器

  • 可设置寄存器来确定数据位是8位还是9位。
  • 通过置位TE位来使能发送,发送移位寄存器中的数据将会被输出到TX引脚上。相应的时钟脉冲在CK脚上输出。
  • 在TX引脚上首先移出数据的最低有效位LSB,先发送LSB
  • TE位被激活后将发送一个空闲帧(空闲符号)
    在这里插入图片描述

配置步骤

在这里插入图片描述

  • 发送数据寄存器空(TXE)
  • 发送完成(TE)

串口数据发送过程:

将数据写入DR(一个字节的大小)中,DR会将数据复制到TDR中,TDR会将数据复制到发送移位寄存器中,从LSB(最低有效位)一位位发送到TX引脚上,实现数据的发送。
其中:
每发送完一个字节(发送数据寄存器TDR为空)TXE标志会被置位。
全部数据发送完毕后TC标志会被置位。

接收器

USART可以根据USART_CR1的M位接收8位或9位的数据字
在USART接收期间,数据的最低有效位首先从RX脚移进到接收数据寄存器中。

空闲符号
当一空闲帧被检测到时,其处理步骤和接收到普通数据帧一样,但如果IDLEIE位被设置将产生一个中断。

配置步骤

在这里插入图片描述

  • 接收到的数据已准备好读取(RXNE)

串口数据接收过程:
接收移位寄存器从RX引脚接收数据,从数据最低有效位开始(因为数据是先发送最低有效位)接收数据,当接收到一个字节的数据时,将数据复制到RDR寄存器和DR寄存器中,此时RXNE标志被置位,通过读取DR寄存器来获取接收的一个字节数据。

分数波特率

波特率寄存器(USART_BRR),12位的整数和4位小数
用12位二进制数表示整数部分,4位表示小数部分。
在这里插入图片描述

波特率计算公式
在这里插入图片描述
设置波特率位115200,fck = 36MHz,则USARTDIV = 19.5
整数部分为19 << 4 = 304
小数部分为0.5*16 = 8
USART_BRR寄存器的值位304+8=312=0x138

中断

注意:USART的各种中断事件被连接到同一个中断向量
在这里插入图片描述

demo

串口异步通信-阻塞式发送-仿printf发送

采用STM32F103C8T6单片机,KeilMDK5.32版本

串口异步通信,,仅开启发方向,阻塞式发送数据(仿printf发送)。
PC13控制LED灯,LED灯的亮灭指示程序正常运行。

串口仿printf发送函数

#define USART1_SENDBUFF_MAX_BYTES	100U	//串口1发送缓冲区大小 单位字节

/**
  * @brief  UART 仿printf发送
  * @param  format	输出的字符串
  * @retval 返回写入的字符总数
  */
int USART1Printf(const char* format, ...)
{
	static char sendBuff[USART1_SENDBUFF_MAX_BYTES] = { 0 };//发送缓冲区
	int bytes = 0;
	va_list list;

	va_start(list, format);
	bytes = vsprintf(sendBuff, format, list);//格式化输入
	va_end(list);
	/* 发送之前清除标志位 */
	CLEAR_BIT(huart1.Instance->SR, USART_SR_TC_Msk);//往TC位写入0来清除TC位
	HAL_UART_Transmit(&huart1, (void*)sendBuff, bytes, INFINITE);//阻塞式发送数据,发送等待时间为最大等待时间

	return bytes;
}

HAL_UART_Transmit()是HAL库串口阻塞式发送函数,这个函数没有用到TXE与TC标志位,发送结束后也没有清除标志。

主程序中的代码

while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	HAL_Delay(1000);//延时1000毫秒
	USART1Printf("Hello World! %hhu\r\n", times);
	times++;
	PCout(13) = !PCin(13);

  }

STM32CubeMX配置
在这里插入图片描述

工程文件下载链接

串口异步通信-非阻塞式发送-仿printf发送

采用STM32F103C8T6单片机,KeilMDK5.32版本

串口异步通信,,仅开启发方向,非阻塞式发送数据(仿printf发送)。
PC13控制LED灯,LED灯的亮灭指示程序正常运行。

串口仿printf发送函数

#define USART_SENDBUFF_MAX_BYTES	100U	//串口1发送缓冲区大小 单位字节
/**
  * @brief  UART 仿printf发送
  * @param  huart	指向串口结构体的指针
  * @param  format	输出的字符串
  * @retval 返回写入的字符总数
  */
int USARTPrintf(UART_HandleTypeDef *huart, const char* format, ...)
{
	static char sendBuff[USART_SENDBUFF_MAX_BYTES] = { 0 };
	int bytes = 0;
	va_list list;

	va_start(list, format);
	bytes = vsprintf(sendBuff, format, list);
	va_end(list);

	/* 发送之前清除标志位 */
	CLEAR_BIT(huart->Instance->SR, USART_SR_TC_Msk);//往TC位写入0来清除TC位
	HAL_UART_Transmit_IT(huart, (void*)sendBuff, bytes);//非阻塞式发送数据,开启TXE中断,再全部数据都写入DR寄存器并发送后将关闭TXE中断,开启TC中断

	return bytes;
}

HAL_UART_Transmit_IT()函数开启了TXE中断,并在最后一个字节发送结束之后开启TC中断。如下图

HAL_UART_IRQHandler()函数
在这里插入图片描述
这里有2个函数需要注意

  • UART_Transmit_IT()是每发送完一个字节,则进入该函数里面,往DR寄存器写入下一个字节,如果是最后一个字节则关闭TXE中断开启TC中断。
    在这里插入图片描述

  • UART_EndTransmit_IT()全部数据发送完毕,关闭TC中断,进入发送完毕回调函数
    在这里插入图片描述
    STM32CubeMX配置
    在这里插入图片描述
    在这里插入图片描述

发送完成回调函数HAL_UART_TxCpltCallback()
在进入该函数前,TXE与TC中断已关闭。

在发生串口回调函数(TXE/TC)时,并且全部数据发送完毕,HAL_UART_IRQHandler()调用UART_EndTransmit_IT(),UART_EndTransmit_IT()在关闭TC中断后进入HAL_UART_TxCpltCallback()。

/**
  * @brief  Tx Transfer completed callbacks.
  * @param  huart  Pointer to a UART_HandleTypeDef structure that contains
  *                the configuration information for the specified UART module.
  * @retval None
  */
__weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
  /* NOTE: This function should not be modified, when the callback is needed,
           the HAL_UART_TxCpltCallback could be implemented in the user file
   */
}

工程文件下载链接

串口异步通信-非阻塞式接收数据

HAL库的阻塞式接收数据函数HAL_UART_Receive()
使用示例HAL_UART_Receive(&huart1, (void*)receiveBuff, sizeof(receiveBuff), INFINITE);

/**
  * @brief  Receives an amount of data in blocking mode.
  * @note   When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
  *         the received data is handled as a set of u16. In this case, Size must indicate the number
  *         of u16 available through pData.
  * @param  huart Pointer to a UART_HandleTypeDef structure that contains
  *               the configuration information for the specified UART module.
  * @param  pData Pointer to data buffer (u8 or u16 data elements).
  * @param  Size  Amount of data elements (u8 or u16) to be received.
  * @param  Timeout Timeout duration
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);

非阻塞式接收数据函数HAL_UART_Receive_IT()
该函数会开启以下中断

  • 奇偶检验错(PE)
  • 帧错误、噪声错误、溢出错误(NE或ORT或FE)
  • UART数据寄存器非空中断(RXNE)

并且会将huart的接收类型设置为HAL_UART_RECEPTION_STANDARD
接收类型值有

  • HAL_UART_RECEPTION_STANDARD标准接收
  • HAL_UART_RECEPTION_TOIDLE接收至完成或闲置事件
/**
  * @brief  Receives an amount of data in non blocking mode.
  * @note   When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
  *         the received data is handled as a set of u16. In this case, Size must indicate the number
  *         of u16 available through pData.
  * @param  huart Pointer to a UART_HandleTypeDef structure that contains
  *               the configuration information for the specified UART module.
  * @param  pData Pointer to data buffer (u8 or u16 data elements).
  * @param  Size  Amount of data elements (u8 or u16) to be received.
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

HAL_UART_IRQHandler()函数会调用UART_Receive_IT()进行串口接收中断处理。UART_Receive_IT()会将DR寄存器中的数据复制到串口接收缓存区中,如果接收数据的字节数目满足指定的数目,则会关闭中断(RXNE,NE或ORT或FE,PE),根据接收类型进入相应的接收完成回调函数中。
在这里插入图片描述

下面示例串口非阻塞式接收数据
采用STM32F103C8T6单片机,KeilMDK5.32版本

串口异步通信,开启收发方向,阻塞式发送(仿printf发送);非阻塞式接收数据。
PC13控制LED灯,LED灯的亮灭指示接收到数据。

程序初始化完成之后,开启接收中断。
在接收完成回调函数中,重新开启接收中断(因为在进入接收回调函数前,所有与接收相关的中断已经关闭)

STM32CubeMX配置
在这里插入图片描述
在这里插入图片描述
接收完成回调函数HAL_UART_RxCpltCallback()

在进入该函数前,以下中断已关闭。

  • 奇偶检验错(PE)
  • 帧错误、噪声错误、溢出错误(NE或ORT或FE)
  • UART数据寄存器非空中断(RXNE)
extern char receiveBuff[15];
/**
  * @brief  Rx Transfer completed callbacks.
  * @param  huart  Pointer to a UART_HandleTypeDef structure that contains
  *                the configuration information for the specified UART module.
  * @retval None
  */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart == &huart1)
	{
		PCout(13) = !PCin(13);//;LED亮灭翻转 指示接收到数据
		HAL_UART_Receive_IT(&huart1, (void*)receiveBuff, sizeof(receiveBuff));
	}
}

注意一下:主要当全部数据都接收完毕(比如,想要收到15个字节的数据,当收到第15个字节的数据的时候)才会进入接收完成回调函数(在该函数中重新开启串口空闲接收)HAL_UART_RxCpltCallback()

工程文件下载链接

串口异步通信-串口空闲中断接收,未使用DMA

采用STM32F103C8T6单片机,KeilMDK5.32版本

串口异步通信,开启收发方向,阻塞式发送(仿printf发送);非阻塞式接收数据。
PC13控制LED灯,LED灯的亮灭指示接收到数据。

程序初始化完成之后,开启接收空闲中断。
在接收空闲回调函数中,重新开启接收空闲中断(因为在进入接收回调函数前,所有与接收相关的中断已经关闭)

串口空闲中断:检测到有数据被接收后,当总线上在一个字节的时间内没有再接收到数据的时候,触发串口空闲中断。

调用HAL_UARTEx_ReceiveToIdle_IT()来使用串口空闲中断,该函数会将串口接收类型设置为HAL_UART_RECEPTION_TOIDLE,开启RXNE,NE或ORT或FE,PE和串口空闲中断(IDLE)

在RXNE中断中,将数据(一个字节)复制到串口接收缓冲区中

串口空闲回调函数
在该函数中将LED亮灭取反,并重新开启串口空闲接收

extern char receiveBuff[15];
/**
  * @brief  Reception Event Callback (Rx event notification called after use of advanced reception service).
  * @param  huart UART handle
  * @param  Size  Number of data available in application reception buffer (indicates a position in
  *               reception buffer until which, data are available)
  * @retval None
  */
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
	if(huart == &huart1)
	{
		PCout(13) = !PCin(13);//;LED亮灭翻转 指示接收到数据
		HAL_UARTEx_ReceiveToIdle_IT(&huart1, (void*)receiveBuff, sizeof(receiveBuff));//重新开启串口空闲接收
	}
}

HAL_UART_IRQHandler()函数中有2处可以进入串口空闲回调函数

一处是UART_Receive_IT()
当数据全部接收完毕时(比如,想要收到15个字节的数据,实际也收到15个字节的数据),则进入串口空闲回调函数,在进入该函数前会将接收类型设置为HAL_UART_RECEPTION_STANDARD
在这里插入图片描述
另外一处是数据没有接收完毕(比如,想要收到15个字节的数据,实际收到少于15个字节的数据),也会进入串口空闲中断。
在这里插入图片描述

STM32CubeMX配置与非阻塞式接收数据demo一样。

工程文件下载链接

DMA式收发数据

利用DMA发送数据

在这里插入图片描述
注意:根据需要来确定是不是要DMA控制寄存器中开启存储器地址自增的位
在这里插入图片描述

TXE事件后,DMA传输指定地址上的数据到DR中和从DR中传输数据到TX引脚上是同时进行。
在这里插入图片描述

利用DMA接收数据

在这里插入图片描述
RXNE事件后,从RX引脚读出数据到DR寄存器中和DR寄存器中的数据复制的指定的地址中式同时进行的
在这里插入图片描述

串口异步通信-DMA式收发数据-仿printf发送

采用STM32F103C8T6单片机,KeilMDK5.32版本

串口异步通信,开启收发方向,DMA式收发数据(仿printf发送)。
收发的DMA不在循环模式下(单次)。
PC13控制LED灯,LED灯的亮灭指示接收到数据。
在STM32CubeMX中需要同时开启DMA与串口全局中断

DMA发送

调用HAL_UART_Transmit_DMA()来使用DMA发送数据,会开启DMA传输错误(TE),传输完成(TC)和传输完成一半(HT)中断。注意并没有开启串口的TC中断
在这里插入图片描述
一般用不到传输完成一半中断,如果不需要这个中断,可以将HAL_UART_Transmit_DMA()函数中 huart->hdmatx->XferHalfCpltCallback = UART_DMA_TxHalfCplt;
改为huart->hdmatx->XferHalfCpltCallback = NULL;即可
在这里插入图片描述

在DMA传输完成之后,开启串口的TC中断(UART_DMATransmitCplt()中开中断)

UART_DMATransmitCplt()函数如下
在这里插入图片描述

通过观察UART_DMATransmitCplt()函数源码,在DMA单次模式下,需要开启串口全局中断,在TC中断发生后,进入串口发送完成回调函数。

串口发送完成回调函数

/**
  * @brief  Tx Transfer completed callbacks.
  * @param  huart  Pointer to a UART_HandleTypeDef structure that contains
  *                the configuration information for the specified UART module.
  * @retval None
  */
__weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
  /* NOTE: This function should not be modified, when the callback is needed,
           the HAL_UART_TxCpltCallback could be implemented in the user file
   */
}

DMA接收

调用HAL_UART_Receive_DMA()函数来使能串口DMA接收。
该函数会使能NE或ORT或FE,PE
并且也会开启DMA传输错误(TE),传输完成(TC)和传输完成一半(HT)中断
注意:并没有开启RXNE中断

在DMA传输完成之后进入中断服务函数后,
UART_DMAReceiveCplt()函数调用HAL_UART_RxCpltCallback()串口接收完成回调函数
在这里插入图片描述
与DMA发送类似,如果不需要DMA传输完成一半的中断可以更改源码UART_Start_Receive_DMA()

huart->hdmarx->XferHalfCpltCallback = NULL;		以前是UART_DMARxHalfCplt;

STM32CubeMX配置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

接收回调函数中重新开启DMA接收(因为DMA处于单次模式下)
在这里插入图片描述

工程文件下载链接

串口异步通信-DMA式收发数据-仿printf发送-接收的DMA循环

采用STM32F103C8T6单片机,KeilMDK5.32版本

串口异步通信,开启收发方向,DMA式收发数据(仿printf发送)。
发的DMA不在循环模式下(单次);接收的DMA在循环模式下。
PC13控制LED灯,LED灯的亮灭指示接收到数据。
在STM32CubeMX中需要同时开启DMA与串口全局中断

在每次DMA传输完成之后,DMA中断服务函数中,检查DMA是否处于循环模式,如果是则不关闭传输完成TC和传输完成一半HT中断
在这里插入图片描述
中断服务函数调用UART_DMAReceiveCplt()函数,再次判断串口接收类型,根据类型进入相应的传输完成回调函数。
在这里插入图片描述
调用HAL_UART_Receive_DMA()函数,该函数不会开启RXNE中断。

因为DMA是循环模式,所有不需要重新开启接收在这里插入图片描述

STM32CubeMX配置
在这里插入图片描述

工程文件下载链接

串口异步通信-DMA式收发数据-仿printf发送-串口空闲接收

采用STM32F103C8T6单片机,KeilMDK5.32版本

串口异步通信,开启收发方向,DMA式收发数据(仿printf发送)。
发的DMA不在循环模式下(单次);接收的DMA在单次模式下。开启串口接收空闲中断
PC13控制LED灯,LED灯的亮灭指示接收到数据。
在STM32CubeMX中需要同时开启DMA与串口全局中断

通过调用函数HAL_UARTEx_ReceiveToIdle_DMA来使能DMA接收。
该函数会开启DMA相应的中断传输完成,传输完成一半,传输错误
和串口空闲中断,NE或ORT或FE,PE
注意没有开启RXNE中断

接收回调函数为HAL_UARTEx_RxEventCallback()(在该函数中重新开启串口DMA空闲接收)
分2种情况

  • 接收到指定数目的数据(如,想要15个字节数据,实际也是15个字节)
    HAL_DMA_IRQHandler()调用UART_DMAReceiveCplt()进入接收回调函数
    HAL_DMA_IRQHandler()
    在这里插入图片描述
    UART_DMAReceiveCplt()
    在这里插入图片描述

  • 接收的数据数目少于指定数目
    在串口服务函数HAL_UART_IRQHandler()中进入接收回调函数
    在这里插入图片描述

工程文件下载链接

串口异步通信-DMA式收发数据-仿printf发送-接收DMA循环-串口空闲接收

采用STM32F103C8T6单片机,KeilMDK5.32版本

串口异步通信,开启收发方向,DMA式收发数据(仿printf发送)。
发的DMA不在循环模式下(单次);接收的DMA在循环模式下。开启串口接收空闲中断
PC13控制LED灯,LED灯的亮灭指示接收到数据。
在STM32CubeMX中需要同时开启DMA与串口全局中断

调用HAL_UARTEx_ReceiveToIdle_DMA()开启串口DMA空闲接收,
该函数会开启DMA相应的中断传输完成,传输完成一半,传输错误
和串口空闲中断,NE或ORT或FE,PE
注意没有开启RXNE中断

接收回调函数为HAL_UARTEx_RxEventCallback()(不需要在该函数中重新开启串口DMA空闲接收)

同样的,

  • 接收的数据数目少于指定数目
    通过串口空闲中断进入接收回调函数中断函数
  • 接收到指定数目的数据
    通过DMA中断服务函数进入接收回调函数中断函数

在DMA传输完成一半中断关闭的条件下。按空闲中断的定义来说,接收到指定数据的数据也会触发串口空闲中断,从而在退出DMA中断后进入串口空闲中断,也就是触发2次中断(一次是DMA的中断传输完成中断,一次是串口空闲中断)。
但是在实验调试中,只触发一次中断DMA传输完成中断。在进入HAL_DMA_IRQHandler()函数前,调试发现SR寄存器被置位,在进入函数后,串口SR寄存器的IDLE位被自动复位,与手册的需要软件序列来复位说法不同,

在这里插入图片描述
猜想读串口DR寄存器也会清除IDLE标志位。
设计实验,开启串口空闲中断,发送数据,在串口中断服务函数中,先读DR寄存器,发现IDLE标志位被复位。
在这里插入图片描述
查看手册 串口DMA接收时序图
在DMA的传输完成标志位被置位后,进入DMA中断服务函数,此时DMA正在读串口的DR寄存器,从而将IDLE标志位复位。
在这里插入图片描述
但是,为了安全起见,还是在串口接收完成回调函数中添加软件系列复位IDLE标志的代码,如下
在这里插入图片描述
另外一个注意点
在接收的数据数目少于指定数目时候(DMA把串口DR寄存器的数据复制到串口接收缓冲区数组array中),比如指定接收15个字节数据,但是实际接收到7个字节数据,此时触发串口空闲中断,进入串口回调函数中处理这7个字节数据,存放下一个待接收字节的地址是array + 7,而不是array(从数组第0个字节开始存放接收到的数据)。

可通过如下方法修改
先失能DMA通道,修改修改DMA数据传输数量,再使能DMA通道

/**
  * @brief  Reception Event Callback (Rx event notification called after use of advanced reception service).
  * @param  huart UART handle
  * @param  Size  Number of data available in application reception buffer (indicates a position in
  *               reception buffer until which, data are available)
  * @retval None
  */
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
	if(huart == &huart1)
	{
		__HAL_UART_CLEAR_IDLEFLAG(huart);//清除串口空闲标志位
		__HAL_DMA_DISABLE(huart->hdmarx);//失能DMA
		WRITE_REG(huart->hdmarx->Instance->CNDTR, sizeof(receiveBuff));//修改DMA数据传输数量
		__HAL_DMA_ENABLE(huart->hdmarx);//使能DMA
		PCout(13) = !PCin(13);//;LED亮灭翻转 指示接收到数据
	}
}

工程文件下载链接

STM32CubeMX使用DMA的注意点

使用STM32CubeMX配置得工程文件中,任何使用DMA的外设初始化函数必须得再DMA初始化后再进行外设初始化。否则DMA无效
在这里插入图片描述

HAL库没有设置中断向量表
需要手动设置中断向量表

#define VECT_TAB_FLASH_BASE_ADDRESS  FLASH_BASE      /*!< Vector Table base address field.
                                                     This value must be a multiple of 0x200. */
#define VECT_TAB_SRAM_BASE_ADDRESS   SRAM_BASE       /*!< Vector Table base address field.
                                                     This value must be a multiple of 0x200. */
#define VECT_TAB_OFFSET              0x00000000U     /*!< Vector Table base offset field.
                                                     This value must be a multiple of 0x200. */

#define NVIC_SET_VECTOR(vector, offset)  SCB->VTOR = ((uint32_t)(vector)) | ((uint32_t)(offset) & (uint32_t)0x1FFFFF80);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【STM32】HAL库-串口USART 的相关文章

  • 在地址“0xXXXXXX”处中断,没有可用的调试信息,或在程序代码之外

    配置 使用 Nucleo L476RG 使用 GNU ARM Eclipse 我从 STM32CubeMX 生成了一个极简代码 我已经在我的板载 ST Link 中刷新了 J link 驱动程序 一直在尝试为我的代码运行调试器 但我的程序计
  • 以字符串形式接收数字(uart)

    我正在尝试通过 uart 接收一个包装为字符串的数字 我发送数字 1000 所以我得到 4 个字节 空字符 但是 当我使用 atoi 将数组转换为数字并将整数与 1000 进行比较时 我并不总是得到正确的数字 这是我用于接收号码的中断处理函
  • 如何让printf在STM32F103上工作?

    我是 STM32F103 世界的新手 我有一个STM32F103的演示代码 我正在使用arm none eabi来编译它 我尝试了在谷歌上可以找到的内容 但到目前为止没有任何效果 我已经花了三天时间来解决这个问题 任何人都可以给我一个运行良
  • 133-基于stm32单片机停车场车位管理系统Proteus仿真+源程序

    资料编号 133 一 功能介绍 1 采用stm32单片机 4位数码管 独立按键 制作一个基于stm32单片机停车场车位管理系统Proteus仿真 2 通过按键进行模拟车辆进出 并且通过程序计算出当前的剩余车位数量 3 将剩余的车位数量显示到
  • 137-基于stm32单片机智能保温杯控制装置Proteus仿真+源程序

    资料编号 137 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DS18B20传感器 电机 制作一个基于stm32单片机智能保温杯控制装置Proteus仿真 2 通过DS18b20传感器检测当前保温杯水的温度 并且
  • HAL库STM32常用外设教程(二)—— GPIO输入\输出

    HAL库STM32常用外设教程 二 GPIO输入 输出 文章目录 HAL库STM32常用外设教程 二 GPIO输入 输出 前言 一 GPIO功能概述 二 GPIO的HAl库驱动 三 GPIO使用示例 1 示例功能 四 代码讲解 五 总结
  • rt-thread studio中新建5.02版本报错

    先吐槽一下 rt thread studio出现BUG真多 好多时间都是在找BUG 但里面用好多控件还是挺好用的 真是又爱又恨 所以一般使用功能不多的话还是用keil多一点 创建5 02版本工程之后直接进行编译 直接会报下面这个错误 资源
  • 物联网网关

    物联网网关是 连接物联网设备和互联网的重要桥梁 它负责将物联网设备采集到的数据进行处理 存储和转发 使其能够与云端或其它设备进行通信 物联网网关的作用是实现物联网设备与云端的无缝连接和数据交互 物联网网关功能 数据采集 物联网网关可以从物联
  • HAL库学习

    CMSIS简介 CMSIS Cortex Microcontroller Software Interface Standard 微控制器软件接口标准 由ARM和其合作的芯片厂商 ST NXP 软件工具厂商 KEIL IAR 共同制定的标准
  • 毕业设计 江科大STM32的智能温室控制蓝牙声光报警APP系统设计

    基于STM32的智能温室控制蓝牙声光报警APP系统设计 1 项目简介 1 1 系统构成 1 2 系统功能 2 部分电路设计 2 1 stm32f103c8t6单片机最小系统电路设计 2 2 LCD1602液晶显示电路设计 2 2 风
  • [屏驱相关]【SWM166-SPI-Y1.28C1测评】+ 有点惊艳的开箱

    耳闻华芯微特许久了 看到论坛得评测活动赶紧上了末班车 毕竟对有屏幕得板子也是很喜欢得 京东快递小哥客客气气 微笑着把快递给了我 好评 直接拆了包 在此之前没看过视频号 所以这个圆盘盘得模具还是有点惊喜的 正面照如下 开机有灯光秀 还有动画
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • STM32 暂停调试器时冻结外设

    当到达断点或用户暂停代码执行时 调试器可以停止 Cortex 中代码的执行 但是 当皮质停止在暂停状态下执行代码时 调试器是否会冻结其他外设 例如 DMA UART 和定时器 您只能保留时间 r 取决于外围设备 我在进入主函数时调用以下代码
  • 嵌入式开发--STM32G4系列片上FLASH的读写

    这个玩意吧 说起来很简单 就是几行代码的事 但楞是折腾了我大半天时间才搞定 原因后面说 先看代码吧 读操作 读操作很简单 以32位方式读取的时候是这样的 data IO uint32 t 0x0800F000 需要注意的是 当以32位方式读
  • 嵌入式 C++11 代码 — 我需要 volatile 吗?

    采用 Cortex M3 MCU STM32F1 的嵌入式设备 它具有嵌入式闪存 64K MCU固件可以在运行时重新编程闪存扇区 这是由闪存控制器 FMC 寄存器完成的 所以它不像a b那么简单 FMC 获取缓冲区指针并将数据刻录到某个闪存
  • 使用 STM32 USB 设备库将闪存作为大容量存储设备

    我的板上有这个闪存IC 它连接到我的STM32F04 ARM处理器 处理器的USB端口可供用户使用 我希望我的闪存在通过 USB 连接到 PC 时被检测为存储设备 作为第一步 我在程序中将 USB 类定义为 MSC 效果很好 因为当我将主板
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE

随机推荐

  • 内存分段与内存分页:逻辑地址、物理地址、线性地址、虚拟地址

    这篇文章也是我自己的博客网站的里的文章 xff0c 我觉得这篇文章还是我觉得知识含量比较高的文章 xff0c 所以特地把它发出来看看 这篇文章写于我在写自己的操作系统JackOS的时候系统梳理了一下CPU访问内存的各种方式 xff0c 写完
  • VSCode调试C/C++项目

    最近写完了自己的操作系统 xff0c 深感有一个方便的调试环境是有多么重要 xff0c 能够提升不少开发效率 恰好最近在的技术交流群里群友在问如何搭建VSCode调试操作系统的环境 xff0c 刚考完试 xff0c 就先把这篇VSCode调
  • 误差与精度

    整理自 误差理论与数据处理 合肥工业大学 机械专业用于教授学生误差与精度概念的课程叫做 公差与测量 或者叫做 机械精度设计 xff0c 而公差或者精度的本质含义就是误差的大小 xff0c 公差越小 xff0c 误差越小 xff0c 精度越高
  • 两个类的头文件互相包含

    两个类的头文件互相包含 我做任务的时候遇到了两个类都互相包含对方的对象的问题 xff0c 本来是有错误的 xff0c 但经过我一番改动 xff0c 两个头文件互相包含同时 xff0c 每个头文件都含有令一个类的前置声明 虽然最后运行正确 x
  • 【C++ STL 容器】——vector

    概述 vector容器也被称作向量 xff0c 实现了动态的数组 xff0c 用于元素数量变化的对象数组 xff0c 算是比较常用的容器 常用函数 构造函数 vector 创建一个空vectorvector int size 创建一个vec
  • 2021-07-22

    MSP432在keil中通过CMSIS DAP下载程序出现cannot enter debug mode的解决办法 xff1a MSP432下载程序出现cannot enter debug mode 可以通过修改如下设置 Debug里面的两
  • 通信协议基础以及常用的串口通信协议

    通信协议 xff1a 串行通信和并行通信 在数据的通信方式中根据数据传输方式的不同可以分为 xff1a 串行通信和并行通信 串行通信 xff1a 串行通信是指使用一条数据线 xff0c 将数据一位一位地依次传输 xff0c 每一位数据占据一
  • Ubuntu安装ROS melodic,管理环境,创建工作空间

    一 安装ROS 1 设置源 xff1a sudo sh c 39 etc lsb release amp amp echo 34 deb http mirrors tuna tsinghua edu cn ros ubuntu 96 lsb
  • HTTP请求报文的结构组成及URL的结构组成

    HTTP请求报文 HTTP 超文本传输协议 Hypertext Transfer Protocol xff0c 简称HTTP 是应用层协议 HTTP 是一种请求 响应式的协议 xff0c 即一个客户端与服务器建立连接后 xff0c 向服务器
  • Qt之旅_001>>Qt常用窗口类之间的关系

    QApplication xff0c QGuiApplication QCoreApplication三者之间的关系 QCoreApplication处于core模块中 xff0c 为应用程序提供了一个非gui的时间循环 xff1b QGu
  • GPIO相关介绍

    文章目录 GPIO概念TXD与RXD GPIO的使用注意STM32IO口哪些兼容5V一定不要接超过5V的电压默认不能做输出的GPIO GPIO硬件原理图GPIO地址 GPIO的八种工作模式浮空输入带上拉输入带下拉输入模拟输入开漏输出推挽输出
  • STM32的常用C语言

    文章目录 一些被坑了的注意点 int16 define结构体与共用体指针 C语言发展史C语言概述C90 标准C99标准C11标准 C编译o代替c 条件语句else ifdo while 变量定义一个字符串字符串结尾 定义一个字符串数组sta
  • STM32应用霍尔转速传感器基于输入捕获

    这里我用通用定时器3的通道1来测量转速 霍尔转速传感器基本介绍霍尔传感器分类和原理关于为什么选用开关型常开PNP型霍尔传感器 STM32程序实现程序介绍程序源码TIM3 CAP HTIM3 CAP H解读TIM3 CAP CTIM3 CAP
  • Android so库开发——使用Studio生成自己的so库(一)

    一 创建Native项目 1 新建 Native 项目 1 xff09 新建项目 选择最下面的 Native C 43 43 下一步即可 2 xff09 填写项目信息 3 xff09 选择C 43 43 版本可以直接选择默认 2 下载并配置
  • C语言实现线性回归求斜率

    2020 11 22 修改 span class token comment 线性回归求斜率 注意数据类型 参数 count 数据个数 数组行 列 的个数 数组的行列数目相等 参数 dataCol X 数据的列数据 参数 dataRow Y
  • 【C语言】详解位域定义与使用

    位域的定义 span class token keyword struct span span class token class name bit span span class token punctuation span span c
  • C语言实现MQTT协议(一)协议讲解

    MQTT介绍 MQTT是一个客户端服务端架构的发布 订阅模式的消息传输协议 它的设计思想是轻巧 开放 简单 规范 xff0c 易于实现 这些特点使得它对很多场景来说都是很好的选择 xff0c 特别是对于受限的环境如机器与机器的通信 xff0
  • 【STM32】HAL库-外部中断

    外部中断框图 产生中断 硬件触发外部中断 配置中断屏蔽寄存器中的屏蔽位 xff0c 允许该外部中断请求 通过AFIO EXTICRx配置GPIO线上的外部中断 事件 xff0c 必须先使能AFIO时钟 选择外部中断的触发边沿 xff0c 上
  • 【STM32】HAL库-系统滴答定时器SysTick

    SysTick定时器被捆绑在NVIC中 xff0c 是一个简单的定时器 xff0c 对于CM3 CM4内核芯片 xff0c 都有Systick定时器 Systick定时器常用来做延时 xff0c 或者实时系统的心跳时钟 这样可以节省MCU资
  • 【STM32】HAL库-串口USART

    USART简介 通用同步异步收发器 USART 提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换 USART利用分数波特率发生器提供宽范围的波特率选择 一个波特率寄存器 USART BRR xff0c