前言
本章介紹使用STM32CubeMX對(duì)DMA進(jìn)行配置的方法,DMA的原理、概念和特點(diǎn),配置各個(gè)步驟的功能,并通過(guò)串口DMA傳輸實(shí)驗(yàn)方式驗(yàn)證。
一、什么是DMA?
DMA(Direct Memory Access),即直接存儲(chǔ)器訪問(wèn)。 DMA 傳輸方式無(wú)需 CPU 直接控制傳輸,也沒(méi)有中斷處理方式那樣保留現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng)的過(guò)程,通過(guò)硬件為 RAM 與 I/O 設(shè)備開(kāi)辟一條直接傳送數(shù)據(jù)的通路, 能使 CPU 的效率大為提高。
STM32F103 內(nèi)部有 2 個(gè) DMA 控制器(DMA2 僅存大容量產(chǎn)品中), DMA1 有 7 個(gè)通道。DMA2 有 5 個(gè)通道。每個(gè)通道專門用來(lái)管理來(lái)自于一個(gè)或多個(gè)外設(shè)對(duì)存儲(chǔ)器訪問(wèn)的請(qǐng)求。還有一個(gè)仲裁器來(lái)協(xié)調(diào)各個(gè) DMA 請(qǐng)求的優(yōu)先權(quán)。
DMA框架圖如下:
① DMA 請(qǐng)求:外設(shè)想要通過(guò) DMA 來(lái)傳輸數(shù)據(jù),必須先給 DMA 控制器發(fā)送 DMA 請(qǐng)求, DMA 收到請(qǐng)求信號(hào)之后,控制器會(huì)給外設(shè)一個(gè)應(yīng)答信號(hào),當(dāng)外設(shè)應(yīng)答后且 DMA 控制器收到應(yīng)答信號(hào)之后,就會(huì)啟動(dòng) DMA 的傳輸,直到傳輸完畢。這里可以看到SPI,TIM,UASRT,I2C,ADC等外設(shè)都可以使用DMA。
下面是F103各個(gè)外設(shè)和總線對(duì)應(yīng)的DMA通道:
② 通道:DMA 具有 12 個(gè)獨(dú)立可編程的通道,其中 DMA1 有 7 個(gè)通道, DMA2 有 5 個(gè)通道,每個(gè)通道對(duì)應(yīng)不同的外設(shè)的 DMA 請(qǐng)求。雖然每個(gè)通道可以接收多個(gè)外設(shè)的請(qǐng)求,但是同一時(shí)間只能接收一個(gè),不能同時(shí)接收多個(gè)。
③ 仲裁器:當(dāng)發(fā)生多個(gè) DMA 通道請(qǐng)求時(shí),就意味著有先后響應(yīng)處理的順序問(wèn)題,這個(gè)就由仲裁器管理誰(shuí)優(yōu)先執(zhí)行。
二、實(shí)驗(yàn)過(guò)程
這里以串口的DMA傳輸為例,配置過(guò)程如下
1.CubeMX配置
選擇芯片stm32f103c6t6,新建工程
設(shè)置時(shí)鐘源,最小系統(tǒng)外部晶振8Mhz,作為外部高速HSE時(shí)鐘源。由于沒(méi)有外接外部低速晶振,這里低速時(shí)鐘源選擇旁路時(shí)鐘源。
配置時(shí)鐘樹(shù),這里使用官方推薦的配置
USART1的參數(shù)配置如下,波特率115200,傳輸數(shù)據(jù)長(zhǎng)度為8 Bit,奇偶檢驗(yàn)無(wú),停止位1.其他參數(shù)默認(rèn)
使能USART1中斷,串口使用DMA方式必須開(kāi)啟中斷,否則程序發(fā)送一次數(shù)據(jù)后,不能判斷DMA傳輸是否完成,串口會(huì)一直處于busy狀態(tài)。
DMA參數(shù)配置,發(fā)送選擇 DMA1 Stream 4通道,方向從存儲(chǔ)器到外設(shè),優(yōu)先級(jí)為低。接收選擇 DMA1 Stream 5通道,方向從外設(shè)到存儲(chǔ)器。mode設(shè)置可以選擇Normal表單次傳輸,傳輸一次后終止傳輸,Circular表示循環(huán)傳輸,傳輸完成后又重新開(kāi)始繼續(xù)傳輸,不斷循環(huán)永不停止。此處選擇單次傳輸,Mode為Normal。Data Width:串口數(shù)據(jù)發(fā)送寄存器只能存儲(chǔ)8bit,每次發(fā)送一個(gè)字節(jié),所以數(shù)據(jù)長(zhǎng)度選擇Byte。
Code Generator中設(shè)置只拷貝使用到的庫(kù),分離.c和.h文件
設(shè)置好項(xiàng)目名稱和路徑,點(diǎn)擊GENERATE CODE即可,生成后使用keil5 IDE打開(kāi)。
2.代碼實(shí)現(xiàn)
在usart.c文件后面添加如下代碼,代碼中添加了#ifdef宏定義進(jìn)行條件編譯,如果使用GUNC編譯,則PUTCHAR_PROTOTYPE 定義為int __io_putchar(int ch)函數(shù),否則定義為int fputc(int ch, FILE *f)函數(shù)。
/* USER CODE BEGIN 0 */
#include "stdio.h"
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
* @brief Retargets the C library printf function to the USART.
* @param None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
/* USER CODE END 0 */
main函數(shù)如下,每秒串口打印一次:
/* USER CODE BEGIN 0 */
uint8_t aTxMessage[] = "\r\n****DMA Serial communication***\r\n";
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)aTxMessage, sizeof(aTxMessage));
HAL_Delay(1000);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
3.實(shí)驗(yàn)結(jié)果
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-614899.html
總結(jié)
DMA的原理和特性很重要,在很多實(shí)際開(kāi)發(fā)中都有應(yīng)用,如大數(shù)據(jù)量的傳輸,高速率的數(shù)據(jù)交換等。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-614899.html
到了這里,關(guān)于STM32開(kāi)發(fā)(16)----CubeMX配置DMA的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!