OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 213|回复: 3

STM32H743 利用定时器DMA触发SPI发送和 接收数据,发现接收的数据,前面5个都不变化

[复制链接]

20

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
384
金钱
384
注册时间
2016-12-5
在线时间
61 小时
发表于 2025-3-13 17:32:49 | 显示全部楼层 |阅读模式
10金钱

STM32H743  利用定时器DMA触发SPI发送和 接收数据,发现接收的前面5个都不变化,

SPI的芯片是一个ADC芯片,触发后,直接可以从MISO上获取到数据。

初始化程序,CH2 是 RX, CH4是TX,定义了两个全局的buf

  1. volatile uint32_t        DMARxBuf[32]= {0};
  2. volatile uint32_t        SPI1DMARxBuf[32] = {0};
复制代码

定时器的初始化代码如下

  1. void SPI_ZJC2001_Init(void)
  2. {   
  3.     LL_DMA_SetMemoryAddress(DMA1, LL_DMA_STREAM_1, (uint32_t)(&clk_word) );
  4.     LL_DMA_SetPeriphAddress(DMA1, LL_DMA_STREAM_1, (uint32_t)(&SPI_ZJC2001_NUM->TXDR));
  5.     LL_DMA_SetDataLength(DMA1, LL_DMA_STREAM_1, 1);
  6.     LL_DMA_EnableStream(DMA1, LL_DMA_STREAM_1);
  7.    
  8. //    LL_DMA_SetMemoryAddress(DMA2, LL_DMA_STREAM_0, (uint32_t)DMARxBuf );
  9.     LL_DMA_SetMemoryAddress(DMA2, LL_DMA_STREAM_0, (uint32_t)SPI1DMARxBuf );
  10.     LL_DMA_SetPeriphAddress(DMA2, LL_DMA_STREAM_0, (uint32_t)(&SPI_ZJC2001_NUM->RXDR));
  11.     LL_DMA_SetDataLength(DMA2, LL_DMA_STREAM_0, 14);
  12.     LL_DMA_EnableStream(DMA2, LL_DMA_STREAM_0);

  13.     LL_TIM_CC_EnableChannel(TIME_ZJC2001_NUM, LL_TIM_CHANNEL_CH2); //触发
  14.     LL_TIM_CC_EnableChannel(TIME_ZJC2001_NUM, LL_TIM_CHANNEL_CH3); //pwm 控制 CS
  15.     LL_TIM_CC_EnableChannel(TIME_ZJC2001_NUM, LL_TIM_CHANNEL_CH4); //触发

  16.     LL_TIM_EnableDMAReq_CC2(TIME_ZJC2001_NUM);
  17.     LL_TIM_EnableDMAReq_CC4(TIME_ZJC2001_NUM);
  18.     LL_TIM_EnableDMAReq_UPDATE(TIME_ZJC2001_NUM);
  19.   
  20.     LL_SPI_Enable(SPI_ZJC2001_NUM); //使能SPI外设
  21.     LL_SPI_StartMasterTransfer(SPI_ZJC2001_NUM);
  22.    
  23.     LL_TIM_SetCounter(TIME_ZJC2001_NUM, 0); //清0,重新计数
  24.     LL_TIM_EnableCounter(TIME_ZJC2001_NUM);//TIME_ZJC2001_NUM 计数使能
  25. }
复制代码

现象就是,我使用0X240049AC这个地址的变量DMARxBuf,前面5个数据,就不会变化,只会变化后面的。

而我如果使用 SPI1DMARxBuf ,地址是 0X24004A2C ,则发现,数据读写就正常。


优化等级,设置的是LEVEL 0,   ICACHE 和 DCHACHE 都是enable的;

对于这个现象,百思不得其解,求助大佬指点



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

20

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
384
金钱
384
注册时间
2016-12-5
在线时间
61 小时
 楼主| 发表于 2025-3-14 10:37:37 | 显示全部楼层
然后0X240049AC  在其他地方,写了一个自加1的变量操作,是可以动起来的
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165390
金钱
165390
注册时间
2010-12-1
在线时间
2112 小时
发表于 2025-3-15 23:08:50 | 显示全部楼层
给IO特定值看看,先排除adc问题
回复

使用道具 举报

20

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
384
金钱
384
注册时间
2016-12-5
在线时间
61 小时
 楼主| 发表于 2025-3-17 13:29:36 | 显示全部楼层
正点原子 发表于 2025-3-15 23:08
给IO特定值看看,先排除adc问题

我猜测是cache的问题,把变量放到了SARM4里面,暂时看好像正常
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-3 03:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表