国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

STM32 UART配置中斷DMA傳輸

發(fā)布者:EnchantedMelody最新更新時(shí)間:2024-04-15 來源: elecfans關(guān)鍵字:STM32  UART配置  中斷  DMA傳輸 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

在處理UART數(shù)據(jù)的時(shí)候,DMA是一種非常靈活、高效的方式。


※補(bǔ)記:USART_DR 串口數(shù)據(jù)寄存器是一個(gè)雙寄存器,包含了TDR和RDR,對(duì)它讀操作,讀取的是RDR寄存器的值,對(duì)它的寫操作,實(shí)際上是寫到TDR寄存器;當(dāng)向該寄存器寫數(shù)據(jù)的時(shí)候,串口就會(huì)自動(dòng)發(fā)送,當(dāng)收到收據(jù)的時(shí)候,也是存在該寄存器內(nèi)。

圖片

圖片


關(guān)于讀寫:


__STATIC_INLINE uint8_t LL_USART_ReceiveData8(USART_TypeDef *USARTx);/*

讀取接收寄存器USARTx_DR中8位數(shù)據(jù),接收即所得。返回值最大為0xFF

若使能校驗(yàn)位,接收的最高位MSB將由硬件自動(dòng)進(jìn)行校驗(yàn)。

*/

__STATIC_INLINE uint16_t LL_USART_ReceiveData9(USART_TypeDef *USARTx);/*

讀取接收寄存器USARTx_DR中9位數(shù)據(jù)(當(dāng)字節(jié)長9,接收即所得)。返回值最大為0x1FF

若使能校驗(yàn)位,接收的最高位MSB將由硬件自動(dòng)進(jìn)行校驗(yàn)。

*/

__STATIC_INLINE void LL_USART_TransmitData9(USART_TypeDef *USARTx, uint16_t Value);/*

向發(fā)送寄存器寫入9位數(shù)據(jù)。當(dāng)使能校驗(yàn)位,發(fā)送時(shí)最高位MSB自動(dòng)替換成校驗(yàn)值

*/

__STATIC_INLINE void LL_USART_TransmitData8(USART_TypeDef *USARTx, uint8_t Value)/*

向發(fā)送寄存器寫入8位數(shù)據(jù)。當(dāng)使能校驗(yàn)位,發(fā)送時(shí)最高位MSB自動(dòng)替換成校驗(yàn)值

*/

·


API:


__STATIC_INLINE void LL_USART_EnableDMAReq_RX(USART_TypeDef *USARTx);/*

使能接收DMA,啟用后DR有數(shù)據(jù)時(shí)將允許發(fā)送DMA請(qǐng)求;具體見示例用法

*/

__STATIC_INLINE void LL_USART_DisableDMAReq_RX(USART_TypeDef *USARTx);/*

禁用接收DMA

*/

__STATIC_INLINE uint32_t LL_USART_IsEnabledDMAReq_RX(USART_TypeDef *USARTx);/*

檢測是否使能接收DMA

*/


__STATIC_INLINE void LL_USART_EnableDMAReq_TX(USART_TypeDef *USARTx);/*

使能發(fā)送DMA

*/

__STATIC_INLINE void LL_USART_DisableDMAReq_TX(USART_TypeDef *USARTx);/*

禁用發(fā)送DMA

*/

__STATIC_INLINE uint32_t LL_USART_IsEnabledDMAReq_TX(USART_TypeDef *USARTx);/*

檢測是否使能發(fā)送DMA

*/

/**************************************************/

__STATIC_INLINE uint32_t LL_USART_DMA_GetRegAddr(USART_TypeDef *USARTx);/*

返回UART模塊數(shù)據(jù)寄存器DR地址;無論是否啟用DMA均可用

*/


/ 結(jié)力期末考分界線 */

配置使用DMA收發(fā):

1.在CubeMX中:

圖片

圖片

圖片


+在項(xiàng)目設(shè)置中調(diào)整為使用LL


2.生成代碼


此時(shí)在生成代碼已實(shí)現(xiàn)了串口DMA的初始化設(shè)置并生成了相應(yīng)的DMA中斷句柄。接下來通過代碼實(shí)現(xiàn)功能。示例為一個(gè)簡單的功能,將串口接收到的數(shù)據(jù)再通過串口發(fā)出。


3.配置


①在main.h中定義全局變量test_data:


uint8_t test_data;

②在usart.c中引入變量


extern uint8_t test_data;

③在usart.c中進(jìn)行設(shè)置


※通道配置為非循環(huán)模式時(shí),傳輸結(jié)束后(即傳輸計(jì)數(shù)變?yōu)?)將不再產(chǎn)生DMA操作。要開始新的DMA傳輸,需要3個(gè)步驟:在關(guān)閉DMA通道的情況下,在DMA_CNDTRx寄存器中重新寫入傳輸數(shù)目(有需要?jiǎng)t需重新配置地址),然后重新開啟DMA。


//RX DMA配置

 LL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_5,LL_USART_DMA_GetRegAddr(USART1));//連接外設(shè)寄存器USART1- >DR

 LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_5, (uint32_t)&test_data);//連接數(shù)據(jù)存儲(chǔ)地址

 LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_5, 1);/*設(shè)置傳輸?shù)臄?shù)據(jù)長度,由于是一字節(jié)一傳所以此處為1,

 若數(shù)據(jù)為n字節(jié)則會(huì)在接收到的字節(jié)數(shù)量達(dá)到n的時(shí)候,才傳輸結(jié)束。*/

 LL_USART_EnableDMAReq_RX(USART1);//使能RX接收DMA

 LL_DMA_EnableIT_TC(DMA1, LL_DMA_CHANNEL_5);//使能DMA通道的傳輸完成中斷功能;當(dāng)傳輸量達(dá)到數(shù)據(jù)長度將引發(fā)中斷

 LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_5);//開啟DMA傳輸,此時(shí)若RX讀取到數(shù)據(jù)寫入DR將傳輸至MemoryAddress

 //

 //TX DMA配置

 LL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_4, LL_USART_DMA_GetRegAddr(USART1)); //連接外設(shè)寄存器USART1- >DR

 LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_4, (uint32_t)&test_data); //連接數(shù)據(jù)存儲(chǔ)地址

 LL_DMA_EnableIT_TC(DMA1, LL_DMA_CHANNEL_4); //使能DMA中斷

 LL_USART_EnableDMAReq_TX(USART1); //使能TX接收DMA

 

  /* USER CODE END USART1_Init 1 */

④中斷處理函數(shù):


void DMA1_Channel5_IRQHandler(void)

{   //RX中斷調(diào)用

  /* USER CODE BEGIN DMA1_Channel5_IRQn 0 */

 

    if(LL_DMA_IsActiveFlag_TC5(DMA1))//判斷是否由DMA傳輸完成引發(fā)中斷

 {

  LL_DMA_DisableChannel(DMA1, LL_DMA_CHANNEL_5);//關(guān)閉通道,以在之后開啟新的DMA傳輸

  LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_4, (uint32_t)&test_data);  //TX連接數(shù)據(jù)存儲(chǔ)地址

  LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_4, 1);//設(shè)置TX數(shù)據(jù)長度

  LL_DMA_ClearFlag_TC5(DMA1);//清除中斷標(biāo)志,使能下一次RX中斷

  

  LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_4);//從數(shù)據(jù)位置向TX啟動(dòng)一次DMA;傳輸完成后調(diào)用TX的DMA中斷

 }

  /* USER CODE END DMA1_Channel5_IRQn 0 */


}

void DMA1_Channel4_IRQHandler(void)

{ //TX中斷調(diào)用

  /* USER CODE BEGIN DMA1_Channel4_IRQn 0 */

    if(LL_DMA_IsActiveFlag_TC4(DMA1))//判斷是否由DMA傳輸完成引發(fā)中斷

 {

  LL_DMA_ClearFlag_TC4(DMA1); //清除中斷標(biāo)志

  LL_DMA_DisableChannel(DMA1, LL_DMA_CHANNEL_4); //關(guān)閉通道,以在之后開啟新的DMA傳輸

  LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_5, (uint32_t)&test_data);   //RX連接數(shù)據(jù)存儲(chǔ)地址

  LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_5);//再次啟動(dòng)RX DMA功能

 }

  

  /* USER CODE END DMA1_Channel4_IRQn 0 */

}

以上代碼即可實(shí)現(xiàn)功能。


關(guān)鍵字:STM32  UART配置  中斷  DMA傳輸 引用地址:STM32 UART配置中斷DMA傳輸

上一篇:基于STM32的解魔方機(jī)器人設(shè)計(jì)方案
下一篇:串口如何接收數(shù)據(jù) STM32串口接收數(shù)據(jù)

推薦閱讀最新更新時(shí)間:2025-06-20 11:01

STM32】串口相關(guān)配置寄存器、庫函數(shù)(UART一般步驟)
STM32F1xx官方資料: 《STM32中文參考手冊(cè)V10》-第25章通用同步異步收發(fā)器(USART) 串口相關(guān)配置寄存器 狀態(tài)寄存器(USART_SR) 狀態(tài)寄存器適用于檢測串口此時(shí)所處的狀態(tài)。它能夠檢測到的狀態(tài)有:發(fā)送寄存器空位、發(fā)送完成位、讀數(shù)據(jù)寄存器非空位、檢測到主線空閑位、過載錯(cuò)誤為等等。 這邊主要關(guān)注兩個(gè)位:RXNE和TC(第5、6兩位)。 RXNE(讀數(shù)據(jù)寄存器非空):當(dāng)該位被置1的時(shí)候,就是提示已經(jīng)有數(shù)據(jù)被接收到了,并且可以讀出來了(即RDR移位寄存器中的數(shù)據(jù)被轉(zhuǎn)移到USART_DR寄存器中)。這時(shí)候要做的就是盡快讀取USART_DR,從而將該位清零,也可以向該位寫0,直接清除。
[單片機(jī)]
【<font color='red'>STM32</font>】串口相關(guān)<font color='red'>配置</font>寄存器、庫函數(shù)(<font color='red'>UART</font>一般步驟)
STM32中斷和事件的對(duì)比差異分析
事件是中斷的觸發(fā)源,開放了對(duì)應(yīng)的中斷屏蔽位,則事件可以觸發(fā)相應(yīng)的中斷。 事件還是其它一些操作的觸發(fā)源,比如DMA,還有TIM中影子寄存器的傳遞與更新;而中斷是不能觸發(fā)這些操作的,所以要把事件與中斷區(qū)分開。當(dāng)你只要產(chǎn)生中斷而不想觸發(fā)其它操作時(shí),就可以用事件屏蔽寄存器實(shí)現(xiàn)。 在STM32中,中斷與事件不是等價(jià)的,一個(gè)中斷肯定對(duì)應(yīng)一個(gè)事件,但一個(gè)事件不一定對(duì)應(yīng)一個(gè)中斷。 這張圖是一條外部中斷線或外部事件線的示意圖,圖中信號(hào)線上劃有一條斜線,旁邊標(biāo)志19字樣的注釋,表示這樣的線路共有19套.圖中的藍(lán)色虛線箭頭,標(biāo)出了外部中斷信號(hào)的傳輸路徑,首先外部信號(hào)從編號(hào)1的芯片管腳進(jìn)入,經(jīng)過編號(hào)2的邊沿檢測電路,通過編號(hào)3的或門進(jìn)入中斷掛起請(qǐng)
[單片機(jī)]
STM32單片機(jī)使用定時(shí)器中斷方式實(shí)現(xiàn)毫秒級(jí)延時(shí)的設(shè)計(jì)
因?yàn)镾TM32 HAL庫中僅有對(duì)HAl_Delay()毫秒級(jí)的延時(shí),為實(shí)現(xiàn)精確的微秒級(jí)延時(shí),就不得不修改Systick,但由于HAL庫內(nèi)部使用其作為超時(shí)判斷等操作,對(duì)其修改會(huì)發(fā)生不可預(yù)期的錯(cuò)誤,不建議修改。因此,使用通用定時(shí)器進(jìn)行定時(shí)操作。 參考網(wǎng)上例程,使用定時(shí)器中斷方式實(shí)現(xiàn)延時(shí),代碼如下: TIM3溢出時(shí)間=72MHz/(71+1)/(0+1)=1Mhz=1us 計(jì)數(shù)模式:向上計(jì)數(shù)模式 使能TIM3中斷 */ __IO static uint32_t usDelay=0; void Delayms(uint32_t ms) { Delayus(ms*1000); } void Delayus(uint32_t us) {
[單片機(jī)]
<font color='red'>STM32</font>單片機(jī)使用定時(shí)器<font color='red'>中斷</font>方式實(shí)現(xiàn)毫秒級(jí)延時(shí)的設(shè)計(jì)
STM32 HAL庫 定時(shí)器中斷
//定時(shí)時(shí)間t=(Prescaler +1)*(Period +1) /clock(定時(shí)器時(shí)鐘評(píng)率) ` MX_TIM3_Init(); HAL_TIM_Base_Start_IT(&htim3); //(必須要,啟動(dòng)定時(shí)器中斷) static void MX_TIM3_Init(void) { /* USER CODE BEGIN TIM3_Init 0 */ /* USER CODE END TIM3_Init 0 */ TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig =
[單片機(jī)]
STM32(六)外部中斷-EXTI
一、外部中斷敘述 1、STM32的每個(gè)IO都可以作為外部中斷輸入。 2、STM32的中斷控制器支持19個(gè)外部中斷/事件請(qǐng)求: 線0~15:對(duì)應(yīng)外部IO口的輸入中斷。 線16:連接到PVD輸出。 線17:連接到RTC鬧鐘事件。 線18:連接到USB喚醒事件。 3、每個(gè)外部中斷線可以獨(dú)立的配置觸發(fā)方式(上升沿,下降沿或者雙邊沿觸發(fā)),觸發(fā)/屏蔽,專用的狀態(tài)位。 從上面可以看出,STM32供IO使用的中斷線只有16個(gè),但是STM32F10x系列的IO口多達(dá)上百個(gè),STM32F103ZET6(112), STM32F103RCT6(51),那么中斷線怎么跟io口對(duì)應(yīng)呢? GPIOx.0映射到EXTI0 GPIOx.1映
[單片機(jī)]
<font color='red'>STM32</font>(六)外部<font color='red'>中斷</font>-EXTI
stm32中斷嵌套全攻略
斷斷續(xù)續(xù)學(xué)習(xí)STM32一學(xué)期了,時(shí)間過的好快,現(xiàn)在對(duì)STM32F103系列單片機(jī)的中斷嵌套及外部中斷做一個(gè)總結(jié),全當(dāng)學(xué)習(xí)筆記。廢話不多說,ARM公司的Cortex-m3 內(nèi)核,支持256個(gè)中斷,其中包含16個(gè)內(nèi)核中斷和240個(gè)外部中斷,并且具有256級(jí)的可編程中斷設(shè)置。在ST公司的STM32單片機(jī)中最多有84個(gè)中斷,包括16個(gè)內(nèi)核中斷(這16個(gè)內(nèi)部中斷是任何半導(dǎo)體商也改不了的),和68個(gè)可屏蔽中斷,具有16級(jí)可編程的中斷優(yōu)先級(jí)。但是在STM32F103系列中只有60個(gè)可屏蔽中斷,(107系列有68個(gè))。 針對(duì)這60個(gè)可屏蔽中斷,重點(diǎn)掌握它的一個(gè)中斷優(yōu)先級(jí)寄存器組IPR,全稱Interrupt Priority Registers。
[單片機(jī)]
STM32串口中斷實(shí)驗(yàn)總結(jié)函數(shù)的初始化必須在變量的初始化之后
在進(jìn)行串口的實(shí)驗(yàn)的時(shí)候,自己沒有看教程,寫了一段代碼,但是進(jìn)行編譯之后發(fā)現(xiàn)一直有錯(cuò)誤,就算我把代碼更改之后還是一直有錯(cuò)誤。對(duì)比了官方給的教程之后發(fā)現(xiàn)唯一的不同之處就是我的有一個(gè)函數(shù)的初始化是在變量的初始化之前,進(jìn)行的初始化,在進(jìn)行相應(yīng)的知識(shí)查詢之后,還有請(qǐng)教了師兄之后,發(fā)現(xiàn)了自己以前一直沒有注意到的問題就是,函數(shù)的初始化必須放到變量的初始化之后,否則在使用keil也就是MDK進(jìn)行建立工程的時(shí)候就會(huì)報(bào)錯(cuò)。 注意細(xì)節(jié)
[單片機(jī)]
<font color='red'>STM32</font>串口<font color='red'>中斷</font>實(shí)驗(yàn)總結(jié)函數(shù)的初始化必須在變量的初始化之后
stm32中斷服務(wù)函數(shù)名稱表速查
*參考啟動(dòng)文件 startup_stm32f10x_xl.s 中斷服務(wù)函數(shù)名(固定) 匹配對(duì)象 WWDG_IRQHandler Window Watchdog PVD_IRQHandler PVD through EXTI Line detect TAMPER_IRQHandler Tamper RTC_IRQHandler RTC FLASH_IRQHandler Flash RCC_IRQHandler RCC EXTI0_IRQHandler EXTI Line 0 EXTI1_IRQHandler EXTI Line 1 EXTI2_IRQHandler EXTI Line 2 EXTI3_IRQHandler EXT
[單片機(jī)]
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved