stm32F103RCT6的DMA使用經歷

2022-09-19 15:03:09 字數 1599 閱讀 7843

dma可以直接傳輸資料,減少了cpu的負擔,是個很好的功能,但是用的時候難免會一頭霧水。這次做個小小的串列埠收發程式就碰到了許多問題。

之前沒有注意,選擇了dma的circular模式,然後奇怪的事情發生了

很明顯我這個hal_uart_transmit_dma是寫在while(1)外面的,但是串列埠除錯的結果與我的預期剛剛好相反

我認為它應該是只傳送一次的,很明顯,當時的我對於dma完全不了解(現在也是)

後面想了一下覺得應該是dma的模式的問題,就改成了normal模式,輸出就正常了,就輸出了一次語句

在此之後,我又做了一些試驗,以下是部分原始碼

#include "

main.h

"#include

"dma.h

"#include

"usart.h

"#include

"gpio.h

"#include

#include

uint8_t str_tx1 = "

hello world! this is stm32f103rct6!\r\n";

uint8_t str_tx2[

64];

uint8_t str_rx1 = 0

;uint8_t str_rx2[

64];

void systemclock_config(void);

int main(void

)}

開啟串列埠之後如下圖所示

​與此同時我注意到了右下角的接收資料量還是在一直增加的

先加1,再加64(也就是我兩個字串的資料量)

然後我傳送了乙個9,應該是第一句接收到了

hal_uart_receive(&huart4,&str_rx1,1,1000);  //

等待使用者傳送資料,1秒後無響應則執行後面的語句

我再傳送了乙個hello,應該是第二個字串接收到了

hal_uart_receive(&huart4,str_rx2,64,1000);  //

等待使用者傳送資料,1秒後無響應則執行後面的語句

這時候如果我傳送乙個2,就會覆蓋掉這個字串的第一位

傳送66,則會出現以下情況

也就是後面的傳送資料寫入字串是覆蓋寫入,當寫入量等於1的時候會覆蓋第二個字串的首位字元,當寫入數量大於1的時候會寫入第乙個字串,輸入的第乙個字元寫入第乙個字串,其餘的覆蓋掉第二個字串

STM32F103RCT6第乙個程式 跑馬燈程式

下面簡單介紹下跑馬燈程式主要需要配置的方面 crl和crh暫存器用於配置stm32的io口的模式和速率 gpio有8種工作模式 1 輸入浮空 2 輸入上拉 3 輸入下拉 4 模擬輸入 5 開漏輸出 6 推挽輸出 7 推挽式復用功能 8 開漏復用功能 對應 如下 typedef enum gpiomo...

STM32F103ZET6學習總結

1.任何外設在使用之前,必須先使能相應的時鐘。2.使用不同外設時,gpio引腳應該如何配置?1 gpio mode ain 模擬輸入 2 gpio mode in floating 浮空輸入 3 gpio mode ipd 下拉輸入 4 gpio mode ipu 上拉輸入 5 gpio mode ...

STM32F103VET6 字尾意義

stm32代表arm cortex m核心的32位微控制器.1.f 那一位指的是產品型別,現在似乎只有通用型即 f 2.103 那位指的是產品子系列,101 基本型,102 usb基本型 usb 2.0全速裝置,103 增強型,105或107 互聯型 stm32f103資源 一路can2.0b,最大...