OpenEdv-开源电子网

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

SPI DMA 的中断不能打断while 问题

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2021-2-23
在线时间
7 小时
发表于 2021-7-10 14:17:07 | 显示全部楼层 |阅读模式
2金钱
本帖最后由 jiditianbin 于 2021-7-10 14:34 编辑

调试SPI 时候遇到一个很奇怪的问题

SPI 采用DMA方式,配置发送接收的DMAcallback
  MX_SPI1_Init();
  hspi1.TxRxCpltCallback = Audio_Data_SPI_Send_Again;
  HAL_SPI_RegisterCallback(&hspi1, HAL_SPI_TX_RX_COMPLETE_CB_ID, hspi1.TxRxCpltCallback);


callback函数中主要做了清理标志位
void Audio_Data_SPI_Send_Again(SPI_HandleTypeDef *hspi)
{
        spireadbusy = 0;

}

而在main函数中做的主要的任务如下
         while(1)
        {
                 while(spireadbusy == 1 )                //等待发送区空        
                {
                        retry++;
                        if(retry>=1000000)
                        {
                                retry = 0;
                                printf("while(spireadbusy == 1) timeout spireadbusy = %d \r\n",spireadbusy);        

                                //break;         //超时退出
                                //spireadbusy = 0;
                                //return 0 ;
                        }
                }

                HAL_SPI_TransmitReceive_DMA(&hspi1,spi_sram_receive,readaddr,SPI_SRAM_SIZE);
        }
现在有个很奇怪的问题,不好理解
红色部分的三个语句,任意一个存在,
Audio_Data_SPI_Send_Again 函数都不能打断 while(spireadbusy == 1 ),
每次都会超时结束退出while(spireadbusy == 1 ),然后才运行Audio_Data_SPI_Send_Again,

如果三个语句都不存在
那么Audio_Data_SPI_Send_Again 函数就可以正常打断 while(spireadbusy == 1 ),
运行Audio_Data_SPI_Send_Again,清除标志位,退出while(spireadbusy == 1 )
请问有没有遇到这样的问题的,为什么break之类的语句会让中断无法运行?

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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-23 15:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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