實驗1-實驗目的:通過DMA把buffer的數據搬運到buffer2當中。
//declare a buffer to store the data
uint32_t buffer[3] = {1,2,3};//declare a buffer to store the data
uint32_t buffer2[3] = {0,0,0};
DMA:是個搬運數據的小助手。
相關設置:
main函數中搬運數據:
HAL_DMA_Start(&hdma_memtomem_dma1_channel1, (uint32_t)buffer, (uint32_t)buffer2, 10);
so easy!? one line code~
觀察結果:
首先把buffer? buffer2 右鍵加入watch:
其次斷點運行代碼:
最后再watch窗口觀察變量。
實驗2-串口與DMA配合使用:
?
代碼如下:
uint8_t t=0x11;HAL_UART_Transmit_DMA(&huart1,&t,1);
運行效果:
DMA +串口接收數據:
也就是一行代碼:
uint8_t buffer2[3] = {0x00,0x00,0x00};
...
main(){...HAL_UART_Receive_DMA(&huart1,buffer2,3);
}
當數據接收完后,會產生中斷:
// interupt callback function for DMA1_Channel5_IRQn
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance == USART1) {// if the data is received successfully, the data will be sent back to the senderHAL_UART_Transmit_DMA(&huart1,buffer2,3);//start the DMA-usart1 recevie data,data save to buffer2HAL_UART_Receive_DMA(&huart1,buffer2,3);}
}
看結果:?
另外,可以利用空閑中斷接收不定長數據,但就我個人習慣而言,優先用定長數據,這也應該更合理,本文就不展開這些內容了。
(空閑中斷也是三個方式)
直接上空閑中斷回調函數代碼,不多解釋了。
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{if(huart->Instance == USART1) {// if the data is received successfully, the data will be sent back to the senderHAL_UART_Transmit_DMA(&huart1,buffer2,3);//start the DMA-usart1 recevie data,data save to buffer2HAL_UARTEx_ReceiveToIdle_DMA(&huart1,buffer2,3);}
}
ps:
如果要開啟調試,必須配置SYS
在一般工程中,通用的配置是開啟時鐘(RCC配置)、以及HAL初始化配置(SYS配置)。本文主要講解SYS配置。
SYS配置頁各配置項
CubeMX 中 SYS配置頁如下:
Debug :
默認是關閉的,如果不使用調試器關閉即可,即No Debug;
在STM32CubeMX的SYS選項欄中有SW和JTAG協議選項,用戶可以根據需要選擇相應的協議;
JTAG調試接口(JTAG-DP)需要5個引腳;CubeMX中可選擇5pin或4pin的JTAG,5pin比4pin多了一個復位引腳。
SW調試接口(SW-DP)需要2個引腳。二者之間有復用引腳。SW調試端口采用同步串行協議:SWCLK引腳為從主機到從機的時鐘信號;SWDIO為雙向數據信號。
ST-Link采用的是SW調試接口,選擇Serial Wire ;
J-Link采用的是JTAG調試接口,根據實際要求選擇 JTAG(4pin) 或者 JTAG(5pin) ;
如果使用J-Link 但是采用SWD協議,也可以選擇Trace Asynchronous Sw ;
Trace Asynchronous Sw 模式有時候也可以解決使用ST-Link 燒錄之后無法燒錄和調試的情況
為了避免一次燒錄之后無法下一次燒錄或者調試的情況, 推薦選擇Serial Wire
如果在STM32CubeMX中選擇SW協議,MDK 也必須 選擇SW協議。JTAG協議配置也同理。否則會造成下載和調試失敗。在實際項目中SW協議使用使用的比較多,速度更快,占用的引腳更少,推薦配置成SW協議,即Serial Wire模式;
System Wake-Up :
設置低功耗模式下的自動喚醒功能,通過引腳PA0。
Timebase Source :
一般指HAL的時基,即HAL庫中的uwTick,用于實現HAL_Delay()以及作為各種timeout時鐘的基準。一般情況下直接選擇默認的Sys Tick(嘀嗒定時器)來維護SYS Timebase Source即可,即直接放在SysTick_Handler()中斷服務函數中,也就是下面的HAL_IncTick()函數。
?
MDK中對應的調試設置
在魔術棒設置界面,進入(1)Debug界面,在(2)位置選擇自己使用的下載器,然后進入(3)Settings界面;
在Settings界面 ,根據之前在STM32CubeMx里面SYS設置的,進行選擇這里使用的SW還是JTAG協議;
注意STM32CubeMx 和 MKD 里面協議要一致,否則無法進行調試
補充
單片機的三種燒錄模式
ICP:使用SWD接口進行燒錄,如J-Link燒錄器和J-Flash軟件配合使用。
ISP:使用引導程序(Bootload)加上外圍UART/USB等接口進行燒錄。
IAP:軟件自身實現在線電擦除和編程的方法,不使用任何工具。程序通常分成兩塊,分別為引導程序和應用程序。
CubeMX代碼生成器配置
Copy all used libraries into the project folder
將HAL庫的所有.C和.H都復制到所建工程中
優點:這樣如果后續需要新增其他外設又可能不再用STM32CubeMX的時候便會很方便
缺點: 體積大,編譯時間相比于其他選項非常長
Copy only the necessary library files
只復制所需要的.C和.H
優點:體積相對小,編譯時間短,并且工程可復制拷貝
缺點: 新增外設時需要重新用STM32CubeMX導入
Add necessary library files as reference in the toolchain project configuration file
不復制文件,直接從軟件包存放位置導入.C和.H
優點:體積小,比較節約硬盤空間
缺點: 復制到其他電腦上或者軟件包位置改變,就需要修改相對應的路徑
根據自己需求選擇就行,一般來說第一個和第二個都行;
參考:CSDN博主「Dir_xr」原文鏈接:https://blog.csdn.net/Dir_x/article/details/128846252