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

实验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

  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值