主頁 >  其他 > STM32F103 實體應用(11)——DMA接收不定長串口資料

STM32F103 實體應用(11)——DMA接收不定長串口資料

2021-02-21 11:24:48 其他


一、DMA 簡介

DMA(Direct Memory Access)—直接存盤器存取,是單片機的一個外設,它的主要功能是用來搬資料,但是不需要占用 CPU,即在傳輸資料的時候,CPU 可以干其他的事情,好像是多執行緒一樣,

資料傳輸支持從外設到存盤器或者存盤器到存盤器,這里的存盤器可以是 SRAM 或者是 FLASH

DMA 控制器包含了 DMA1DMA2,其中 DMA1 有 7 個通道,DMA2 有 5 個通道,這里的通道可以理解為傳輸資料的一種管道,要注意的是 DMA2 只存在于大容量的單片機中,

二、DMA 功能框圖

DMA 控制器獨立于內核,屬于一個單獨的外設,結構比較簡單,從編程的角度來看,我們只需掌握功能框圖中的三部分內容即可,具體見下圖:

  1. ①DMA 請求

如果外設要想通過 DMA 來傳輸資料,必須先給 DMA 控制器發送 DMA 請求,DMA收到請求信號之后,控制器會給外設一個應答信號,當外設應答后且 DMA 控制器收到應答信號之后,就會啟動 DMA 的傳輸,直到傳輸完畢,
DMA 有 DMA1 和 DMA2 兩個控制器,DMA1 有 7 個通道,DMA2 有 5 個通道,不同的 DMA 控制器的通道對應著不同的外設請求,這決定了我們在軟體編程上該怎么設定,具體見 DMA 請求映像表,

  1. ②通道
    DMA 具有 12 個獨立可編程的通道,其中 DMA1 有 7 個通道,DMA2 有 5 個通道,每個通道對應不同的外設的 DMA 請求,雖然每個通道可以接收多個外設的請求,但是同一時間只能接收一個,不能同時接收多個,

  2. ③仲裁器
    當發生多個 DMA 通道請求時,就意味著有先后回應處理的順序問題,這個就由仲裁器也管理,仲裁器管理 DMA 通道請求分為兩個階段,第一階段屬于軟體階段,可以在DMA_CCRx 暫存器中設定,有 4 個等級:非常高、高、中和低四個優先級,第二階段屬于硬體階段,如果兩個或以上的 DMA 通道請求設定的優先級一樣,則他們優先級取決于通 道編號,編號越低優先權越高,比如通道 0 高于通道 1,在大容量產品和互聯型產品中,
    DMA1 控制器擁有高于 DMA2 控制器的優先級,

三、設計實體

本示例使用串口1列印并接收電腦端發來的指令,串口3作為與4G通信的渠道,
bsp_usart.h

/**===========================================================================
  @file     bsp_usart.h
  @brief    本檔案是用于usart驅動
  @author   青梅煮久
  @version  r0.1
  @date     2021/02/20
----------------------------------------------------------------------------
  Remark: (備注描述)
	串口1、3的驅動,
	串口1:用于日志列印、指令配置
	串口3:用于4G模塊通訊
----------------------------------------------------------------------------
                                History
----------------------------------------------------------------------------
  <Date>     | <Version> | <Author>       | <Description>
-------------|-----------|----------------|---------------------------------
  2021/02/20 | r0.1      | 青梅煮久        | 創建
-------------|-----------|----------------|---------------------------------
             |           |                |
-------------|-----------|----------------|---------------------------------
             |           |                |
-------------|-----------|----------------|---------------------------------
             |           |                |
============================================================================*/
#ifndef __USART_H
#define	__USART_H

/*********************************************************************
 * INCLUDES
 */
#include "stm32f10x.h"
#include <stdio.h>

/*********************************************************************
 * DEFINITIONS
 */	
/** 
  * 串口宏定義,不同的串口掛載的總線和IO不一樣,移植時需要修改這幾個宏
	* 1-修改總線時鐘的宏,uart1掛載到apb2總線,其他uart掛載到apb1總線
	* 2-修改GPIO的宏
  */
	
// 串口1-USART1
#define  DEBUG_USARTx                   USART1
#define  DEBUG_USART_CLK                RCC_APB2Periph_USART1
#define  DEBUG_USART_APBxClkCmd         RCC_APB2PeriphClockCmd
#define  DEBUG_USART_BAUDRATE           115200

// USART GPIO 引腳宏定義
#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOA)
#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
    
#define  DEBUG_USART_TX_GPIO_PORT       GPIOA   
#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_9
#define  DEBUG_USART_RX_GPIO_PORT       GPIOA
#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_10

#define  DEBUG_USART_IRQ                USART1_IRQn
#define  DEBUG_USART_IRQHandler         USART1_IRQHandler


// 串口2-USART2
//#define  DEBUG_USARTx                   USART2
//#define  DEBUG_USART_CLK                RCC_APB1Periph_USART2
//#define  DEBUG_USART_APBxClkCmd         RCC_APB1PeriphClockCmd
//#define  DEBUG_USART_BAUDRATE           115200

 USART GPIO 引腳宏定義
//#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOA)
//#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
//    
//#define  DEBUG_USART_TX_GPIO_PORT       GPIOA   
//#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_2
//#define  DEBUG_USART_RX_GPIO_PORT       GPIOA
//#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_3

//#define  DEBUG_USART_IRQ                USART2_IRQn
//#define  DEBUG_USART_IRQHandler         USART2_IRQHandler

// 串口3-USART3
#define  LTE_USARTx                   USART3
#define  LTE_USART_CLK                RCC_APB1Periph_USART3
#define  LTE_USART_APBxClkCmd         RCC_APB1PeriphClockCmd
#define  LTE_USART_BAUDRATE           115200

// USART GPIO 引腳宏定義
#define  LTE_USART_GPIO_CLK           (RCC_APB2Periph_GPIOB)
#define  LTE_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
    
#define  LTE_USART_TX_GPIO_PORT       GPIOB   
#define  LTE_USART_TX_GPIO_PIN        GPIO_Pin_10
#define  LTE_USART_RX_GPIO_PORT       GPIOB
#define  LTE_USART_RX_GPIO_PIN        GPIO_Pin_11

#define  LTE_USART_IRQ                USART3_IRQn
#define  LTE_USART_IRQHandler         USART3_IRQHandler

// 串口4-UART4
//#define  DEBUG_USARTx                   UART4
//#define  DEBUG_USART_CLK                RCC_APB1Periph_UART4
//#define  DEBUG_USART_APBxClkCmd         RCC_APB1PeriphClockCmd
//#define  DEBUG_USART_BAUDRATE           115200

 USART GPIO 引腳宏定義
//#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOC)
//#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
//    
//#define  DEBUG_USART_TX_GPIO_PORT       GPIOC   
//#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_10
//#define  DEBUG_USART_RX_GPIO_PORT       GPIOC
//#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_11

//#define  DEBUG_USART_IRQ                UART4_IRQn
//#define  DEBUG_USART_IRQHandler         UART4_IRQHandler


// 串口5-UART5
//#define  DEBUG_USARTx                   UART5
//#define  DEBUG_USART_CLK                RCC_APB1Periph_UART5
//#define  DEBUG_USART_APBxClkCmd         RCC_APB1PeriphClockCmd
//#define  DEBUG_USART_BAUDRATE           115200

 USART GPIO 引腳宏定義
//#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD)
//#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
//    
//#define  DEBUG_USART_TX_GPIO_PORT       GPIOC   
//#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_12
//#define  DEBUG_USART_RX_GPIO_PORT       GPIOD
//#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_2

//#define  DEBUG_USART_IRQ                UART5_IRQn
//#define  DEBUG_USART_IRQHandler         UART5_IRQHandler

/*********************************************************************
* API FUNCTIONS
*/
void USART_Config(void);
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch);
void Usart_SendString( USART_TypeDef * pUSARTx, char *str);
void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch);

#endif /* __USART_H */

bsp_usart.c

/**===========================================================================
  @file     bsp_usart.c
  @brief    本檔案是用于usart驅動
  @author   青梅煮久
  @version  r0.1
  @date     2021/02/20
----------------------------------------------------------------------------
  Remark: (備注描述)
	串口1、3的驅動,
	串口1:用于日志列印、指令配置
	串口3:用于4G模塊通訊
----------------------------------------------------------------------------
                                History
----------------------------------------------------------------------------
  <Date>     | <Version> | <Author>       | <Description>
-------------|-----------|----------------|---------------------------------
  2021/02/20 | r0.1      | 青梅煮久        | 創建
-------------|-----------|----------------|---------------------------------
             |           |                |
-------------|-----------|----------------|---------------------------------
             |           |                |
-------------|-----------|----------------|---------------------------------
             |           |                |
============================================================================*/

/*********************************************************************
 * INCLUDES
 */
#include "bsp_usart.h"
#include "bsp_dma.h"
#include "stm32f10x.h"

static void NVIC_Configuration(void);

/*********************************************************************
 * PUBLIC FUNCTIONS
 */
/**
 @brief  USART GPIO 配置,作業引數配置
 @param  無
 @retval 無
*/
void USART_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;

	// 打開串口GPIO的時鐘
	DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
	LTE_USART_GPIO_APBxClkCmd(LTE_USART_GPIO_CLK, ENABLE);
	
	// 打開串口外設的時鐘
	DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);
	LTE_USART_APBxClkCmd(LTE_USART_CLK, ENABLE);

	/*
	*  配置串口
	*  USART1_TX -> PA9 , USART1_RX ->	PA10
	*/	
	// 將USART Tx的GPIO配置為推挽復用模式
	GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

	// 將USART Rx的GPIO配置為浮空輸入模式
	GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
	
	USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_Parity = USART_Parity_No ;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_Init(DEBUG_USARTx, &USART_InitStructure);
	
	/*
	*  4G
	*  USART3_TX -> PB10 , USART3_RX ->	PB11
	*/				
	GPIO_InitStructure.GPIO_Pin = LTE_USART_TX_GPIO_PIN;	         
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
	GPIO_Init(LTE_USART_TX_GPIO_PORT, &GPIO_InitStructure);		   
	
	GPIO_InitStructure.GPIO_Pin = LTE_USART_RX_GPIO_PIN;	        
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
	GPIO_Init(LTE_USART_RX_GPIO_PORT, &GPIO_InitStructure);
	
	USART_InitStructure.USART_BaudRate = 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; //硬體流控制失能
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //發送和接受使能
	USART_Init(LTE_USARTx, &USART_InitStructure); 
  
	
	// 串口中斷優先級配置
	NVIC_Configuration();
	
	// 使能串口接收中斷
	USART_ITConfig(DEBUG_USARTx, USART_IT_IDLE, ENABLE);	
	USART_ITConfig(LTE_USARTx, USART_IT_IDLE, ENABLE);
	
	// 使能串口
	USART_Cmd(DEBUG_USARTx, ENABLE);	   
	USART_Cmd(LTE_USARTx, ENABLE); 
	
	USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);  //使能串口1的DMA發送     
    USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);  //使能串口1的DMA接收  
	
	USART_DMACmd(USART3,USART_DMAReq_Tx,ENABLE);  //使能串口1的DMA發送     
    USART_DMACmd(USART3,USART_DMAReq_Rx,ENABLE);  //使能串口1的DMA接收  

}

/**
 @brief 發送一個位元組
 @param pUSARTx -[in] 串口
 @param ch -[in] 發送資料
 @retval 無
*/
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
{
	/* 發送一個位元組資料到USART */
	USART_SendData(pUSARTx,ch);
		
	/* 等待發送資料暫存器為空 */
	while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);	
}

/**
 @brief 發送8位的陣列
 @param pUSARTx -[in] 串口
 @param array -[in] 發送資料
 @param num -[in] 發送長度
 @retval 無
*/
void Usart_SendArray( USART_TypeDef * pUSARTx, uint8_t *array, uint16_t num)
{
  uint8_t i;
	
	for(i=0; i<num; i++)
  {
	    /* 發送一個位元組資料到USART */
	    Usart_SendByte(pUSARTx,array[i]);	
  
  }
	/* 等待發送完成 */
	while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET);
}

/**
 @brief 發送字串
 @param pUSARTx -[in] 串口
 @param str -[in] 發送資料
 @retval 無
*/
void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
{
	unsigned int k=0;
  do 
  {
      Usart_SendByte( pUSARTx, *(str + k) );
      k++;
  } while(*(str + k)!='\0');
  
  /* 等待發送完成 */
  while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET)
  {}
}

/**
 @brief 發送一個16位數
 @param pUSARTx -[in] 串口
 @param ch -[in] 發送資料
 @retval 無
*/
void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch)
{
	uint8_t temp_h, temp_l;
	
	/* 取出高八位 */
	temp_h = (ch&0XFF00)>>8;
	/* 取出低八位 */
	temp_l = ch&0XFF;
	
	/* 發送高八位 */
	USART_SendData(pUSARTx,temp_h);	
	while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
	
	/* 發送低八位 */
	USART_SendData(pUSARTx,temp_l);	
	while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);	
}

/**
 @brief 重定向c庫函式printf到串口,重定向后可使用printf函式
*/
int fputc(int ch, FILE *f)
{
		/* 發送一個位元組資料到串口 */
		USART_SendData(DEBUG_USARTx, (uint8_t) ch);
		
		/* 等待發送完畢 */
		while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);		
	
		return (ch);
}

/**
 @brief 重定向c庫函式scanf到串口,重寫向后可使用scanf、getchar等函式
*/
int fgetc(FILE *f)
{
		/* 等待串口輸入資料 */
		while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);

		return (int)USART_ReceiveData(DEBUG_USARTx);
}

/**
 @brief USART1中斷
 @param 無
 @retval 無
*/
void USART1_IRQHandler(void)  
{  
    uint16_t data;  
    if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET)  
    {  
        DMA_Cmd(DMA1_Channel5, DISABLE); //關閉DMA,防止處理其間有資料  
  
        data = USART1->SR;  
        data = USART1->DR;  
          
        g_uart1ReceiveSize =RECEIVE_BUF_SIZE - DMA_GetCurrDataCounter(DMA1_Channel5);  
        if(g_uart1ReceiveSize !=0)  
        {  
           // OSSemPost(DMAReceiveSize_Sem);  
			printf("shoudao1:%s", g_uart1ReceiveBuff);
        }  
        DMA_ClearFlag(DMA1_FLAG_TC5 | DMA1_FLAG_TE5 | DMA1_FLAG_HT5);//清除DMA2_Steam7傳輸完成標志    
        DMA_SetCurrDataCounter(DMA1_Channel5, RECEIVE_BUF_SIZE);  
        DMA_Cmd(DMA1_Channel5, ENABLE);     //打開DMA,  
  
    }  
} 

/**
 @brief USART3中斷
 @param 無
 @retval 無
*/ 
void USART3_IRQHandler(void)  
{  
    uint16_t data;  
    if(USART_GetITStatus(USART3,USART_IT_IDLE) != RESET)  
    {  
        DMA_Cmd(DMA1_Channel3, DISABLE); //關閉DMA,防止處理其間有資料  
  
        data = USART3->SR;  
        data = USART3->DR;  
          
        g_uart3ReceiveSize =RECEIVE_BUF_SIZE - DMA_GetCurrDataCounter(DMA1_Channel3);  
        if(g_uart3ReceiveSize !=0)  
        {  
           // OSSemPost(DMAReceiveSize_Sem);  
			printf("shoudao3:%s", g_uart3ReceiveBuff);
        }  
        DMA_ClearFlag(DMA1_FLAG_TC3 | DMA1_FLAG_TE3 | DMA1_FLAG_HT3);//清除DMA2_Steam7傳輸完成標志    
        DMA_SetCurrDataCounter(DMA1_Channel3, RECEIVE_BUF_SIZE);  
        DMA_Cmd(DMA1_Channel3, ENABLE);     //打開DMA,  
  
    }  
}

/*********************************************************************
 * LOCAL FUNCTIONS
 */
/**
 @brief  配置嵌套向量中斷控制器NVIC
 @param  無
 @retval 無
*/
static void NVIC_Configuration(void)
{
	NVIC_InitTypeDef NVIC_InitStructure;
  
	/* 嵌套向量中斷控制器組選擇 */
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  
	/* 4G NVIC設定*/
	/* 配置USART為中斷源 */
	NVIC_InitStructure.NVIC_IRQChannel = LTE_USART_IRQ;
	/* 搶斷優先級*/
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	/* 子優先級 */
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	/* 使能中斷 */
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	/* 初始化配置NVIC */
	NVIC_Init(&NVIC_InitStructure);
	
	/* 配置串口的 NVIC設定*/
	NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
}

bsp_dma.h

/**===========================================================================
  @file     bsp_dma.h
  @brief    本檔案是用于DMA驅動
  @author   青梅煮久
  @version  r0.1
  @date     2021/02/19
----------------------------------------------------------------------------
  Remark: (備注描述)
	串口1、3的接收,
							DMA1各個通道請求映像
外設    通道1   通道2     通道3       通道4        通道5       通道6      通道7
USART   - 	 USART3_TX  USART3_RX  USART1_TX  USART1_RX  USART2_RX  USART2_TX
----------------------------------------------------------------------------
                                History
----------------------------------------------------------------------------
  <Date>     | <Version> | <Author>       | <Description>
-------------|-----------|----------------|---------------------------------
  2021/02/19 | r0.1      | 青梅煮久        | 創建
-------------|-----------|----------------|---------------------------------
             |           |                |
-------------|-----------|----------------|---------------------------------
             |           |                |
-------------|-----------|----------------|---------------------------------
             |           |                |
============================================================================*/
#ifndef __DMA_H
#define	__DMA_H	

/*********************************************************************
 * INCLUDES
 */
#include "stm32f10x.h"

/*********************************************************************
 * DEFINITIONS
 */						    					    
#define  RECEIVE_BUF_SIZE           255
#define  SEND_BUF_SIZE    			255

/*********************************************************************
 * GLOBAL VARIABLES
 */
extern uint8_t g_uart1ReceiveBuff[RECEIVE_BUF_SIZE];   			//接識訓沖  
extern uint8_t g_uart1SendBuff[SEND_BUF_SIZE];    				//發送資料緩沖區  
extern uint16_t g_uart1ReceiveSize;  
  
extern uint8_t  g_uart3ReceiveBuff[RECEIVE_BUF_SIZE];   		//接識訓沖  
extern uint8_t  g_uart3SendBuff[SEND_BUF_SIZE];    				//發送資料緩沖區  
extern uint16_t g_uart3ReceiveSize; 
 
/*********************************************************************
* API FUNCTIONS
*/
void DMA_Config(void);
void DmaSendDataProc(DMA_Channel_TypeDef *DMA_Streamx,uint16_t ndtr);
void Uart1DmaSendByte(uint8_t nSendInfo);
void Uart1DmaSendString(uint8_t* pSendInfo, uint16_t nSendCount);
void Uart3DmaSendByte(uint8_t nSendInfo);
void Uart3DmaSendString(uint8_t* pSendInfo, uint16_t nSendCount);

#endif /* __DMA_H */

bsp_dma.c

/**===========================================================================
  @file     bsp_dma.c
  @brief    本檔案是用于DMA驅動
  @author   青梅煮久
  @version  r0.1
  @date     2021/02/19
----------------------------------------------------------------------------
  Remark: (備注描述)
	串口1、3的接收,
							DMA1各個通道請求映像
外設    通道1   通道2     通道3       通道4        通道5       通道6      通道7
USART   - 	 USART3_TX  USART3_RX  USART1_TX  USART1_RX  USART2_RX  USART2_TX
----------------------------------------------------------------------------
                                History
----------------------------------------------------------------------------
  <Date>     | <Version> | <Author>       | <Description>
-------------|-----------|----------------|---------------------------------
  2021/02/19 | r0.1      | 青梅煮久        | 創建
-------------|-----------|----------------|---------------------------------
             |           |                |
-------------|-----------|----------------|---------------------------------
             |           |                |
-------------|-----------|----------------|---------------------------------
             |           |                |
============================================================================*/

/*********************************************************************
 * INCLUDES
 */
#include "bsp_dma.h"
#include <stdio.h>

static void NVIC_Configuration(void);

/*********************************************************************
 * GLOBAL VARIABLES
 */
uint8_t  g_uart1ReceiveBuff[RECEIVE_BUF_SIZE];   //接識訓沖  
uint8_t  g_uart1SendBuff[SEND_BUF_SIZE];    //發送資料緩沖區  
uint16_t g_uart1ReceiveSize = 0;  
  
uint8_t  g_uart3ReceiveBuff[RECEIVE_BUF_SIZE];   //接識訓沖  
uint8_t  g_uart3SendBuff[SEND_BUF_SIZE];    //發送資料緩沖區  
uint16_t g_uart3ReceiveSize = 0;  

/*********************************************************************
 * LOCAL VARIABLES
 */

/*********************************************************************
 * PUBLIC FUNCTIONS
 */
/**
 @brief DMA配置
 @param 無
 @return 無
*/
void DMA_Config(void)
{
	DMA_InitTypeDef  DMA_InitStructure;
	
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);	//使能DMA傳輸
	
	/****************************配置UART1發送***********************/
    DMA_DeInit(DMA1_Channel4);  
    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART1->DR;//DMA外設地址  
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)g_uart1SendBuff;//DMA 存盤器0地址  
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//存盤器到外設模式  
    DMA_InitStructure.DMA_BufferSize = SEND_BUF_SIZE;//資料傳輸量   
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外設非增量模式  
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存盤器增量模式  
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外設資料長度:8位  
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//存盤器資料長度:8位  
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// 使用普通模式   
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//中等優先級  
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA通道x沒有設定為記憶體到記憶體傳輸
    DMA_Init(DMA1_Channel4, &DMA_InitStructure);//初始化DMA Stream
	DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);
	
	/****************************配置UART1接收***********************/
    DMA_DeInit(DMA1_Channel5);  
    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART1->DR;//DMA外設地址  
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)g_uart1ReceiveBuff;//DMA 存盤器0地址  
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC ;//外設到存盤器模式  
    DMA_InitStructure.DMA_BufferSize = RECEIVE_BUF_SIZE;//資料傳輸量   
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外設非增量模式  
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存盤器增量模式  
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外設資料長度:8位  
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//存盤器資料長度:8位  
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// 使用普通模式   
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//中等優先級  
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA通道x沒有設定為記憶體到記憶體傳輸
    DMA_Init(DMA1_Channel5, &DMA_InitStructure);//初始化DMA Stream  
	
	
	
	/****************************配置UART3發送***********************/
    DMA_DeInit(DMA1_Channel2);  
    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART3->DR;//DMA外設地址  
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)g_uart3SendBuff;//DMA 存盤器0地址  
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//存盤器到外設模式  
    DMA_InitStructure.DMA_BufferSize = SEND_BUF_SIZE;//資料傳輸量   
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外設非增量模式  
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存盤器增量模式  
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外設資料長度:8位  
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//存盤器資料長度:8位  
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// 使用普通模式   
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//中等優先級  
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA通道x沒有設定為記憶體到記憶體傳輸
    DMA_Init(DMA1_Channel2, &DMA_InitStructure);//初始化DMA Stream
	DMA_ITConfig(DMA1_Channel2,DMA_IT_TC,ENABLE);
	
	/****************************配置UART3接收***********************/
    DMA_DeInit(DMA1_Channel3);  
    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART3->DR;//DMA外設地址  
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)g_uart3ReceiveBuff;//DMA 存盤器0地址  
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC ;//外設到存盤器模式  
    DMA_InitStructure.DMA_BufferSize = RECEIVE_BUF_SIZE;//資料傳輸量   
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外設非增量模式  
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存盤器增量模式  
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外設資料長度:8位  
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//存盤器資料長度:8位  
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// 使用普通模式   
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//中等優先級  
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA通道x沒有設定為內存到記憶體傳輸
    DMA_Init(DMA1_Channel3, &DMA_InitStructure);//初始化DMA Stream  
	
	
	
	/****************************配置NVIC***********************/
	NVIC_Configuration();
	/**********************2個串口接收使能DMA*******************/
	DMA_Cmd(DMA1_Channel5, ENABLE);  //開啟DMA傳輸
	DMA_Cmd(DMA1_Channel3, ENABLE);  //開啟DMA傳輸
	
	DMA_ITConfig(DMA1_Channel5,DMA_IT_TC,ENABLE);  
	DMA_ITConfig(DMA1_Channel3,DMA_IT_TC,ENABLE);  
}

/**
 @brief 開啟一次DMA傳輸 
 @param DMA_Streamx -[in] DMA資料流,通道
 @param ndtr -[in] 資料傳輸量
 @return 無
*/  
void DmaSendDataProc(DMA_Channel_TypeDef *DMA_Streamx,uint16_t ndtr)  
{  

    DMA_Cmd(DMA_Streamx, DISABLE);                      //關閉DMA傳輸   

    DMA_SetCurrDataCounter(DMA_Streamx,ndtr);          //資料傳輸量    

    DMA_Cmd(DMA_Streamx, ENABLE);                      //開啟DMA傳輸   
}

/**
 @brief 串口1使用DMA發送單位元組
 @param nSendInfo -[in] 發送資料
 @return 無
*/ 
void Uart1DmaSendByte(uint8_t nSendInfo)  
{  
    uint8_t *pBuf = NULL;  
    //指向發送緩沖區
    pBuf = g_uart1SendBuff;  
    *pBuf++ = nSendInfo;  
  
    DmaSendDataProc(DMA1_Channel4, 1); //開始一次DMA傳輸!       
} 

/**
 @brief 串口1使用DMA發送多位元組
 @param nSendInfo -[in] 發送資料
 @param nSendCount -[in] 發送長度
 @return 無
*/ 
void Uart1DmaSendString(uint8_t* pSendInfo, uint16_t nSendCount)  
{  
    uint16_t i = 0;  
    uint8_t *pBuf = NULL;  
    //指向發送緩沖區  
    pBuf = g_uart1SendBuff;  
  
    for (i=0; i<nSendCount; i++)  
    {  
        *pBuf++ = pSendInfo[i];  
    }  
    //DMA發送方式  
    DmaSendDataProc(DMA1_Channel4, nSendCount); //開始一次DMA傳輸!      
}  

/**
 @brief 串口3使用DMA發送單位元組
 @param nSendInfo -[in] 發送資料
 @return 無
*/ 
void Uart3DmaSendByte(uint8_t nSendInfo)  
{  
    uint8_t *pBuf = NULL;  
    //指向發送緩沖區
    pBuf = g_uart3SendBuff;  
    *pBuf++ = nSendInfo;  
  
    DmaSendDataProc(DMA1_Channel2, 1); //開始一次DMA傳輸!       
} 

/**
 @brief 串口3使用DMA發送多位元組
 @param nSendInfo -[in] 發送資料
 @param nSendCount -[in] 發送長度
 @return 無
*/ 
void Uart3DmaSendString(uint8_t* pSendInfo, uint16_t nSendCount)  
{  
    uint16_t i = 0;  
    uint8_t *pBuf = NULL;  
    //指向發送緩沖區  
    pBuf = g_uart3SendBuff;  
  
    for (i=0; i<nSendCount; i++)  
    {  
        *pBuf++ = pSendInfo[i];  
    }  
    //DMA發送方式  
    DmaSendDataProc(DMA1_Channel2, nSendCount); //開始一次DMA傳輸!      
}

/**
 @brief 串口1使用DMA發送完成中斷
 @param 無
 @return 無
*/
void DMA1_Channel4_IRQHandler(void)  
{  
    //清除標志  
    if(DMA_GetFlagStatus(DMA1_FLAG_TC4)!=RESET)//等待傳輸完成  
    {   
        DMA_ClearFlag(DMA1_FLAG_TC4);//清除傳輸完成標志  
    }  
} 

/**
 @brief 串口1使用DMA接完成中斷
 @param 無
 @return 無
*/ 
void DMA1_Channel5_IRQHandler(void)  
{  
    //清除標志  
    if(DMA_GetFlagStatus(DMA1_FLAG_TC5)!=RESET)//等待傳輸完成  
    {   
        DMA_Cmd(DMA1_Channel5, DISABLE); //關閉DMA,防止處理其間有資料  
  
        g_uart1ReceiveSize =RECEIVE_BUF_SIZE - DMA_GetCurrDataCounter(DMA1_Channel5);  
        if(g_uart1ReceiveSize !=0)  
        {  
            // 此處不處理資料,uart處理
        }  
          
        DMA_ClearFlag(DMA1_FLAG_TC5 | DMA1_FLAG_TE5 | DMA1_FLAG_HT5);//清除DMA2_Steam7傳輸完成標志  
        DMA_SetCurrDataCounter(DMA1_Channel5, RECEIVE_BUF_SIZE);  
        DMA_Cmd(DMA1_Channel5, ENABLE);     //打開DMA,  
    }  
}  

/**
 @brief 串口3使用DMA發送完成中斷
 @param 無
 @return 無
*/
void DMA1_Channel2_IRQHandler(void)  
{  
    //清除標志  
    if(DMA_GetFlagStatus(DMA1_FLAG_TC2)!=RESET)//等待傳輸完成  
    {   
        DMA_ClearFlag(DMA1_FLAG_TC2);//清除傳輸完成標志  
    }  
} 

/**
 @brief 串口3使用DMA接完成中斷
 @param 無
 @return 無
*/ 
void DMA1_Channel3_IRQHandler(void)  
{  
    //清除標志  
    if(DMA_GetFlagStatus(DMA1_FLAG_TC3)!=RESET)//等待傳輸完成  
    {   
        DMA_Cmd(DMA1_Channel3, DISABLE); //關閉DMA,防止處理其間有資料  
  
        g_uart3ReceiveSize =RECEIVE_BUF_SIZE - DMA_GetCurrDataCounter(DMA1_Channel3);  
        if(g_uart3ReceiveSize !=0)  
        {  
            // 此處不處理資料,uart處理
        }  
          
        DMA_ClearFlag(DMA1_FLAG_TC3 | DMA1_FLAG_TE3 | DMA1_FLAG_HT3);//清除DMA2_Steam7傳輸完成標志  
        DMA_SetCurrDataCounter(DMA1_Channel3, RECEIVE_BUF_SIZE);  
        DMA_Cmd(DMA1_Channel3, ENABLE);     //打開DMA,  
    }  
} 

/*********************************************************************
 * LOCAL FUNCTIONS
 */
/**
 @brief 配置嵌套向量中斷控制器NVIC
 @param 無
 @return 無
*/
static void NVIC_Configuration(void)
{
	NVIC_InitTypeDef NVIC_InitStructure;

	/* 嵌套向量中斷控制器組選擇 */
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
	
	// 配置UART1發送  
	NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;    
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;    
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;    
    NVIC_Init(&NVIC_InitStructure);    
	
	// 配置UART1接收 
    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn;    
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;    
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;    
    NVIC_Init(&NVIC_InitStructure);    
	
	// 配置UART3發送  
	NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_IRQn;    
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;    
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;    
    NVIC_Init(&NVIC_InitStructure);    
	
	// 配置UART3接收 
    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel3_IRQn;    
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;    
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;    
    NVIC_Init(&NVIC_InitStructure);    
}

main.c

int main()
{
	...
	USART_Config();
	DMA_Config();
	...
}


? 由 青梅煮久 寫于 2021 年 02 月 20 日

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/261802.html

標籤:其他

上一篇:【物理應用】基于matlab直角坐標的電力系統潮流計算【含Matlab原始碼 341期】

下一篇:給樹莓派添加一個開、關機按鍵(原創)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more