新手上路
- 积分
- 24
- 金钱
- 24
- 注册时间
- 2021-2-23
- 在线时间
- 7 小时
|
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之类的语句会让中断无法运行?
|
|