STM32 串口 FIFO

2023-05-16

使用FIFO实现串口数据的收发功能

FIFO的相关实现参照链接:CSDNicon-default.png?t=L892https://mp.csdn.net/mp_blog/creation/editor/120448361

1、Cubemx串口配置

        使用Cubmx对串口进行配置如下:

 

 ​​​​​​​

 

 2、驱动程序编写

2.1驱动初始化

        进行串口收发FIFO的创建,进行发送FIFO回调函数的初始化,调用函数UsartStartCloseHT实现串口DMA+IDLE模式接收,同时关闭DMA的半满中断,减少进中断次数。

/**
***************************************************
* @brief    bsp_uart_Init
* @note     串口初始化
* 		    FIFO的初始化,以DMA IDLE 模式开启接收
* @param	NONE
* @retval  	NONE
* @data   	2021.09.03
* @auth   	WXL
* @his    	1.0.0.0     2021.09.03     WXL
* 				create
***************************************************
**/
void bsp_uart_Init()
{
	Usart1RxFifo = func_fifo_Create(UART_RX_BUFF_SIZE*2,FIFO_TYPE_INT_PUSH);
	Usart1TxFifo = func_fifo_Create(UART_TX_BUFF_SIZE*2,FIFO_TYPE_INT_PULL);
	Usart1TxFifo->func_timmer = Usart1_SendInTimer;

	Usart6RxFifo = func_fifo_Create(UART_RX_BUFF_SIZE*2,FIFO_TYPE_INT_PUSH);
	Usart6TxFifo = func_fifo_Create(UART_TX_BUFF_SIZE*2,FIFO_TYPE_INT_PULL);
	Usart6TxFifo->func_timmer = Usart6_SendInTimer;

	UsartStartCloseHT(&huart1, (uint8_t*)&Usart1RxBuff[0], UART_RX_BUFF_SIZE);
	UsartStartCloseHT(&huart6, (uint8_t*)&Usart6RxBuff[0], UART_RX_BUFF_SIZE);
}

 

static void UsartStartCloseHT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
	HAL_StatusTypeDef ret = HAL_BUSY;
	while(ret != HAL_OK)
	{
		ret = HAL_UARTEx_ReceiveToIdle_DMA(huart, pData, Size);
	}
	huart->hdmarx->Instance->CR &= (uint32_t)~DMA_IT_HT;
}

2.2串口接收处理

        使用HAL库使能串口接收DMA+IDLE后,串口在接收完成或DMA满后会进入到中断中,并调用回调函数HAL_UARTEx_RxEventCallback,我们在该函数中将接收到的数据进行FIFO写入操作。

        串口接收过程中我们使用了两个缓冲区,中断中进行缓冲区的切换及数据向FIFO的写入操作。

/**
***************************************************
* @brief   HAL_UARTEx_RxEventCallback
* @note    串口接收中断函数
*          进行当前中断时需写入到FIFO中数量的计算�??????
*          更新FIFO的状态�??
* @param	huart		指向对应的串�??????
* 			Size		数量
* @retval  	NONE
* @data   	2021.09.03
* @auth   	WXL
* @his    	1.0.0.0     2021.09.03     WXL
* 				create
***************************************************
**/
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
	if(huart == &huart1)
	{
		if(huart1.hdmarx->Instance->M0AR == (int32_t)&Usart1RxBuff[0])
		{
			UsartStartCloseHT(&huart1, (uint8_t*)&Usart1RxBuff[1], UART_RX_BUFF_SIZE);
			func_fifo_PushInt(Usart1RxFifo, Size, (uint8_t*)&Usart1RxBuff[0]);
		}
		else
		{
			UsartStartCloseHT(&huart1, (uint8_t*)&Usart1RxBuff[0], UART_RX_BUFF_SIZE);
			func_fifo_PushInt(Usart1RxFifo, Size, (uint8_t*)&Usart1RxBuff[1]);
		}
	}
	if(huart == &huart6)
	{
		if(huart6.hdmarx->Instance->M0AR == (int32_t)&Usart6RxBuff[0])
		{
			UsartStartCloseHT(&huart6, (uint8_t*)&Usart6RxBuff[1], UART_RX_BUFF_SIZE);
			func_fifo_PushInt(Usart6RxFifo, Size, (uint8_t*)&Usart6RxBuff[0]);
		}
		else
		{
			UsartStartCloseHT(&huart6, (uint8_t*)&Usart6RxBuff[0], UART_RX_BUFF_SIZE);
			func_fifo_PushInt(Usart6RxFifo, Size, (uint8_t*)&Usart6RxBuff[1]);
		}
	}
}

2.2串口发送处理

        串口发送过程中,先将数据压入到串口发送的FIFO中,判断串口发送不繁忙时,将数据读取到发送缓冲区记性DMA发送。

/**
***************************************************
* @brief   	USART_SendData
* @note    	串口接收中断函数
*          	进行当前中断时需写入到FIFO中数量的计算�?????
*          	更新FIFO的状态�??
* @param	huart		指向对应的串�?????
* 			Size		数量
* @retval  	NONE
* @data   	2021.09.03
* @auth   	WXL
* @his    	1.0.0.0     2021.09.03     WXL
* 				create
***************************************************
**/
FifoErr bsp_uart_Send(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
	FifoErr err = FIFO_EOK;
	INT16U len = 0;
	if(huart == &huart1)
	{
		//将数据压入到发的FIFO中去
		err = func_fifo_Push(Usart1TxFifo, Size, pData);
		if (huart->gState == HAL_UART_STATE_READY)
		{
			if( func_fifo_PullPartInt(Usart1TxFifo, UART_TX_BUFF_SIZE, Usart1TxBuff, &len) == FIFO_EOK)
			{
				HAL_UART_Transmit_DMA(&huart1, Usart1TxBuff, len);
			}
		}
		return err;
	}
	if(huart == &huart6)
	{
		//将数据压入到发的FIFO中去
		err = func_fifo_Push(Usart6TxFifo, Size, pData);
		if (huart->gState == HAL_UART_STATE_READY)
		{
			if( func_fifo_PullPartInt(Usart6TxFifo, UART_TX_BUFF_SIZE, Usart6TxBuff, &len) == FIFO_EOK)
			{
				HAL_UART_Transmit_DMA(&huart6, Usart6TxBuff, len);
			}
		}
		return err;
	}
	return FIFO_EFAILED;
}

DMA发送完成后会进入发送完成中断,中断对未发送完的数据进行继续发送

/**
***************************************************
* @brief    HAL_UART_TxCpltCallback
* @note     HAL库回调函数
* @param	NONE
* @retval  	NONE
* @data   	2021.09.03
* @auth   	WXL
* @his    	1.0.0.0     2021.09.03     WXL
* 				create
***************************************************
**/
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
	bsp_uart_TxCallBack(huart);
}
/**
***************************************************
* @brief    bsp_uart_SendTimer
* @note     串口发送时的FIFO回调函数。
* @param	NONE
* @retval  	NONE
* @data   	2021.09.03
* @auth   	WXL
* @his    	1.0.0.0     2021.09.03     WXL
* 				create
***************************************************
**/
static void bsp_uart_TxCallBack(UART_HandleTypeDef *huart)
{
	INT16U len = 0;

	if (huart->gState == HAL_UART_STATE_READY)
	{
		if(huart == &huart1)
		{
			HAL_GPIO_WritePin(O_SERIAL_GPIO_Port, O_SERIAL_Pin, GPIO_PIN_SET);
			if( func_fifo_PullPart(Usart1TxFifo, UART_TX_BUFF_SIZE, Usart1TxBuff, &len) == FIFO_EOK)
			{
				HAL_UART_Transmit_DMA(&huart1, Usart1TxBuff, len);
			}
		}
		if(huart == &huart6)
		{
			if( func_fifo_PullPart(Usart6TxFifo, UART_TX_BUFF_SIZE, Usart6TxBuff, &len) == FIFO_EOK)
			{
				HAL_UART_Transmit_DMA(&huart6, Usart6TxBuff, len);
			}
		}
	}
}

2.3串口FIFO的定时器功能

        FIFO定时器遍历FIFO链表

        对接收FIFO实现备份缓冲到FIFO的写入操作

        对发送FIFO实现未发送完成数据的继续发送。

2.3串口错误处理

        解决串口接收发送过程中发生溢出中断等意外情况

/**
***************************************************
* @brief   HAL_UART_ErrorCallback
* @note    错误中断处理
* @param	huart		指向对应的串口
* @retval  	NONE
* @data   	2021.09.17
* @auth   	WXL
* @his    	1.0.0.0     2021.09.17     WXL
* 				create
***************************************************
**/
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
    __HAL_UART_CLEAR_OREFLAG(huart);

	if(huart == &huart1)
	{
		UsartStartCloseHT(&huart1, (uint8_t*)&Usart1RxBuff[1], UART_RX_BUFF_SIZE);
	}
	if(huart == &huart6)
	{
		UsartStartCloseHT(&huart6, (uint8_t*)&Usart6RxBuff[0], UART_RX_BUFF_SIZE);
	}
}

2.3详细完整代码

/*   说明:
 *      @实现需要的支持:
 *         1)USART			串口外设,进行数据接收及发送
 *         2)func_fifo.h	提供接收发送FIFO支持
 *
 *      @实现原理及功能:
 *         串口接收使用DMA+IDLE模式实现(关闭了DMA的半满中断)
 *         		1)中断中在FIFO不繁忙时将接收数据写入到FIFO中。
 *         		2)中断中在FIFO繁忙时,将数据写入到BACK区域
 *            		通过FIFO的定时器来实现BACK数据向FIFO的写入功能。
 *         串口的发送使用发送完成中断结合DMA的定时器回调功能实现。
 *     @his
 *        ver:1.0.0.0
 *        author:WXL
 *        note:create      2021.09.04
 *
 *        ver:1.0.0.1
 *        author:WXL
 *        note:create      2021.09.17
 *        增加错误中断处理,解决串口1不接受数据的问题。
 */
/*************************************************************************************************************************
 *                                                   宏定义
**************************************************************************************************************************/
#include "bsp_uart.h"
/*************************************************************************************************************************
 *                                                   宏定义
**************************************************************************************************************************/
#define UART_TX_BUFF_SIZE	1024
#define UART_RX_BUFF_SIZE	1024
/*************************************************************************************************************************
 *                                                   局部变量
**************************************************************************************************************************/
FifoTypeDef*			Usart1RxFifo;
static FifoTypeDef*		Usart1TxFifo;
static INT8U			Usart1RxBuff[2][UART_RX_BUFF_SIZE]={0};
static INT8U			Usart1TxBuff[UART_TX_BUFF_SIZE]={0};

FifoTypeDef*			Usart6RxFifo;
static FifoTypeDef*		Usart6TxFifo;
static INT8U			Usart6RxBuff[2][UART_RX_BUFF_SIZE]={0};
static INT8U			Usart6TxBuff[UART_TX_BUFF_SIZE]={0};
/*************************************************************************************************************************
 *                                                   全局变量
**************************************************************************************************************************/
extern UART_HandleTypeDef huart1;
extern UART_HandleTypeDef huart6;
/*************************************************************************************************************************
 *                                                    局部函数
**************************************************************************************************************************/

/**
***************************************************
* @brief    bsp_uart_SendTimer
* @note     串口发送时的FIFO回调函数。
* @param	NONE
* @retval  	NONE
* @data   	2021.09.03
* @auth   	WXL
* @his    	1.0.0.0     2021.09.03     WXL
* 				create
***************************************************
**/
static void bsp_uart_TxCallBack(UART_HandleTypeDef *huart)
{
	INT16U len = 0;

	if (huart->gState == HAL_UART_STATE_READY)
	{
		if(huart == &huart1)
		{
			HAL_GPIO_WritePin(O_SERIAL_GPIO_Port, O_SERIAL_Pin, GPIO_PIN_SET);
			if( func_fifo_PullPart(Usart1TxFifo, UART_TX_BUFF_SIZE, Usart1TxBuff, &len) == FIFO_EOK)
			{
				HAL_UART_Transmit_DMA(&huart1, Usart1TxBuff, len);
			}
		}
		if(huart == &huart6)
		{
			if( func_fifo_PullPart(Usart6TxFifo, UART_TX_BUFF_SIZE, Usart6TxBuff, &len) == FIFO_EOK)
			{
				HAL_UART_Transmit_DMA(&huart6, Usart6TxBuff, len);
			}
		}
	}
}
/**
***************************************************
* @brief    Usart1_SendInTimer
* @note     串口1发送时的FIFO回调函数。
* @param	NONE
* @retval  	NONE
* @data   	2021.09.03
* @auth   	WXL
* @his    	1.0.0.0     2021.09.03     WXL
* 				create
***************************************************
**/
static void Usart1_SendInTimer()
{
	bsp_uart_TxCallBack(&huart1);
}
/**
***************************************************
* @brief    Usart6_SendInTimer
* @note     串口1发送时的FIFO回调函数。
* @param	NONE
* @retval  	NONE
* @data   	2021.09.03
* @auth   	WXL
* @his    	1.0.0.0     2021.09.03     WXL
* 				create
***************************************************
**/
static void Usart6_SendInTimer()
{
	bsp_uart_TxCallBack(&huart6);
}
/**
***************************************************
* @brief    UsartStartCloseHT
* @note     串口1发送时的FIFO回调函数。
* @param	NONE
* @retval  	NONE
* @data   	2021.09.03
* @auth   	WXL
* @his    	1.0.0.0     2021.09.03     WXL
* 				create
***************************************************
**/
static void UsartStartCloseHT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
	HAL_StatusTypeDef ret = HAL_BUSY;
	while(ret != HAL_OK)
	{
		ret = HAL_UARTEx_ReceiveToIdle_DMA(huart, pData, Size);
	}
	huart->hdmarx->Instance->CR &= (uint32_t)~DMA_IT_HT;
}
/*************************************************************************************************************************
 *                                              		全局函数
**************************************************************************************************************************/
/**
***************************************************
* @brief    bsp_uart_Init
* @note     串口初始化
* 		    FIFO的初始化,以DMA IDLE 模式开启接收
* @param	NONE
* @retval  	NONE
* @data   	2021.09.03
* @auth   	WXL
* @his    	1.0.0.0     2021.09.03     WXL
* 				create
***************************************************
**/
void bsp_uart_Init()
{
	Usart1RxFifo = func_fifo_Create(UART_RX_BUFF_SIZE*2,FIFO_TYPE_INT_PUSH);
	Usart1TxFifo = func_fifo_Create(UART_TX_BUFF_SIZE*2,FIFO_TYPE_INT_PULL);
	Usart1TxFifo->func_timmer = Usart1_SendInTimer;

	Usart6RxFifo = func_fifo_Create(UART_RX_BUFF_SIZE*2,FIFO_TYPE_INT_PUSH);
	Usart6TxFifo = func_fifo_Create(UART_TX_BUFF_SIZE*2,FIFO_TYPE_INT_PULL);
	Usart6TxFifo->func_timmer = Usart6_SendInTimer;

	UsartStartCloseHT(&huart1, (uint8_t*)&Usart1RxBuff[0], UART_RX_BUFF_SIZE);
	UsartStartCloseHT(&huart6, (uint8_t*)&Usart6RxBuff[0], UART_RX_BUFF_SIZE);
}
/**
***************************************************
* @brief   	USART_SendData
* @note    	串口接收中断函数
*          	进行当前中断时需写入到FIFO中数量的计算�?????
*          	更新FIFO的状态�??
* @param	huart		指向对应的串�?????
* 			Size		数量
* @retval  	NONE
* @data   	2021.09.03
* @auth   	WXL
* @his    	1.0.0.0     2021.09.03     WXL
* 				create
***************************************************
**/
FifoErr bsp_uart_Send(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
	FifoErr err = FIFO_EOK;
	INT16U len = 0;
	if(huart == &huart1)
	{
		//将数据压入到发的FIFO中去
		err = func_fifo_Push(Usart1TxFifo, Size, pData);
		if (huart->gState == HAL_UART_STATE_READY)
		{
			if( func_fifo_PullPartInt(Usart1TxFifo, UART_TX_BUFF_SIZE, Usart1TxBuff, &len) == FIFO_EOK)
			{
				HAL_UART_Transmit_DMA(&huart1, Usart1TxBuff, len);
			}
		}
		return err;
	}
	if(huart == &huart6)
	{
		//将数据压入到发的FIFO中去
		err = func_fifo_Push(Usart6TxFifo, Size, pData);
		if (huart->gState == HAL_UART_STATE_READY)
		{
			if( func_fifo_PullPartInt(Usart6TxFifo, UART_TX_BUFF_SIZE, Usart6TxBuff, &len) == FIFO_EOK)
			{
				HAL_UART_Transmit_DMA(&huart6, Usart6TxBuff, len);
			}
		}
		return err;
	}
	return FIFO_EFAILED;
}

void bsp_uart_Test()
{
	INT8U temp[1024] = {0};
	INT16U len = 0;
	if(func_fifo_PullPart(Usart6RxFifo, 1024, temp,&len) == FIFO_EOK)
	{
	  bsp_uart_Send(&huart6, temp, len);
	}
	if(func_fifo_PullPart(Usart1RxFifo, 1024, temp,&len) == FIFO_EOK)
	{
	  bsp_uart_Send(&huart1, temp, len);
	}
}


/*************************************************************************************************************************
 *                                              		HAL库回调函数
**************************************************************************************************************************/

/**
***************************************************
* @brief   HAL_UARTEx_RxEventCallback
* @note    串口接收中断函数
*          进行当前中断时需写入到FIFO中数量的计算�??????
*          更新FIFO的状态�??
* @param	huart		指向对应的串�??????
* 			Size		数量
* @retval  	NONE
* @data   	2021.09.03
* @auth   	WXL
* @his    	1.0.0.0     2021.09.03     WXL
* 				create
***************************************************
**/
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
	if(huart == &huart1)
	{
		if(huart1.hdmarx->Instance->M0AR == (int32_t)&Usart1RxBuff[0])
		{
			UsartStartCloseHT(&huart1, (uint8_t*)&Usart1RxBuff[1], UART_RX_BUFF_SIZE);
			func_fifo_PushInt(Usart1RxFifo, Size, (uint8_t*)&Usart1RxBuff[0]);
		}
		else
		{
			UsartStartCloseHT(&huart1, (uint8_t*)&Usart1RxBuff[0], UART_RX_BUFF_SIZE);
			func_fifo_PushInt(Usart1RxFifo, Size, (uint8_t*)&Usart1RxBuff[1]);
		}
	}
	if(huart == &huart6)
	{
		if(huart6.hdmarx->Instance->M0AR == (int32_t)&Usart6RxBuff[0])
		{
			UsartStartCloseHT(&huart6, (uint8_t*)&Usart6RxBuff[1], UART_RX_BUFF_SIZE);
			func_fifo_PushInt(Usart6RxFifo, Size, (uint8_t*)&Usart6RxBuff[0]);
		}
		else
		{
			UsartStartCloseHT(&huart6, (uint8_t*)&Usart6RxBuff[0], UART_RX_BUFF_SIZE);
			func_fifo_PushInt(Usart6RxFifo, Size, (uint8_t*)&Usart6RxBuff[1]);
		}
	}
}
/**
***************************************************
* @brief   HAL_UART_ErrorCallback
* @note    错误中断处理
* @param	huart		指向对应的串口
* @retval  	NONE
* @data   	2021.09.17
* @auth   	WXL
* @his    	1.0.0.0     2021.09.17     WXL
* 				create
***************************************************
**/
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
    __HAL_UART_CLEAR_OREFLAG(huart);

	if(huart == &huart1)
	{
		UsartStartCloseHT(&huart1, (uint8_t*)&Usart1RxBuff[1], UART_RX_BUFF_SIZE);
	}
	if(huart == &huart6)
	{
		UsartStartCloseHT(&huart6, (uint8_t*)&Usart6RxBuff[0], UART_RX_BUFF_SIZE);
	}
}

/**
***************************************************
* @brief    HAL_UART_TxCpltCallback
* @note     HAL库回调函数
* @param	NONE
* @retval  	NONE
* @data   	2021.09.03
* @auth   	WXL
* @his    	1.0.0.0     2021.09.03     WXL
* 				create
***************************************************
**/
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
	bsp_uart_TxCallBack(huart);
}
#ifndef _BSP_UART_H_
#define _BSP_UART_H_
/*************************************************************************************************************************
 *                                                   头文件
**************************************************************************************************************************/
#include "main.h"
#include "func_fifo.h"
/*************************************************************************************************************************
 *                                                   全局变量申明
**************************************************************************************************************************/
extern FifoTypeDef*		Usart1RxFifo;
extern FifoTypeDef*		Usart6RxFifo;
/*************************************************************************************************************************
 *                                                   函数声明
**************************************************************************************************************************/
extern void bsp_uart_Init();
extern FifoErr bsp_uart_Send(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
extern void bsp_uart_Test();

#endif

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 串口 FIFO 的相关文章

  • Push_back() 导致程序在进入 main() 之前停止

    我正在为我的 STM32F3 Discovery 板使用 C 进行开发 并使用 std deque 作为队列 在尝试调试我的代码 直接在带有 ST link 的设备上或在模拟器中 后 代码最终在 main 中输入我的代码之前在断点处停止 然
  • 匹配 STM32F0 和 zlib 中的 CRC32

    我正在研究运行 Linux 的计算机和 STM32F0 之间的通信链路 我想对我的数据包使用某种错误检测 并且由于 STM32F0 有 CRC32 硬件 并且我在 Linux 上有带有 CRC32 的 zlib 所以我认为在我的项目中使用
  • 毕业设计 江科大STM32的智能温室控制蓝牙声光报警APP系统设计

    基于STM32的智能温室控制蓝牙声光报警APP系统设计 1 项目简介 1 1 系统构成 1 2 系统功能 2 部分电路设计 2 1 stm32f103c8t6单片机最小系统电路设计 2 2 LCD1602液晶显示电路设计 2 2 风
  • 硬件基础-电容

    电容 本质 电容两端电压不能激变 所以可以起到稳定电压作用 充放电 电容量的大小 想使电容容量大 使用介电常数高的介质 增大极板间的面积 减小极板间的距离 品牌 国外 村田 muRata 松下 PANASONIC 三星 SAMSUNG 太诱
  • 写入/读取 FIFO 文件 - linux

    我一直在尝试了解 FIFO 并提出了一个简单的服务器和客户端程序 我不想做任何花哨的事情 只是让一个进程扮演 服务器 的角色 这个进程将 监听 另一个进程传递的任何消息 客户端 这是我写的 server c include
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 最终启动顺序错误 - STM32L476 的 Eclipse System Workbench 调试

    我正在尝试调试和运行 STM32L476 的简单汇编代码 我已经设置了 Eclipse Oxygen 在 Eclipse 中安装了最新版本的 System Workbench 插件并安装了 ST Link 驱动程序 IDE 成功构建了程序
  • 擦除后无法写入闪存

    所以我不能在擦除后直接写入内部闪存 如果写操作之前没有擦除操作 那么我可以 有什么想法吗 编程函数返回 成功写入 值 但查看内存时 没有写入任何数据 这是代码 uint32 t pageAddress 0x08008000 uint16 t
  • 无法使用 OpenOCD 找到脚本文件

    我正在尝试按照本教程将 OpenOCD 与我的 ST 发现板一起使用 https japaric github io discovery README html https japaric github io discovery READM
  • 毕设开题分享 单片机智能教室系统(智能照明+人数统计)

    1 简介 Hi 大家好 今天向大家介绍一个学长做的单片机项目 单片机智能教室系统 智能照明 人数统计 大家可用于 课程设计 或 毕业设计 项目分享 https gitee com feifei1122 simulation project
  • Arm:objcopy 如何知道 elf 中的哪些部分要包含在二进制或 ihex 中?

    我正在开发一个项目 其中涉及解析arm elf 文件并从中提取部分 显然 elf 文件中有很多部分没有加载到闪存中 但我想知道 objcopy 到底如何知道要在二进制文件中包含哪些部分以直接闪存到闪存中 以arm elf文件的以下reade
  • for循环延时时间计算

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 之前做led点亮的实验 好像是被delay函数影响了 因为delay参数设置的不对
  • 嵌入式开发--STM32G4系列片上FLASH的读写

    这个玩意吧 说起来很简单 就是几行代码的事 但楞是折腾了我大半天时间才搞定 原因后面说 先看代码吧 读操作 读操作很简单 以32位方式读取的时候是这样的 data IO uint32 t 0x0800F000 需要注意的是 当以32位方式读
  • STM32H5 Nucleo-144 board开箱

    文章目录 开发板资料下载 目标 点亮LD1 绿 LD2 黄 和LD3 红 三个LED灯 开箱过程 博主使用的是STM32CubeMX配置生成代码 具体操作如下 打开STM32CubeMX File gt New project 选择开发板型
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • 在 C++ 中创建 Windows 命名管道

    我正在尝试在 C Windows 中创建两个进程之间的简单通信 就像 Linux 中的 FIFO 一样 这是我的服务器 int main HANDLE pipe CreateFile TEXT pipe Pipe GENERIC READ
  • 检测程序何时打开 fifo

    我遇到一种情况 我需要检查 fifo 的另一侧是否已打开它 但是我不能使用 open 因为否则程序将开始执行操作 为什么我必须这样做 我有一个程序 监视器 来启动服务器程序 都是我创建的 监视器使用此 fifo 进行通信 因为监视器可以在服
  • 如何监控 FIFO?

    我想通过设置该流量的只读终端窗口来调试两个进程之间的问题 我可以简单地使用现有的标准 Linux 实用程序来实现这一点吗 FIFO 位于 run myfifo并在其中一个进程中创建 Create a FIFO if one doesn t
  • SQL Server 中的 FIFO 查询

    我正在构建一个库存管理应用程序c with SQL server 我想做一个FIFO从我的表查询 我以可变价格购买了相同的产品 之后我卖掉了其中一些 我想根据 先进先出 进行查询BatchDate柱子 所以我想通过PurchasePrice
  • 我应该将哪个 STL 容器用于 FIFO?

    哪种 STL 容器最适合我的需求 我基本上有一个 10 个元素宽的容器 我在其中不断地push back新元素的同时pop front计算最旧的元素 大约一百万次 我目前正在使用std deque对于这项任务 但想知道是否std list会

随机推荐

  • 【硬件】芯片温度/功耗计算

    本博客参考 xff1a 一纸沙漏的博客 芯片的四个温度 内核温度 封装表面温度 空气周边温度以及PCB板温度 TJ xff08 Die Junction Temp xff09 芯片的硅核温度 xff0c 就是芯片内部核心的温度 xff0c
  • Python unicode 字符串 转 list

    unicode 字符串 转 list unicodeList 61 u 39 100 100 100 100 100 100 39 1 方法一 list 61 eval unicodeList 2 方法二 int value for val
  • 【硬件】AD623单电源供电差分放大

    1 前言 检测电机电流运用检流电阻的方法在往期已经介绍过 详情请见 xff1a 检流电阻计算电流 2 需求分析 2 1 电机流过电流 已知电机的峰值堵转电流为4 6A xff0c 连续堵转电流为3 2A xff0c 以上信息可以得知需要采样
  • 【电路】PT1000/PT100温度采集电路

    目录 原理图下载链接 xff1a https download csdn net download Roger 717 33823983https download csdn net download Roger 717 33823983h
  • 【QT】手把手制作一个QT网络调试助手(准备阶段)

    目录 1 新建一个工程 2 mainwindow ui设计 2 1 对窗口主体进行栅格化布局 2 2 添加网络通信配置GroupBox 2 2 1 填充内容 2 2 2 栅格布局GroupBox 2 3 总结 3 Pro程序配置 4 头文件
  • 【PR】PR视频剪辑实用技巧

    1 两个视频叠加 1 首先 xff0c 找到要导入的视频所在文件夹 xff0c 将视频拖动到项目面板中 按住Ctrl拖动视频再复制两个视频 2 将素材视频分别拖入到序列的 视频轨道1 2 3 3 点击选中轨道1上的视频 xff0c 在源面板
  • 【Project】项目管理软件学习笔记

    一 前言 使用Project制定项目计划步骤大致如下 xff1a 以Project2013为例 xff0c 按照上图步骤指定项目计划 二 实施 2 1 创建空白项目 点击文件 新建 空白项目 xff0c 即完成了空白项目的创建 xff0c
  • 【硬件】P沟道和N沟道MOS管开关电路设计

    场效应管做的开关电路一般分为两种 xff0c 一种是N沟道 xff0c 另一种是P沟道 xff0c 如果电路设计中要应用到高端驱动 的话 xff0c 可以采用PMOS来导通 P沟道MOS管开关电路 PMOS的特性 xff0c Vgs小于一定
  • 多线程基础之七:多线程遇上printf的“延迟写”策略

    0 运行库提供的IO读写函数采用 延迟写 策略的原因 编程时经常会用到printf 函数 xff0c 但是由于printf 函数涉及到和显示器或磁盘等外设进行交互 xff0c 所以操作涉及到从 用户态 gt 内核态 gt 返回用户态 的一系
  • VC和VS区别

    S是Visual Studio xff0c 它是微软提供的一个工具集 xff0c 由各种各样的工具组成 VS可以支持C C 43 43 VB JAVA C 编程 然了一次只能支持一种编程方式 在VS安装完成 xff0c 第一次运行的时候会让
  • 【potplayer安装及设置LAV Splitter】

    potplayer安装及设置LAV Splitter 下载及安装Lav Splitter解码器配置Lav Splitter解码器 potplayer是一款windows平台上一款轻量功能强大的播放器 xff0c 它界面简洁 xff0c 功能
  • 关于头文件的相互包含

    编程过程中 xff0c 经常会碰到头文件的相互包含 xff0c 如果处理不慎 xff0c 就会报错 比如在头文件A h中有如下代码 xff08 代码中的B Handle是在头文件B h中定义的 xff09 xff1a span class
  • Python list中去重的多种方法

    去重之后顺序会改变 set去重 列表去重会让列表改变原来的顺序 l1 61 1 4 4 2 3 4 5 6 1 l2 61 list set l1 print l2 1 2 3 4 5 6 但是 xff0c 可以通过列表中索引 xff08
  • TI学习笔记之“振动补偿算法”

    一些应用中 xff0c 负载和机械角度有关 xff0c 比如空调压缩机 典型压缩机应用的负载曲线如下图所示 xff0c 不难发现 xff0c 在一个机械周期内 xff0c 负载和机械角度存在一定的关系 xff0c 这种情况在转子式压缩机中尤
  • “compilerPath“的问题

    在c cpp properties josn文件中 xff0c complierPath的问题解决如下 如果正在编译c 43 43 文件 xff0c 先在终端输入which g 43 43 我的弹出了 usr bin g 43 43 把这个
  • Digest Authentication Response 如何计算

    Session Initiation Protocol NOTIFY Request Line NOTIFY sip 192 168 125 130 5060 SIP 2 0 Method NOTIFY Request URI sip 19
  • ROS-Melodic 编译Moveit全过程记录和错误解决方案

    ROS Melodic 编译Moveit全过程记录和错误解决方案 在Ros Melodic版本下 xff0c 直接运行sudo apt get install ros melodic moveit会出现以下错误 xff1a 下列软件包有未满
  • Jetson TX2在ROS下使用Realsense D435i跑rtabmap、octomap、VINS-Mono和ORB-SLAM2

    使用环境 xff1a Ubuntu 16 04 JetPack 3 3 xff0c ROS Kinetic硬件设备 xff1a 英伟达Jetson TX2 xff0c 英特尔Realsense D435i 安装Realsense相关的相机驱
  • C++实现流式socket聊天程序

    目录 协议设计 消息的类型 消息的语法 消息的语义 消息的处理 发送消息 接收消息 程序设计 模块的划分和功能 Client客户端 Server服务器 模块流程图 程序实现 辅助代码 client cpp server cpp 程序测试 本
  • STM32 串口 FIFO

    使用FIFO实现串口数据的收发功能 FIFO的相关实现参照链接 xff1a CSDN https mp csdn net mp blog creation editor 120448361 1 Cubemx串口配置 使用Cubmx对串口进行