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,最大...