实验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 sender
HAL_UART_Transmit_DMA(&huart1,buffer2,3);
//start the DMA-usart1 recevie data,data save to buffer2
HAL_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 sender
HAL_UART_Transmit_DMA(&huart1,buffer2,3);
//start the DMA-usart1 recevie data,data save to buffer2
HAL_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