STM32/STM8技术william hill官网
直播中

张峰

7年用户 195经验值
私信 关注
[问答]

STM32F103RCT6开启SPI1 DMA一直无法读取FALSH的数据

        由于项目的需要,需要读取FLASH W25Q16的数据,要求开启DMA来读取便于节省STM32的CPU。
        SPI和DMA都已经配置好了,如果不用DMA可以正常读写,但是开启DMA后,一直卡在这句话while(DMA_GetFlagStatus(DMA1_FLAG_TC2) == RESET);
        下面是我的配置函数,不知道哪里出错了,大家帮帮忙,是哪里出错了呢?
        这个是SPI的配置
        这个是DMA的配置

        程序一直卡在这里过不去呢?

下面是源程序的

回帖(11)

孙婷婷

2018-12-27 09:11:24
楼主,常规理解,DMA在开启中断后,将读取的数据放入到缓冲区,当缓冲区满以后产生DMA中断。这时在DMA中断中加处理即可。代码中未看到DMA的NVIC配置。
举报

张峰

2018-12-27 09:24:12
引用: TOPCB 发表于 2018-12-27 16:02
楼主,常规理解,DMA在开启中断后,将读取的数据放入到缓冲区,当缓冲区满以后产生DMA中断。这时在DMA中断中加处理即可。代码中未看到DMA的NVIC配置。

配置了NVIC,也写了中断的
        //NVIC SPI1 RX
        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
举报

孙婷婷

2018-12-27 09:31:45
用中断的话,应该是在中断中做处理啊。读取的标志位用DMA_GetITStatus。
举报

张峰

2018-12-27 09:47:42
引用: TOPCB 发表于 2018-12-27 16:22
用中断的话,应该是在中断中做处理啊。读取的标志位用DMA_GetITStatus。

嗯 嗯 现在是无法进入中断的
中断函数也有
void DMA1_Channel2_IRQHandler(void)
{
        if(DMA_GetITStatus(DMA1_IT_TC2))
        {
               
                DMA_ClearITPendingBit(DMA1_IT_TC2);
        }


}
举报

孙婷婷

2018-12-27 09:56:31
楼主,从手册上看应该用通道4
举报

张峰

2018-12-27 10:02:46
啊?我看中文参考手册上面是通道2呢
举报

张峰

2018-12-27 10:21:17
引用: TOPCB 发表于 2018-12-27 16:47
楼主,从手册上看应该用通道4

你看下面我回复的 我看的中文参考手册上面是通道2呢?
举报

孙婷婷

2018-12-27 10:40:16
你的DMA里写的是SPI2,所以我就找的是SPI2的DMA说明。
举报

张峰

2018-12-27 10:51:10
引用: TOPCB 发表于 2018-12-27 17:31
你的DMA里写的是SPI2,所以我就找的是SPI2的DMA说明。

??我写的SPI1的啊?
举报

lee_st

2018-12-27 14:59:38
你关联spi和dma了吗?????
举报

lee_st

2018-12-27 14:59:48
代码有问题 的
举报

更多回帖

发帖
×
20
完善资料,
赚取积分