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

STM32F4_HAL庫_串口阻塞/中斷/DMA三種方式發(fā)送數(shù)據(jù)的配置

這篇具有很好參考價(jià)值的文章主要介紹了STM32F4_HAL庫_串口阻塞/中斷/DMA三種方式發(fā)送數(shù)據(jù)的配置。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1、串口阻塞發(fā)送

串口阻塞發(fā)送的意思就是,發(fā)送一段數(shù)據(jù),在沒有發(fā)送完所有數(shù)據(jù)之前,一直停留在此發(fā)送函數(shù)(可設(shè)定阻塞時(shí)間),這個(gè)過程中會阻塞別的程序運(yùn)行;

1.1、配置

HAL庫的配置分為兩個(gè)層次,一個(gè)是HAL庫內(nèi)部調(diào)用的、與MCU硬件相關(guān)的初始化xxx_MspInit,一個(gè)是我們外部調(diào)用的初始化xxx_Init;

這兩個(gè)初始化函數(shù)配置完,就可以進(jìn)行阻塞式的串口發(fā)送了,很簡單。

1.1.1、HAL_UART_MspInit?

HAL_UART_MspInit,MCU硬件初始化,需要開啟RCC串口時(shí)鐘、RCC的GPIO端口時(shí)鐘、配置GPIO的模式;

(還有個(gè)反初始化HAL_UART_MspDeInit,這里就不說了)

void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
	GPIO_InitTypeDef GPIO_InitStruct;

	if(huart->Instance==DEBUG_USARTx){
		/* 時(shí)鐘使能 */
		DEBUG_USART_RCC_CLK_ENABLE();
		DEBUG_USARTx_GPIO_ClK_ENABLE(); 
		  
		/* 串口外設(shè)功能GPIO配置 */
		GPIO_InitStruct.Pin = DEBUG_USARTx_Tx_GPIO_PIN;
		GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
		GPIO_InitStruct.Pull = GPIO_PULLUP;
		GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
		GPIO_InitStruct.Alternate = DEBUG_USARTx_AFx;
		HAL_GPIO_Init(DEBUG_USARTx_Tx_GPIO, &GPIO_InitStruct);

		GPIO_InitStruct.Pin = DEBUG_USARTx_Rx_GPIO_PIN;  
		HAL_GPIO_Init(DEBUG_USARTx_Tx_GPIO, &GPIO_InitStruct);       
	}  
}

1.1.2、MX_DEBUG_USART_Init

MX_DEBUG_USART_Init,串口協(xié)議初始化,波特率、數(shù)據(jù)寬度、停止位、串口模式的配置;

void MX_DEBUG_USART_Init(void)
{
	husart_debug.Instance = DEBUG_USARTx;
	husart_debug.Init.BaudRate = DEBUG_USARTx_BAUDRATE;
	husart_debug.Init.WordLength = UART_WORDLENGTH_8B;
	husart_debug.Init.StopBits = UART_STOPBITS_1;
	husart_debug.Init.Parity = UART_PARITY_NONE;
	husart_debug.Init.Mode = UART_MODE_TX_RX;
	husart_debug.Init.HwFlowCtl = UART_HWCONTROL_NONE;
	husart_debug.Init.OverSampling = UART_OVERSAMPLING_16;
	HAL_UART_Init(&husart_debug);
}

1.2、調(diào)用

外部調(diào)用的初始化就是MX_DEBUG_USART_Init,然后就可以使用HAL_UART_Transmit函數(shù)來發(fā)送數(shù)據(jù)了。

static uint8_t uart1_tx_buf[]="123456789";
int main(void)
{
    HAL_Init();            //復(fù)位所有外設(shè),初始化Flash接口和系統(tǒng)滴答定時(shí)器
    SystemClock_Config();  //配置系統(tǒng)時(shí)鐘
    LED_GPIO_Init();	    
    MX_DEBUG_USART_Init(); //串口初始化

    while (1){
        LED1_ON;     HAL_Delay(1000);
        LED1_OFF;    HAL_Delay(1000);	  
        HAL_UART_Transmit(&husart_debug,uart1_tx_buf,8,1000);
    }
}

2、串口中斷發(fā)送

串口中斷發(fā)送的意思就是,發(fā)送數(shù)據(jù)的過程在中斷中進(jìn)行,這個(gè)中斷實(shí)際上是發(fā)送數(shù)據(jù)寄存器空的中斷。

比如說你要發(fā)送10個(gè)字節(jié)的數(shù)據(jù),那么肯定這10個(gè)字節(jié)不會一次性發(fā)送完吧,只能是一個(gè)一個(gè)字節(jié)地發(fā)送。每發(fā)送一個(gè)字節(jié),發(fā)送數(shù)據(jù)寄存器就會有一個(gè)為空的標(biāo)志,以提示可以發(fā)送下一個(gè)字節(jié)了,這樣在發(fā)送數(shù)據(jù)的過程中CPU不會一直在等待,而是用中斷來提示需要進(jìn)行發(fā)送的時(shí)候再發(fā)送。

2.1、配置

在1的基礎(chǔ)上,HAL_UART_MspInit 函數(shù)的末尾增加串口中斷配置,如下:

void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	if(huart->Instance==DEBUG_USARTx){
        //這部分配置不變......  

		/* USART1 interrupt Init */
		HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
		HAL_NVIC_EnableIRQ(USART1_IRQn);   
	}  
}

?增加串口1的中斷服務(wù)函數(shù),具體的功能不用我們寫;

void USART1_IRQHandler(void){
	HAL_UART_IRQHandler(&husart_debug);
}

2.2、調(diào)用

和1的外部調(diào)用的初始化是一樣的,發(fā)送函數(shù)使用HAL_UART_Transmit_IT;

3、串口DMA發(fā)送

3.1、配置

注:必須增加串口的中斷配置(如2的配置),否則會出現(xiàn)只能發(fā)送一次的尷尬局面,3.1.2中的DMA中斷也必須配置,否則也是只能發(fā)送一次,不過這一處的配置應(yīng)該不會漏就是了;

3.1.1、HAL_UART_MspInit

在2的基礎(chǔ)上,增加有關(guān)DMA的配置,數(shù)據(jù)流、通道、傳輸方向、地址自增與否等等;(可以用CubeMX勾勾選選生成配置代碼,然后再移植到自己的代碼上)

void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	if(huart->Instance==DEBUG_USARTx){
		//這部分配置不變...... 

		/* USART1 DMA Init */
		hdma_usart1_tx.Instance = DMA2_Stream7;
		hdma_usart1_tx.Init.Channel = DMA_CHANNEL_4;
		hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
		hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
		hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
		hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
		hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
		hdma_usart1_tx.Init.Mode = DMA_NORMAL;
		hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;
		hdma_usart1_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
		HAL_DMA_Init(&hdma_usart1_tx);

		__HAL_LINKDMA(huart,hdmatx,hdma_usart1_tx);

		/* USART1 interrupt Init */
		HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
		HAL_NVIC_EnableIRQ(USART1_IRQn);  
	}  
}

3.1.2、UART1_DMA_Init

UART1_DMA_Init,這里面就是開啟DMA時(shí)鐘,配置DMA的優(yōu)先級;

DMA流的中斷服務(wù)函數(shù)也是只寫到這就OK了;

void UART1_DMA_Init(void)
{
  /* DMA controller clock enable */
  __HAL_RCC_DMA2_CLK_ENABLE();

  /* DMA interrupt init */
  /* DMA2_Stream7_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn);
}

void DMA2_Stream7_IRQHandler(void){
	HAL_DMA_IRQHandler(&hdma_usart1_tx);	
}

3.2、調(diào)用

要先調(diào)用DMA初始化,再調(diào)用串口初始化;

因?yàn)榇诔跏蓟杏信渲肈MA的參數(shù)等操作,所以在這之前DMA需要初始化;文章來源地址http://www.zghlxwxcb.cn/news/detail-424188.html

static uint8_t uart1_tx_buf[]="123456789";
int main(void)
{
    HAL_Init();            //復(fù)位所有外設(shè),初始化Flash接口和系統(tǒng)滴答定時(shí)器
    SystemClock_Config();  //配置系統(tǒng)時(shí)鐘
    LED_GPIO_Init();
    UART1_DMA_Init();      //串口DMA初始化	    
    MX_DEBUG_USART_Init(); //串口初始化

    while (1){
        LED1_ON;     HAL_Delay(1000);
        LED1_OFF;    HAL_Delay(1000);	  
        HAL_UART_Transmit_DMA(&husart_debug,uart1_tx_buf,8);
    }
}

到了這里,關(guān)于STM32F4_HAL庫_串口阻塞/中斷/DMA三種方式發(fā)送數(shù)據(jù)的配置的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【STM32】CUBEMX之串口:串口三種模式(輪詢模式、中斷模式、DMA模式)的配置與使用示例 + 串口重定向 + 使用HAL擴(kuò)展函數(shù)實(shí)現(xiàn)不定長數(shù)據(jù)接收

    【STM32】CUBEMX之串口:串口三種模式(輪詢模式、中斷模式、DMA模式)的配置與使用示例 + 串口重定向 + 使用HAL擴(kuò)展函數(shù)實(shí)現(xiàn)不定長數(shù)據(jù)接收

    目錄 ? 總覽 使用CUBEMX創(chuàng)建工程的基本配置 CUBEMX中的配置 Keil中的配置 實(shí)物連接 串口輪詢模式 輪詢模式HAL庫函數(shù) 特點(diǎn) 實(shí)驗(yàn)一:發(fā)送數(shù)據(jù)給單片機(jī)并讓其返回相同值 串口重定向 串口中斷模式 在CUBEMX中打開串口中斷 中斷模式HAL庫函數(shù) 特點(diǎn) 實(shí)驗(yàn)二:使用中斷回調(diào)完成實(shí)驗(yàn)一

    2024年04月10日
    瀏覽(44)
  • STM32—HAL庫中斷/DMA控制和完成串口通信

    STM32—HAL庫中斷/DMA控制和完成串口通信

    目錄 一、解決的問題 二、串口通訊協(xié)議和RS-232的介紹以及USB/TTL轉(zhuǎn)232模塊的工作原理? ?1、?串口協(xié)議和RS-232標(biāo)準(zhǔn): ?(1)串口協(xié)議: (2)RS-232 標(biāo)準(zhǔn):? ?2、RS232電平與TTL電平的區(qū)別? ?3、USB/TTL轉(zhuǎn)232“模塊(CH340芯片為例)? (1)基本原理:? (2)CH340模塊介紹: ?三、搭

    2024年02月02日
    瀏覽(30)
  • 【STM32 HAL庫實(shí)戰(zhàn)】串口DMA + 空閑中斷 實(shí)現(xiàn)不定長數(shù)據(jù)接收

    【STM32 HAL庫實(shí)戰(zhàn)】串口DMA + 空閑中斷 實(shí)現(xiàn)不定長數(shù)據(jù)接收

    STM32CubeMX最新版: 打開STM32CubeMX軟件,點(diǎn)擊ACCESS TO MCU SELECTOR,在Commercial Part Number 中輸入MCU型號,例如我在這里輸入了STM32L431RCT6。選中正確型號然后雙擊進(jìn)入下一步的配置界面。 1.1 SYS配置如圖 1.2 RCC配置如圖 開啟了外部晶振,若無則都選擇Disable 1.3 USART1配置 NVIC Settings 注意

    2024年02月03日
    瀏覽(38)
  • (stm32之HAL庫)UART工作在DMA模式要打開串口中斷嗎?

    (stm32之HAL庫)UART工作在DMA模式要打開串口中斷嗎?

    最近學(xué)習(xí)了stm32(F4xx)的串口在DMA模式下的使用,期間以ST官方提供的例程進(jìn)行參考學(xué)習(xí),發(fā)現(xiàn)其初始化過程中是打開了UART的中斷的,而且HAL庫中stm32f4xx_hal_uart.c文件中的DMA模式使用說明里也有這么一句話: 即在非循環(huán)模式下(也就是發(fā)完一次數(shù)據(jù)就停止的常用模式)需要配置

    2024年02月12日
    瀏覽(30)
  • HAL庫 STM32運(yùn)用DMA與IDLE中斷實(shí)現(xiàn)高效串口通信 (附代碼)

    HAL庫 STM32運(yùn)用DMA與IDLE中斷實(shí)現(xiàn)高效串口通信 (附代碼)

    最近想做一個(gè)控制電機(jī)的項(xiàng)目,其中會用到Pytho與單片機(jī)STM32之間的互同,最近也在看一些關(guān)于數(shù)據(jù)通信和拆包的相關(guān)知識,所以記錄一下這段時(shí)間里對兩者之間的互通所做的事情和發(fā)現(xiàn)的問題,以供自己和大家參考。 單片機(jī)的串口是我們常用的與電腦通信的外設(shè),本次與P

    2024年01月22日
    瀏覽(22)
  • STM32F4 HAL庫使用DMA進(jìn)行ADC采樣實(shí)時(shí)發(fā)送波形到串口顯示(包含傅里葉變換)

    STM32F4 HAL庫使用DMA進(jìn)行ADC采樣實(shí)時(shí)發(fā)送波形到串口顯示(包含傅里葉變換)

    按下 STM32F4 的 KEY0 按鍵,通過外部中斷的方式對按鍵進(jìn)行檢測,然后進(jìn)行一次固定點(diǎn)數(shù)的 DMA ADC 采集,采集完成后在 DMA 的中斷發(fā)送采集到的數(shù)據(jù),然后清空數(shù)據(jù)區(qū)準(zhǔn)備下一次的按鍵中斷。電腦接受到串口數(shù)據(jù)后對數(shù)據(jù)進(jìn)行簡單處理和傅里葉變化,然后實(shí)時(shí)顯示在電腦上。 開

    2024年02月14日
    瀏覽(34)
  • 嵌入式開發(fā)--STM32用DMA+IDLE中斷方式串口接收不定長數(shù)據(jù)

    嵌入式開發(fā)--STM32用DMA+IDLE中斷方式串口接收不定長數(shù)據(jù)

    之前講過用 利用IDLE空閑中斷來接收不定長數(shù)據(jù) ,但是沒有用到DMA,其實(shí)用DMA會更加的高效,MCU也可以騰出更多的性能去處理應(yīng)該做的事情。 IDLE顧名思義,就是空閑的意思,即當(dāng)監(jiān)測到串口空閑超過1個(gè)串口的數(shù)據(jù)幀時(shí),會使?fàn)顟B(tài)寄存器(SR或ISR)的IDLE位置位,如果此時(shí)控制

    2024年04月17日
    瀏覽(39)
  • GD32F4單片機(jī)實(shí)現(xiàn)接收超時(shí)中斷+DMA實(shí)現(xiàn)串口的不定長接收和DMA發(fā)送

    GD32F4單片機(jī)實(shí)現(xiàn)接收超時(shí)中斷+DMA實(shí)現(xiàn)串口的不定長接收和DMA發(fā)送

    環(huán)形緩沖區(qū)+定時(shí)器超時(shí)中斷的方式 優(yōu)點(diǎn) 環(huán)形緩沖區(qū)可以接收多幀數(shù)據(jù) 數(shù)據(jù)幀超時(shí)間隔可以設(shè)置 缺點(diǎn) 設(shè)備任務(wù)比較繁重時(shí),使用中斷接收可能會丟失數(shù)據(jù)。尤其是在長時(shí)間關(guān)閉中斷或者串口中斷優(yōu)先級不高時(shí) 頻繁進(jìn)出中斷。在使用RTOS的系統(tǒng)中,每收到一個(gè)數(shù)據(jù)就會進(jìn)行一

    2024年02月15日
    瀏覽(27)
  • STM32 HAL DMA中斷配置

    STM32 HAL DMA中斷配置

    使用HAL庫方式DMA中斷時(shí),在網(wǎng)上找了好多資料都沒有怎么介紹。所以就自己研究了一下,并做個(gè)記錄。我的芯片型號是STM32G030。下面我以I2C傳數(shù)據(jù)為例介紹下HAL庫是如何使用DMA中斷的。 我使用的是I2C2,簡單配置下參數(shù),加上DMA通道。 DMA貌似默認(rèn)開啟了中斷,藍(lán)色的勾勾是我

    2024年04月23日
    瀏覽(31)
  • 【STM32F4系列】【HAL庫】【自制庫】WS2812(軟件部分)(PWM+DMA)

    【STM32F4系列】【HAL庫】【自制庫】WS2812(軟件部分)(PWM+DMA)

    硬件介紹(PCB設(shè)計(jì)方案) 模擬時(shí)序發(fā)送 WS2812是一種異步串行通信,它每一位數(shù)據(jù)時(shí)間是ns級別的 默認(rèn)是高電平狀態(tài) 0碼:220-380ns高電平+580-1600ns低電平 1碼:580-1600ns高電平+220-380ns低電平 復(fù)位碼:280us低電平 24Bit數(shù)據(jù)來代表GRB的亮度值 從高位到低位發(fā)送,分別按照G-R-B的順序發(fā)送

    2024年02月15日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包