当前位置:   article > 正文

用HAL库改写江科大的stm32入门例子8-1 DMA数据转运

用HAL库改写江科大的stm32入门例子8-1 DMA数据转运

实验1-实验目的:通过DMA把buffer的数据搬运到buffer2当中。

  1. //declare a buffer to store the data
  2. uint32_t buffer[3] = {1,2,3};
  3. //declare a buffer to store the data
  4. 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配合使用:

 

代码如下:

  1. uint8_t t=0x11;
  2. HAL_UART_Transmit_DMA(&huart1,&t,1);

运行效果:

DMA +串口接收数据:

也就是一行代码:

  1. uint8_t buffer2[3] = {0x00,0x00,0x00};
  2. ...
  3. main(){
  4. ...
  5. HAL_UART_Receive_DMA(&huart1,buffer2,3);
  6. }

当数据接收完后,会产生中断:

  1. // interupt callback function for DMA1_Channel5_IRQn
  2. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  3. {
  4. if(huart->Instance == USART1) {
  5. // if the data is received successfully, the data will be sent back to the sender
  6. HAL_UART_Transmit_DMA(&huart1,buffer2,3);
  7. //start the DMA-usart1 recevie data,data save to buffer2
  8. HAL_UART_Receive_DMA(&huart1,buffer2,3);
  9. }
  10. }

看结果: 

另外,可以利用空闲中断接收不定长数据,但就我个人习惯而言,优先用定长数据,这也应该更合理,本文就不展开这些内容了。

(空闲中断也是三个方式)

直接上空闲中断回调函数代码,不多解释了。

  1. void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
  2. {
  3. if(huart->Instance == USART1) {
  4. // if the data is received successfully, the data will be sent back to the sender
  5. HAL_UART_Transmit_DMA(&huart1,buffer2,3);
  6. //start the DMA-usart1 recevie data,data save to buffer2
  7. HAL_UARTEx_ReceiveToIdle_DMA(&huart1,buffer2,3);
  8. }
  9. }

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/655681
推荐阅读
相关标签
  

闽ICP备14008679号