你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
大陶 提问时间:2017-11-22 17:56 /
        由于项目的需要,需要读取FLASH W25Q16的数据,要求开启DMA来读取便于节省STM32的CPU。
        SPI和DMA都已经配置好了,如果不用DMA可以正常读写,但是开启DMA后,一直卡在这句话while(DMA_GetFlagStatus(DMA1_FLAG_TC2) == RESET);
        下面是我的配置函数,不知道哪里出错了,大家帮帮忙,是哪里出错了呢?
        这个是SPI的配置 spi配置.png
        这个是DMA的配置
dma配置.png
        程序一直卡在这里过不去呢?
dma传输.png
下面是源程序的
STM32 W25X16 DMA.zip (2.86 MB, 下载次数: 66)
收藏 1 评论19 发布时间:2017-11-22 17:56

举报

19个回答
大陶 回答时间:2017-11-23 11:30:56
安 发表于 2017-11-23 11:21
你的DMA里写的是SPI2,所以我就找的是SPI2的DMA说明。

改过来了 dma里的一个错误也改过来了 但是 还是卡在程序里


SPI_InitTypeDef         SPI_InitStructure;
       
        SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
        SPI_InitStructure.SPI_Mode=SPI_Mode_Master;
        SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;
        SPI_InitStructure.SPI_CPOL=SPI_CPOL_High;
        SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge;
        SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;
        SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_16;
        SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;
        SPI_InitStructure.SPI_CRCPolynomial = 7;

        SPI_Init(SPI1,&SPI_InitStructure);
  SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Rx, ENABLE);
        SPI_Cmd(SPI1,ENABLE); //ʹÄÜSPI

        //½ûÖ¹FLASHƬѡ
        GPIO_SetBits(GPIOA,GPIO_Pin_2);
大陶 回答时间:2017-11-23 09:11:58
安 发表于 2017-11-23 08:47
楼主,常规理解,DMA在开启中断后,将读取的数据放入到缓冲区,当缓冲区满以后产生DMA中断。这时在DMA中断 ...

配置了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);
大陶 回答时间:2017-11-23 09:40:05
安 发表于 2017-11-23 09:20
用中断的话,应该是在中断中做处理啊。读取的标志位用DMA_GetITStatus。

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


}
废鱼 回答时间:2017-11-23 08:47:39
楼主,常规理解,DMA在开启中断后,将读取的数据放入到缓冲区,当缓冲区满以后产生DMA中断。这时在DMA中断中加处理即可。代码中未看到DMA的NVIC配置。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

废鱼 回答时间:2017-11-23 09:20:50
用中断的话,应该是在中断中做处理啊。读取的标志位用DMA_GetITStatus。
废鱼 回答时间:2017-11-23 10:34:23
楼主,从手册上看应该用通道4 截图_1.png
大陶 回答时间:2017-11-23 10:43:23
啊?我看中文参考手册上面是通道2呢
SPI通道.png
大陶 回答时间:2017-11-23 10:44:08
安 发表于 2017-11-23 10:34
楼主,从手册上看应该用通道4

你看下面我回复的 我看的中文参考手册上面是通道2呢?
废鱼 回答时间:2017-11-23 11:21:28
你的DMA里写的是SPI2,所以我就找的是SPI2的DMA说明。
大陶 回答时间:2017-11-23 11:27:54
安 发表于 2017-11-23 11:21
你的DMA里写的是SPI2,所以我就找的是SPI2的DMA说明。

??我写的SPI1的啊?
大陶 回答时间:2017-11-23 11:28:48
安 发表于 2017-11-23 11:21
你的DMA里写的是SPI2,所以我就找的是SPI2的DMA说明。

哦哦 我看到了 谢谢您 我改一下 看看程序的 谢谢您
大陶 回答时间:2017-11-23 11:44:15
本帖最后由 dataozi 于 2017-11-23 15:15 编辑
安 发表于 2017-11-23 11:21
你的DMA里写的是SPI2,所以我就找的是SPI2的DMA说明。


STM32 W25X16 DMA.zip

下载

2.71 MB, 下载次数: 10, 下载积分: ST金币 -1

废鱼 回答时间:2017-11-23 14:00:17
我估计是串口的问题,你把串口的DMA去掉。我看你用的是串口1的DMA,但是配置的时候又用的串口3,不知道会不会是这引起的。我有没有资源帮忙测试。
大陶 回答时间:2017-11-23 14:41:41
安 发表于 2017-11-23 14:00
我估计是串口的问题,你把串口的DMA去掉。我看你用的是串口1的DMA,但是配置的时候又用的串口3,不知道会不 ...

嗯 嗯 我用的是 串口1的 发送DMA 这个测试过了 是可以的 没有用到串口3的 但是我先把串口这一块 关闭了 试一下
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版