日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32-----找个搬砖的搬数据

發(fā)布時間:2025/3/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32-----找个搬砖的搬数据 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

搬磚工人(DMA)

本節(jié)中,利用DMA將陀螺儀中的數(shù)據(jù)通過串口2,讀取到內(nèi)存,然后再由串口1通過DMA發(fā)送出來。當然了 需要一個老板來控制什么時候開始搬什么時候結(jié)束。使用外部中斷兩個按鍵,一個控制開始搬,一個控制停止搬。
具體的工作流程,USART2通過DMA讀取陀螺儀的數(shù)據(jù)放置在內(nèi)存中,然后USART1通過DMA發(fā)送出去,按鍵作為外部中斷開控制DMA的使能和不使能。LED顯示是否傳輸,當USART1開始發(fā)送數(shù)據(jù)時,LED燈亮,否則滅。

  • 監(jiān)督(LED)
  • 老板(EXTI)
  • 搬磚工人(DMA)
  • 運輸(USART)
  • 監(jiān)督(LED)

    配置GPIO輸出,控制LED的亮和滅,控制部分放在EXTI中斷服務程序中。

    老板(EXTI)

    配置兩個按鍵為外部中斷,在中斷服務函數(shù)中編寫相應的控制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通俗點來說,就是配置好從哪里傳輸?shù)侥睦?#xff0c;傳輸?shù)拇笮?#xff0c;傳輸?shù)姆绞降?#xff0c;然后就不需要CPU再參與數(shù)據(jù)的傳輸工作。
    對于DMA的使用首先需要知道一下幾點:

  • 時鐘
  • 通道
  • 時鐘

    對于DMA來說是掛載在AHB總線之上,所以開啟時鐘需要使用下面的方式來進行開啟:

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);

    通道

    對于不同的外設(shè),對應不同的DMA通道,因此在配置之前需要知道用到的是DMA的那個通道,對于DMA1的通道情況如下:


    了解這些之后就是對DMA的相應配置:

    /*將數(shù)據(jù)從內(nèi)存?zhèn)鬏數(shù)酱?*/ void USART1_TX_DMA_Configuration(void) {DMA_InitTypeDef dma_s;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);dma_s.DMA_BufferSize = 10;//傳輸緩沖區(qū)的大小dma_s.DMA_DIR = DMA_DIR_PeripheralDST;//dam傳輸方向的控制,外設(shè)到內(nèi)存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;//外設(shè)地址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);//開啟DMA中斷 } /*將數(shù)據(jù)從串口2讀取到內(nèi)存*/ 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)

    對于數(shù)據(jù)的讀入和發(fā)送還是通過串口來實現(xiàn)的,不過不需要CPU實時參與其中。因此在USART配置的過程中需要對串口額外的配置與DMA相關(guān)的東西。具體如下:

    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的操作權(quán)限。

    總結(jié)

    以上是生活随笔為你收集整理的STM32-----找个搬砖的搬数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。