OpenEdv-开源电子网

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

求助:如何等待DMA传输完成后继续下一步操作?

[复制链接]

14

主题

141

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1126
金钱
1126
注册时间
2015-12-20
在线时间
119 小时
发表于 2020-12-23 17:27:39 | 显示全部楼层 |阅读模式
10金钱
硬件平台:STM32F103C8T6 + 1.44寸TFT屏(128*128)
软件平台:IAR for ARM 8.40.2

如果按网上例程,设置画图区域后,基本上每画一个点都要通过SPI发送一次。我使用HAL库,效率恨低。
为了加快速度,采用缓冲,DMA进行批量传输。
在DMA传输过程中,主要程序仍在运行,会出现传输没完成,再次执行下一个显示的指令(SPI传输)。
为了避免冲突,我设置一个全局变量Flag,启动DMA传输前把变量设置为繁忙状态。
传输完成回调函数中设为空闲。
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
{
  if (hspi == &hspi2)
  {
      HAL_SPI_DMAStop(&hspi2);   //停止DMA传输
      Scr_CS_OFF;                         //SPI器件线选关闭
      Flag = FREE;                         //标志位为空闲
}


每次显示都需要先设置显示区域,我为了防止冲突,先检查标志位,如非空闲就继续循环,直到空闲为止。
void LCD7735_SetWindows(uint8_t xStart, uint8_t yStart,uint8_t xEnd,uint8_t yEnd)
{
  while (Flag==BUSY) {__NOP;__NOP;__NOP;__NOP;}
......               
}


问题,实际运行中发现第一次运行正常,执行过一次DMA后,一直卡死在这循环中
直接用IAR调试,发现一个怪异现象:
让程序运行完回调函数,Flag的确为空闲,但检查一直不通过。

最佳答案

查看完整内容[请看2#楼]

flag加一个易变量标志volatile
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

582

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2690
金钱
2690
注册时间
2014-5-23
在线时间
188 小时
发表于 2020-12-23 17:27:40 | 显示全部楼层
flag加一个易变量标志volatile
回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3369
金钱
3369
注册时间
2011-11-10
在线时间
207 小时
发表于 2020-12-23 23:12:33 | 显示全部楼层
Flag需要加volatile修饰符,volatile char Flag。凡是在中断里会改变的变量都要加这个,包含中断回调函数。
回复

使用道具 举报

14

主题

141

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1126
金钱
1126
注册时间
2015-12-20
在线时间
119 小时
 楼主| 发表于 2020-12-24 09:39:49 | 显示全部楼层
awsawzj 发表于 2020-12-23 20:15
flag加一个易变量标志volatile

谢谢,可以解决。

还想问一个问题,对于数组(用于做显示缓存),如何防改?
回复

使用道具 举报

14

主题

141

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1126
金钱
1126
注册时间
2015-12-20
在线时间
119 小时
 楼主| 发表于 2020-12-24 22:23:57 | 显示全部楼层
解决了,我把数组设置为
extern 外部变量
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-24 09:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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