国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SPI+DMA傳輸性能比較

這篇具有很好參考價(jià)值的文章主要介紹了SPI+DMA傳輸性能比較。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

??本文章僅僅簡(jiǎn)單記錄32單片機(jī)的SPI+DMA驅(qū)動(dòng)顯示屏的性能測(cè)試,這里不花費(fèi)時(shí)間介紹SPI和DMA。
硬件材料:SPI顯示屏一個(gè),32單片機(jī)
軟件材料:
1.LCD的SPI驅(qū)動(dòng)顯示程序(SPI / SPI+DMA):
(1)SPI的配置程序:

SPI_HandleTypeDef SPI3_Handler;  //create a SPI handle
/**
 * @brief	SPI3 master mode
 * @param   void
 * @return  void
 */
void SPI3_Init(void)
{
    SPI3_Handler.Instance=SPI3;            
    SPI3_Handler.Init.Mode=SPI_MODE_MASTER;         
    SPI3_Handler.Init.Direction=SPI_DIRECTION_2LINES;  
    SPI3_Handler.Init.DataSize=SPI_DATASIZE_8BIT;    
    SPI3_Handler.Init.CLKPolarity=SPI_POLARITY_HIGH;    //Idle state clock is high
    SPI3_Handler.Init.CLKPhase=SPI_PHASE_2EDGE;        
    SPI3_Handler.Init.NSS=SPI_NSS_SOFT;                 
    SPI3_Handler.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_2;//baudrate is highest
    SPI3_Handler.Init.FirstBit=SPI_FIRSTBIT_MSB;       
    SPI3_Handler.Init.TIMode=SPI_TIMODE_DISABLE;     
    SPI3_Handler.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE;
    SPI3_Handler.Init.CRCPolynomial=7;                  //omit
    HAL_SPI_Init(&SPI3_Handler);
    __HAL_SPI_ENABLE(&SPI3_Handler);                  
}

/**
 * @brief	SPI3 lower driver config:perip clock ,io
 * @param   hspi: the SPI handle pointer should be use
 * @return  void
 */
void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
{
    GPIO_InitTypeDef GPIO_Initure;
    __HAL_RCC_GPIOB_CLK_ENABLE();    
    __HAL_RCC_SPI3_CLK_ENABLE();        
    
    GPIO_Initure.Pin=GPIO_PIN_3|GPIO_PIN_5;
    GPIO_Initure.Mode=GPIO_MODE_AF_PP;         
    GPIO_Initure.Pull=GPIO_PULLUP;              
    GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH;           
    GPIO_Initure.Alternate=GPIO_AF6_SPI3;          
    HAL_GPIO_Init(GPIOB,&GPIO_Initure);
}

(2)SPI的讀寫(xiě)接口(非DMA情況下需要使用到)

/**
 * @brief	SPI3 R/W one octet
 * @param   TxData	the u8 data which should be writed
 * @return  the u8 data received
 */
u8 SPI3_ReadWriteByte(u8 TxData)
{
    u8 Rxdata;
    HAL_SPI_TransmitReceive(&SPI3_Handler,&TxData,&Rxdata,1, 1000);       
 	return Rxdata;          		 	
}

/**
 * @brief	SPI3 Write one octet
 * @param   TxData	the tx payload
 * @param   size	payload length
 * @return  u8		0:success,others:fail
 */
u8 SPI3_WriteByte(u8 *TxData,u16 size)
{
	return HAL_SPI_Transmit(&SPI3_Handler,TxData,size,1000);
}

(3)SPI的DMA配置初始化
我使用的是Stm32L4做SPI3+DMA的測(cè)試,首先看芯片手冊(cè)DMA相關(guān)的內(nèi)容:
dma spi,筆記,單片機(jī),單片機(jī),stm32,嵌入式硬件
??上面的表格羅列了DMA2每個(gè)通道的DMA請(qǐng)求,SPI3_Tx對(duì)應(yīng)通道2,請(qǐng)求3(0011),那么我們可以這樣配置SPI3的DMA通道:

void vidSPI3DMA_Config(void)
{
    __HAL_RCC_DMA2_CLK_ENABLE();//DMA2 Clock Enable

    __HAL_LINKDMA(&SPI3_Handler, hdmatx, SPI3TxDMA_Handler);  //Link DMA to SPI3, here we use the dma tx function

    //Tx Dma config
    SPI3TxDMA_Handler.Instance = DMA2_Channel2;                        //select the channel
    SPI3TxDMA_Handler.Init.Request = DMA_REQUEST_3;                    //request(CxS:0011)
    SPI3TxDMA_Handler.Init.Direction = DMA_MEMORY_TO_PERIPH;           //memory to peripheral
    SPI3TxDMA_Handler.Init.PeriphInc = DMA_PINC_DISABLE;               //peripheral not increment
    SPI3TxDMA_Handler.Init.MemInc = DMA_MINC_ENABLE;                   //memory inc 
    SPI3TxDMA_Handler.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;  //perip data length:8 bit
    SPI3TxDMA_Handler.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;     //mem data length:8 bit
    SPI3TxDMA_Handler.Init.Mode = DMA_NORMAL;                          
    SPI3TxDMA_Handler.Init.Priority = DMA_PRIORITY_HIGH;            
    SPI3TxDMA_Handler.State = HAL_DMA_STATE_READY;
    HAL_DMA_DeInit(&SPI3TxDMA_Handler);
    HAL_DMA_Init(&SPI3TxDMA_Handler);
		
	HAL_NVIC_SetPriority(DMA2_Channel2_IRQn, 0, 3);
    HAL_NVIC_EnableIRQ(DMA2_Channel2_IRQn);
}

(4)使用DMA中斷需要調(diào)用DMA中斷函數(shù)去清除相關(guān)中斷標(biāo)志位。

/*
 * @brief: DMA2 Channel2 IRQ handler function
 *         mainly clear the interrupt flag
*/
void DMA2_Channel2_IRQHandler(void)
{
    HAL_DMA_IRQHandler(&SPI3TxDMA_Handler);
}

/*
 * @brief: After Tx is completed, the SPI DMA should be stopped for next transfer 
*/
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
{
	HAL_SPI_DMAStop(hspi);    
}

2.LCD顯示驅(qū)動(dòng)程序:
(1)LCD基于SPI的數(shù)據(jù)發(fā)送接口:

/**
 * @brief	LCD SPI send data API
 * @return  void
 */
#define NO_USING_DMA 1
static void LCD_SPI_Send(u8 *data, u32 size)
{
#if NO_USING_DMA
	u32 i;
	u32 delta = size/0xFFFF;
	for(i = 0; i<=delta; i++)
	{
		if( i==delta )  /* Send the last data */
			SPI3_WriteByte(&data[i*0xFFFF], size%0xFFFF);//cause this API 2nd param is u16 type
		else    /* send 0xFFFF octets */
			SPI3_WriteByte(&data[i*0xFFFF], 0xFFFF);
    }
#else
	while(SPI3_Handler.State != HAL_SPI_STATE_READY);
	HAL_SPI_Transmit_DMA(&SPI3_Handler, data, size);
#endif
  return;
}

??往LCD寫(xiě)任何數(shù)據(jù)都是用的這個(gè)接口LCD_SPI_Send。關(guān)于圖片的繪制的函數(shù)這里不多余貼出來(lái),相信網(wǎng)上一大把程序可以參考,這里直接使用定時(shí)器去了解不開(kāi)DMA和開(kāi)DMA顯示同一張圖片耗時(shí)差異,時(shí)間從串口打印出來(lái):

    u32 t=0;
    printf("Show a 240X82 picture,Start: %d | ", t);
	vidEnableTIM3(1);//enable TIM3,and clear the counter
    Display_240x82_pic(0, 0);
    t = u32GetTim3Counter();
	printf("End: %d\r\n", t);

??這里我定時(shí)器計(jì)數(shù)頻率分頻到1Mhz,最大計(jì)數(shù)50000次,也是就計(jì)數(shù)頻率1us,周期50ms。
dma spi,筆記,單片機(jī),單片機(jī),stm32,嵌入式硬件
?? 第一次我是以SPI+DMA驅(qū)動(dòng)LCD顯示240X82的圖片,可以看出顯示該圖片在有DMA(加DMA中斷)的加持下,耗時(shí)156us。第二次是我單獨(dú)用SPI驅(qū)動(dòng)LCD顯示240X82的圖片,耗時(shí)8685us,所以區(qū)別還是蠻大的。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-698749.html

到了這里,關(guān)于SPI+DMA傳輸性能比較的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • U8g2庫(kù)的STM32硬件SPI(DMA)移植教程(HAL、OLED顯示、四線(xiàn)SPI、DMA)

    U8g2庫(kù)的STM32硬件SPI(DMA)移植教程(HAL、OLED顯示、四線(xiàn)SPI、DMA)

    本文教你把U8g2圖形庫(kù)移植到STM32上,基于STM32的硬件SPI、CubeMX U8g2庫(kù)Github網(wǎng)址:https://github.com/olikraus/u8g2 U8g2庫(kù)CSDN鏡像網(wǎng)址:https://gitcode.net/mirrors/olikraus/u8g2?utm_source=csdn_github_accelerator 硬件準(zhǔn)備:STM32C8T6(STM32系列芯片)、0.96寸OLED(128×64)、J-Link(或其他) 引腳連接: 出自此

    2024年02月09日
    瀏覽(35)
  • GD32 SPI DMA收發(fā)

    GD32 SPI DMA收發(fā)

    由于需求用到GD32 SPI, 故做相關(guān)實(shí)驗(yàn)記錄分享,本實(shí)驗(yàn)為 SPI DMA 發(fā)送與接收?16bit 數(shù)據(jù), GD32 相關(guān)配置如下 GD32 F30x系列 DMA配置如下 ? SPI DMA 發(fā):使用SPI0,對(duì)應(yīng)的DMA為0 Channel 2。? 注意打開(kāi) 對(duì)應(yīng) DMA 與 SPI 相關(guān)時(shí)鐘, DMA write 使用時(shí)需要先拉低 NSS,發(fā)送結(jié)束,拉高NSS SPI DMA 收

    2024年02月13日
    瀏覽(23)
  • STM32使用SPI+DMA(標(biāo)準(zhǔn)庫(kù))

    STM32使用SPI+DMA(標(biāo)準(zhǔn)庫(kù))

    DMA DMA原理 DMA通道資源分配 SPI+DMA配置 主函數(shù)編寫(xiě)如下 1.CPU配置好DMA。 2.SPI發(fā)出DMA請(qǐng)求。(在DMA_Mode_Normal模式下,該請(qǐng)求實(shí)際上需要CPU命令SPI發(fā)出請(qǐng)求) 3.若該通道有多個(gè)請(qǐng)求,DMA控制器通過(guò)仲裁器判斷,根據(jù)配置的優(yōu)先級(jí),選擇先回應(yīng)該通道高優(yōu)先級(jí)的請(qǐng)求,再回應(yīng)低優(yōu)先

    2024年02月11日
    瀏覽(20)
  • [HAL]STM32 SPI+DMA驅(qū)動(dòng)WS2812

    [HAL]STM32 SPI+DMA驅(qū)動(dòng)WS2812

    該程序是純手敲,非Cube生成!所有代碼均注釋。 源碼在文章后面獲取 Keyword: 單線(xiàn)通訊、歸零碼、Reset、RGB順序 RGB一共有24bit位 -相當(dāng)于驅(qū)動(dòng)一個(gè)燈要24bit位 -驅(qū)動(dòng)若干個(gè)燈要24* n bit位,通過(guò)Reset碼決定數(shù)據(jù)終止(保持) 24bit位應(yīng)該如何發(fā)送? 可見(jiàn): 表示低電平需要 T0H和T0L的配

    2024年02月09日
    瀏覽(33)
  • STM32 硬件SPI+DMA實(shí)現(xiàn)快速刷TFT屏

    STM32 硬件SPI+DMA實(shí)現(xiàn)快速刷TFT屏

    首先在TB上找一塊SPI驅(qū)動(dòng)的彩屏,下載商家提供的示例 例如我買(mǎi)的一款2.8寸SPI的TFT彩屏,商家提供的資料很齊全,模擬SPI和硬件SPI驅(qū)動(dòng)的程序都有 打開(kāi)硬件SPI驅(qū)動(dòng)的工程,商家提供的代碼是SPI2驅(qū)動(dòng),想換成其他的SPI可以到SPI.c文件中更改 打開(kāi)main.c,測(cè)試一下簡(jiǎn)單顏色填充刷

    2024年04月15日
    瀏覽(114)
  • 華大HC32F460 SPI+DMA通信實(shí)驗(yàn)代碼詳解

    聲明:以下內(nèi)容均為本人學(xué)習(xí)心得。 一、基礎(chǔ)知識(shí)。 華大HC32F460 提供的SPI是4線(xiàn)式和3線(xiàn)式。搭載4個(gè)通道的串行外設(shè)接口,支持高速全雙工串行同步傳輸。 4線(xiàn)式:SCK、MOSI、MISO、SS0~SS3。3線(xiàn)式:SCK、MOSI、MISO。 SPI數(shù)據(jù)發(fā)送時(shí):傳送數(shù)據(jù)先進(jìn)入發(fā)送緩沖器(TX_BUFF),再將TX_BUFF的數(shù)據(jù)

    2024年02月11日
    瀏覽(23)
  • 講解STM32驅(qū)動(dòng)WS281x燈珠的多種實(shí)現(xiàn)方式:普通IO、SPI+DMA、以及PWM+DMA驅(qū)動(dòng)方法

    STM32作為一款高性能、功能豐富的單片機(jī),其豐富的外設(shè)和強(qiáng)大的性能,使其在嵌入式領(lǐng)域得到了廣泛的應(yīng)用。本篇文章將介紹如何利用STM32驅(qū)動(dòng)WS281x系列的LED燈珠。我們會(huì)使用三種不同的驅(qū)動(dòng)方式進(jìn)行實(shí)現(xiàn):一種是普通IO方式驅(qū)動(dòng),一種是SPI+DMA方式驅(qū)動(dòng),最后一種是PWM+DMA方

    2024年02月11日
    瀏覽(20)
  • stm32HAL庫(kù) G4 SPI 從機(jī)DMA可變長(zhǎng)度接受數(shù)據(jù)亂碼問(wèn)題

    stm32HAL庫(kù) G4 SPI 從機(jī)DMA可變長(zhǎng)度接受數(shù)據(jù)亂碼問(wèn)題

    使用一個(gè)引腳當(dāng)作SPI CS, 邊沿觸發(fā); 在電平位0時(shí)候接受SPI數(shù)據(jù)20個(gè)字節(jié) 如果實(shí)際主機(jī)只發(fā)了小于20字節(jié)時(shí)候, 下一個(gè)幀就會(huì)錯(cuò)亂; 去老外找了之后,需要復(fù)位SPi RCC時(shí)鐘才能復(fù)位掉SPI 下面的不行 正確的做法

    2024年02月10日
    瀏覽(16)
  • 使用STM32F103的SPI+DMA驅(qū)動(dòng)ws2812 LED

    使用STM32F103的SPI+DMA驅(qū)動(dòng)ws2812 LED

    目錄 前言 一、WS2812協(xié)議 1.1 數(shù)據(jù)傳輸編碼方式: ?1.2 傳輸?shù)臄?shù)據(jù)結(jié)構(gòu) 二、驅(qū)動(dòng)方式:SPI+DMA 2.1 原理介紹 2.2 SPI+DMA操作 ?2.3 編寫(xiě)代碼 2.4 使用 三 總結(jié) 參考文章 主要使用的STM32F103C8T6芯片的SPI+DMA方式實(shí)現(xiàn)WS2812的驅(qū)動(dòng)協(xié)議,總體可以看作是使用SPI來(lái)實(shí)現(xiàn)一種通信協(xié)議來(lái)發(fā)送信號(hào)。

    2024年02月09日
    瀏覽(30)
  • STM32CubeMX配置HAL庫(kù)實(shí)現(xiàn)SPI-DMA的遞歸調(diào)用

    STM32CubeMX配置HAL庫(kù)實(shí)現(xiàn)SPI-DMA的遞歸調(diào)用

    核心: STM32F407ZET6?? 外設(shè)ADC: ADS1258? ?數(shù)量:3個(gè)? ?※ 核心與3個(gè)ADC使用SPI總線(xiàn) “一主多從” 方式連接,PCB布線(xiàn)的方式與下圖一致。 ※ 在電路板上STM32與三個(gè)ADS1258在同一直線(xiàn)上分布,STM32在一端,三個(gè)ADC依次排布。 ※ 離STM32最遠(yuǎn)ADC的DRDY硬件管腳與STM32的EXTI line4 interrupt連接

    2024年02月15日
    瀏覽(39)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包