生活随笔
收集整理的這篇文章主要介紹了
STM32-----找个搬砖的搬数据
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
搬磚工人(DMA)
本節中,利用DMA將陀螺儀中的數據通過串口2,讀取到內存,然后再由串口1通過DMA發送出來。當然了 需要一個老板來控制什么時候開始搬什么時候結束。使用外部中斷兩個按鍵,一個控制開始搬,一個控制停止搬。
具體的工作流程,USART2通過DMA讀取陀螺儀的數據放置在內存中,然后USART1通過DMA發送出去,按鍵作為外部中斷開控制DMA的使能和不使能。LED顯示是否傳輸,當USART1開始發送數據時,LED燈亮,否則滅。
監督(LED)老板(EXTI)搬磚工人(DMA)運輸(USART)
監督(LED)
配置GPIO輸出,控制LED的亮和滅,控制部分放在EXTI中斷服務程序中。
老板(EXTI)
配置兩個按鍵為外部中斷,在中斷服務函數中編寫相應的控制DMA和LED的程序:
具體如下:
void EXTI1_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line1
)==SET
){GPIO_ResetBits(GPIOA
,GPIO_Pin_8
);DMA_Cmd(DMA1_Channel4
,ENABLE
);EXTI_ClearITPendingBit(EXTI_Line1
);}
}void EXTI15_10_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line13
) == SET
){GPIO_SetBits(GPIOA
,GPIO_Pin_8
);DMA_Cmd(DMA1_Channel4
,DISABLE
);EXTI_ClearITPendingBit(EXTI_Line13
);}
}
搬磚工人(DMA)
對于DMA通俗點來說,就是配置好從哪里傳輸到哪里,傳輸的大小,傳輸的方式等,然后就不需要CPU再參與數據的傳輸工作。
對于DMA的使用首先需要知道一下幾點:
時鐘通道
時鐘
對于DMA來說是掛載在AHB總線之上,所以開啟時鐘需要使用下面的方式來進行開啟:
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1
,ENABLE
);
通道
對于不同的外設,對應不同的DMA通道,因此在配置之前需要知道用到的是DMA的那個通道,對于DMA1的通道情況如下:
了解這些之后就是對DMA的相應配置:
void USART1_TX_DMA_Configuration(void)
{DMA_InitTypeDef dma_s
;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1
,ENABLE
);dma_s
.DMA_BufferSize
= 10;dma_s
.DMA_DIR
= DMA_DIR_PeripheralDST
;dma_s
.DMA_M2M
= DMA_M2M_Disable
;dma_s
.DMA_MemoryBaseAddr
= (u32
)buff
;dma_s
.DMA_MemoryDataSize
= DMA_MemoryDataSize_Byte
;dma_s
.DMA_MemoryInc
= DMA_MemoryInc_Enable
;dma_s
.DMA_PeripheralBaseAddr
= (u32
)&USART1
->DR
;dma_s
.DMA_PeripheralDataSize
= DMA_PeripheralDataSize_Byte
;dma_s
.DMA_PeripheralInc
= DMA_PeripheralInc_Disable
;dma_s
.DMA_Priority
= DMA_Priority_Medium
;dma_s
.DMA_Mode
= DMA_Mode_Circular
;DMA_Init(DMA1_Channel4
,&dma_s
);DMA_ITConfig(DMA1_Channel4
,DMA_IT_TC
,ENABLE
);
}
void USART2_RX_DMA_Configuration(void)
{DMA_InitTypeDef dma_s
;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1
,ENABLE
);dma_s
.DMA_BufferSize
= 10;dma_s
.DMA_DIR
= DMA_DIR_PeripheralSRC
;dma_s
.DMA_M2M
= DMA_M2M_Disable
;dma_s
.DMA_MemoryBaseAddr
= (u32
)buff
;dma_s
.DMA_MemoryDataSize
= DMA_MemoryDataSize_Byte
;dma_s
.DMA_MemoryInc
= DMA_MemoryInc_Enable
;dma_s
.DMA_Mode
= DMA_Mode_Circular
;dma_s
.DMA_PeripheralBaseAddr
= (u32
)&USART2
->DR
;dma_s
.DMA_PeripheralDataSize
= DMA_PeripheralDataSize_Byte
;dma_s
.DMA_PeripheralInc
= DMA_PeripheralInc_Disable
;dma_s
.DMA_Priority
= DMA_Priority_Medium
;DMA_Init(DMA1_Channel6
,&dma_s
);DMA_ITConfig(DMA1_Channel6
,DMA_IT_TC
,ENABLE
);DMA_Cmd(DMA1_Channel6
,ENABLE
);
運輸(USART)
對于數據的讀入和發送還是通過串口來實現的,不過不需要CPU實時參與其中。因此在USART配置的過程中需要對串口額外的配置與DMA相關的東西。具體如下:
void USART1_Config(void)
{USART_InitTypeDef usart_s
;usart_s
.USART_BaudRate
= 9600;usart_s
.USART_WordLength
= USART_WordLength_8b
;usart_s
.USART_StopBits
= USART_StopBits_1
;usart_s
.USART_HardwareFlowControl
= USART_HardwareFlowControl_None
;usart_s
.USART_Parity
= USART_Parity_No
;usart_s
.USART_Mode
= USART_Mode_Rx
| USART_Mode_Tx
;USART_Init(USART1
,&usart_s
);USART_DMACmd(USART1
,USART_DMAReq_Tx
,ENABLE
);USART_Cmd(USART1
,ENABLE
);
}
不同于之前串口的配置,在該配置中多了一行USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);。用來開啟對應DMA的操作權限。
總結
以上是生活随笔為你收集整理的STM32-----找个搬砖的搬数据的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。