stm32f407vgt6 是芯片的BUG吗

STM32F407VG_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
您可以上传图片描述问题
联系电话:
请填写真实有效的信息,以便工作人员联系您,我们为您严格保密。
STM32F407VG
||暂无简介
北京龙源网通电子商务有限公司|
总评分0.0|
试读已结束,如果需要继续阅读,敬请购买
注:购买后,该文档仅支持在线阅读
你可能喜欢是芯片的BUG吗?DMA启动后暂停 在打开而出现的数据错误 - 其他 - 意法半导体STM32/STM8技术社区
后使用快捷导航没有帐号?
查看: 2226|回复: 16
是芯片的BUG吗?DMA启动后暂停 在打开而出现的数据错误
主题帖子积分
新手上路, 积分 29, 距离下一级还需 21 积分
新手上路, 积分 29, 距离下一级还需 21 积分
在使用STM32F407的DMA向外设SPI2发送数据时
使能DMA的半传输 与 传输完成中断
但是当DMA进入中断处理函数后
TCIF HTIF 都被置位
中断进入后发现SXNDTI内的值位8(DMA需要发送的数据个数为16) 在中断中关闭DMA 在半传输的 判断语句中再将DMA打开
结果 中断退出后 很短时间内DMA的FEIF
TCIF HTIF 会再次被置位
//配置SPI2 DMA传输
//配置SPI2 DMA传输
void DMA_SPI_Configuration(void)
& & & & & & & & & & & & DMA_InitTypeDef
& & & & & & & & & & & & SPI_InitTypeDef
& & & & & & & & & & & & GPIO_InitTypeDef GPIO_InitS
& & & & & & & & & & & & NVIC_InitTypeDef NVIC_InitS
& & & &&& RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_DMA1,ENABLE); //使能GPIOA的AHB1时钟RCC_APB2Periph_AFIO|
& & & &&& RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
& & & &&&GPIO_PinAFConfig(GPIO_PORT_KKPJ_SPIX,GPIO_PinSource13, GPIO_AF_SPI2);
GPIO_PinAFConfig( GPIO_PORT_KKPJ_SPIX ,GPIO_PinSource14, GPIO_AF_SPI2);
GPIO_PinAFConfig( GPIO_PORT_KKPJ_SPIX ,GPIO_PinSource15, GPIO_AF_SPI2);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd
= GPIO_PuPd_DOWN;
GPIO_Init(GPIO_PORT_XJ128_SPIX, &GPIO_InitStructure);
& & & & & & & & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
& & & & & & & & GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
& & & & & & & & GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
& & & & & & & & GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
& & & & & & & & GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
& & & & & & & & GPIO_Init(GPIOB, &GPIO_InitStructure);
//设置SPI1 SPI2
& & & & & & & & & & & & & & & & & & & &&&SPI_I2S_DeInit(SPI2);
& & & & & & & & & & & &&& & & & & SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullD//;SPI_Direction_1Line_Tx // SPI设置为双线双向全双工 ;
& & & & & & & & & & & &&& & & & & SPI_InitStructure.SPI_Mode = SPI_Mode_M // 设置为主SPI ;
& & & & & & & & & & & &&& & & & & SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // SPI发送接收8位帧结构 ;
& & & & & & & & & & & &&& & & & & SPI_InitStructure.SPI_CPOL = SPI_CPOL_H& & & & // Low时钟悬空低 ;
& & & & & & & & & & & &&& & & & & SPI_InitStructure.SPI_CPHA = SPI_CPHA_2E // 数据捕获于第二个时钟沿 ;
& & & & & & & & & & & &&& & & & & SPI_InitStructure.SPI_NSS = SPI_NSS_S
// 内部NSS信号有SSI位控制 ;
& & & & & & & & & & & &&& & & & & SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64; // 波特率预分频值为4 ;
& & & & & & & & & & & &&& & & & & SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
// 数据传输从MSB位开始 ;
& & & & & & & & & & & &&& & & & & SPI_InitStructure.SPI_CRCPolynomial = 7;
// 定义了用于CRC值计算的多项式 7。
& & & & & & & & & & & &&& & & & & SPI_Init(SPI2, &SPI_InitStructure); // 初始化外设SPI1寄存器 ;
DMA_InitStructure.DMA_Channel = DMA_Channel_0;
//DMA通道4 RM0090手册-&gt165
& & & & & & & & & & & & & & & & & & & & DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&(SPI2-&DR));
//外设地址
& & & & & & & & & & & & & & & & & & & & DMA_InitStructure.DMA_Memory0BaseAddr = (u32)SPI1_Buffer_Tx;
//内存地址
& & & & & & & & & & & & & & & & & & & & DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToP
//传输方向
& & & & & & & & & & & & & & & & & & & & DMA_InitStructure.DMA_BufferSize = 0;
//设置DMA传输时缓冲区大小
& & & & & & & & & & & & & & & & & & & & DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_D
//设置DAM外设地址递增模式,因为目前就一个外设,故此处设置为禁止
& & & & & & & & & & & & & & & & & & & & DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_E
//内存地址递增
& & & & & & & & & & & & & & & & & & & & DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_B
//8位数据位宽度
& & & & & & & & & & & & & & & & & & & & DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_B
& & & & & & & & & & & & & & & & & & & & DMA_InitStructure.DMA_Mode = DMA_Mode_N
//DMA_Mode_C
//这里必须设置为这个模式
& & & & & & & & & & & & & & & & & & & & DMA_InitStructure.DMA_Priority = DMA_Priority_H
//DMA_Priority_VeryH
//DMA_Priority_H
//设置优先级
& & & & & & & & & & & & & & & & & & & & DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_D
//DMA_FIFOMode_D
& & & & & & & & & & & & & & & & & & & & DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_F
& & & & & & & & & & & & & & & & & & & & DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_S
& & & & & & & & & & & & & & & & & & & & DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_S
& & & & & & & & & & & & & & & & & & & & DMA_Init(DMA1_Stream4, &DMA_InitStructure);
& & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & &&&//Enable DMA2 Channel3 Tx Interrupt
& & & & & & & & & & & & & & & & NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;
& & & & & & & & & & & & & & & & NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
//抢占优先级设置,值越大,表示优先级越低
& & & & & & & & & & & & & & & & NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
//响应优先级设置,值越大,表示优先级越低
& & & & & & & & & & & & & & & & NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
& & & & & & & & & & & & & & & & NVIC_Init(&NVIC_InitStructure);
DMA_ClearFlag(DMA1_Stream4,DMA_FLAG_HTIF4);& & & & //清除数据传输一半中断标志DMA_FLAG_HTIF3
& & & & & & & & & & & & & & & & DMA_ClearFlag(DMA1_Stream4,DMA_FLAG_TCIF4);//清除数据传输完成中断标志& & & &
& & & & & & & & & & & & & & & & DMA_ITConfig(DMA1_Stream4,DMA_IT_TC | DMA_IT_HT,ENABLE);
& & & & & & & &&&& & & & & & & &&&//使能 SPI2 DMA传输
& & & & & & & & & & & & & & & & SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);
DMA1_Stream4_IRQHandler(void)
{& & & &&& u16 ty=3;& & & &&&& & & &
DMA1_Stream4 -&CR &= 0xFFFFFFFE; //除能DMA1_Stream3
while( DMA1_Stream4 -&CR & 0x);//确保DMA可以被设置& & & &&&& & & &
//等待 SPI 数据寄存器空& & & &&&
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
& & & &&&SPI_Cmd(SPI2, DISABLE);
& & & & & & & & //若数据传输一半
& & & & & & & & & & & & if(DMA_GetFlagStatus( DMA1_Stream4 ,DMA_FLAG_HTIF4))
& & & & & & & & & & & & & & & &
& & & & & & & & & & & &&&{
& & & & & & & & & & & & & & & & DMA_ClearFlag(KKHG_DMA_Stream,DMA_FLAG_HTIF4);
& & & & & & & & & & & & & & & & SPI_Cmd(SPI2, ENABLE);
& & & & & & & & & & & & & & & &&&DMA1_Stream4 -&CR |= (uint32_t)DMA_SxCR_EN;//打开DMA的数据传输& & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & &&&}& & & &
& & & & & & & & & & & & if(DMA_GetFlagStatus( DMA1_Stream4 ,DMA_FLAG_TCIF4))
& & & & & & & & //若数据传输完成
数据传输完成后要关闭DMA传输
若想再一次使用DMA传输就必须 重新写入传输数目
& & & & & & & & & & & &&&{& & & & & & & & & & & &
& & & & & & & & & & & & & & & & DMA_ClearFlag( DMA1_Stream4 ,DMA_FLAG_TCIF4);
& & & & & & & & & & & &&&}& & & &
反复搞了几天 实在没辙了
还请 大侠看下
主题帖子积分
新手上路, 积分 29, 距离下一级还需 21 积分
新手上路, 积分 29, 距离下一级还需 21 积分
RE:STM32F407
是芯片的BUG吗?DMA启动后暂停 在打开而出现的数据错误
补充下: 若在中断进入时不关闭DMA&&那么数据的发送时正常的
主题帖子积分
金牌会员, 积分 2137, 距离下一级还需 863 积分
金牌会员, 积分 2137, 距离下一级还需 863 积分
RE:STM32F407
是芯片的BUG吗?DMA启动后暂停 在打开而出现的数据错误
dma传输未完就关闭,再打开dma要重新告诉dma要传送哪个数据。
主题帖子积分
新手上路, 积分 29, 距离下一级还需 21 积分
新手上路, 积分 29, 距离下一级还需 21 积分
回复:STM32F407
是芯片的BUG吗?DMA启动后暂停 在打开而出现的数据错误
非常感谢 您的回复
F103 使用半传输中断是不需要重新赋值的 当在半传输中断中再将DMA打开数据会自动继续传输
您的意思是在半传输中断中再次对外设 与 内存地址重新赋值吗? 这样感觉半传输中断就没有意义了
在DMA传输中断中 查询
但是得到的结果是 只有全部数据传输完毕后 读EN位 才会为0
主题帖子积分
RE:STM32F407
是芯片的BUG吗?DMA启动后暂停 在打开而出现的数据错误
为了解决你这个问题,我上网搜了一下相关的问题,发现出现你这种类似的问题的人还真不少,难道真像你说的是BUG?你现在解决了吗,记得分享一下
主题帖子积分
新手上路, 积分 29, 距离下一级还需 21 积分
新手上路, 积分 29, 距离下一级还需 21 积分
回复:STM32F407
是芯片的BUG吗?DMA启动后暂停 在打开而出现的数据错误
不过找到了折中的办法
还没有验证他的准确性
要传输16字节数据
那么只开启传输完成中断
每次传输个数为8
这样在DMA中断中给DMA后8个数据的地址 然后在进行传输
半传输也可以进入
只是不能暂停
找到好的办法再来发布
主题帖子积分
高级会员, 积分 554, 距离下一级还需 446 积分
高级会员, 积分 554, 距离下一级还需 446 积分
RE:STM32F407
是芯片的BUG吗?DMA启动后暂停 在打开而出现的数据错误
能设置中断逐步检查吗
主题帖子积分
新手上路, 积分 29, 距离下一级还需 21 积分
新手上路, 积分 29, 距离下一级还需 21 积分
RE:STM32F407
是芯片的BUG吗?DMA启动后暂停 在打开而出现的数据错误
能进入版半中断 但在半中断不能暂停DMA
在半中断中不能关闭DMA&&手册中说 只有DMA传输完毕&&写EN 位 才会有效
主题帖子积分
高级会员, 积分 939, 距离下一级还需 61 积分
高级会员, 积分 939, 距离下一级还需 61 积分
RE:STM32F407
是芯片的BUG吗?DMA启动后暂停 在打开而出现的数据错误
那你想怎么改, 总要等中断看看的呀
主题帖子积分
新手上路, 积分 29, 距离下一级还需 21 积分
新手上路, 积分 29, 距离下一级还需 21 积分
回复:STM32F407
是芯片的BUG吗?DMA启动后暂停 在打开而出现的数据错误
大家有没有实际验证过
我没有实现
使用示波器 来查看程序的执行情况
(不要使用串口打印的方式 --太占用时间
) 进入半中断后
在保证数据完整传输的情况下 都没有得到正确的结果
若是DMA 不停止 那么没有问题 可以非常流畅的进入中断
好似 407 的DMA 在传输中就不能被打断吧!!!!
看手册说是 只有数据传输完毕 DMA 才会被允许设置 (EN位)
Tel: 3-8056
备案号: 苏ICP备号-2
Powered bystm32f407 中文是ARM几啊_百度知道
stm32f407 中文是ARM几啊
stm32f407 是ARM Cortex M4
stm32F407是Cortex-M4系列,中端R。现在智能机一般都用的是A系列。更多关于ARM体系的内容请参考《ARM Cortex M3权威指南》中对ARM发展历程的介绍:小米手机用的就是高通的Cortex-A8,高端A系列这是ARM11后的后续版本。同时在这纠正一下楼上的回答,Cortex系列,比如,Cortex系列又分为低端M,你说的那款属于Cortex-M低端系列,不是Cortex-M3系列
其他类似问题
为您推荐:
其他3条回答
不是ARM几。是 ARM Cortex M4系列,用来取代单片机和ARM7的。
ARM几不重要,重要的是性能是否满足你的需要。
官网说是cortex-m4
arm的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁查看: 3378|回复: 3
绝对牛X 的问题,关于STM32F407的那些事,一般人我不告诉他!
主题帖子精华
新手上路, 积分 33, 距离下一级还需 17 积分
在线时间0 小时
..\USER\stm32f4xx.h(89): warning: &#47-D: incompatible redefinition of macro "STM32F40_41xxx"
查不出原因 用的是MDK 5.11&
原子的设置与我的 基本一样,但是没用他们的 模板!魔法棒 里 设置 也是一样的!用的是原子STM32F407ZG 的板子
都是说重定义,问题,但是
有人说STM32F40XX,USE_STDPERIPH_DRIVER,__FPU_USED & &可能有的版本没问题,有的无问题,但是我的有问题,
STM32F40_41xxx,USE_STDPERIPH_DRIVER,__FPU_USED
都不行,都报错,还有我想知道为什么,而不是把这个警告去了!
有人用MDK5.12 编译提示少 两个文件,这两个文件可能是在MDK5.11A 中内部集成了!而在MDK 5.12A 中 可能没集成 &Core_cmFunc.h&和 Core_cmInstr.h 我没用5.12试过,
有人说MDK5.12 包含 这两个文件就好了,可是,为什么呢?
现在问题是 ,两个里面的内容都是相互复制的,都是一样的设置,但是一个有警告 ,一个没警告,为什么呢?除名字不一样外,其他都一个,同一个开发环境MDK5.11A!!
请牛人 看看
17:10 上传
点击文件名下载附件
543.2 KB, 下载次数: 49
17:10 上传
点击文件名下载附件
538.94 KB, 下载次数: 40
回复【2楼】Tenux开源嵌入式操作系统社区:
---------------------------------
又用楼主使用的MDK&5.11编译了,确实youjinggao.zip那个有警告,wujinggao.zip那个无警告。
原因在于youjinggao.zip的工程中,在Target那个Sheet中,多了一个STM32F40xx的符号定义。
修改方法:只要在Target设置中,先更换一下其他芯片,再更换回来,这个符号就自动去掉了,结果就好了。
!@如果觉得我很牛,欢迎使用商业级质量的开源嵌入式操 ...
主题帖子精华
新手上路, 积分 22, 距离下一级还需 28 积分
在线时间0 小时
回复【2楼】Tenux开源嵌入式操作系统社区:
---------------------------------
又用楼主使用的MDK&5.11编译了,确实youjinggao.zip那个有警告,wujinggao.zip那个无警告。
原因在于youjinggao.zip的工程中,在Target那个Sheet中,多了一个STM32F40xx的符号定义。
修改方法:只要在Target设置中,先更换一下其他芯片,再更换回来,这个符号就自动去掉了,结果就好了。
!@如果觉得我很牛,欢迎使用商业级质量的开源嵌入式操作系统内核-uTOS,支持12个厂商的ARM7、9、Cortex&M0、3、4内核芯片,采用GIT方式开放开发,
官网:www.tenux.org
主题帖子精华
新手上路, 积分 22, 距离下一级还需 28 积分
在线时间0 小时
首先在MDK 5.10编译楼上的两个帖子,都有一样的警告信息,不存在那个有警告,那个没有警告的现象。
另外,查看了一下工程,警告产生的原因找到了,说明如下:
1、KEIL会根据在Device&sheet中选择的芯片产生一个芯片系列的定义符号,现在的定义符号就是STM32F40XX,
& &从工程Option的Compiler Control String文本框中可以看到,如果更换其他芯片系列,可以观察到这个符号定义就会发生变化。
2、不需要自己再定义STM32F40_41xxx符号,因为在stm32f4xx.h中已经有一下的语句:
& & &#ifdef STM32F40XX
& & #define STM32F40_41xxx
& & &#endif /* STM32F40XX */
3、最后,产生警告的原因就是因为在KEIL中定义了STM32F40_41xxx
& & &符号,而stm32f4xx.h又有定义,所以,出现警告。
& & &解决方法是删除KEIL中的STM32F40_41xxx符号定义。
主题帖子精华
中级会员, 积分 258, 距离下一级还需 242 积分
在线时间14 小时
回复【3楼】Tenux开源嵌入式操作系统社区:
---------------------------------
果然是大神(我也是遇到这个问题,只不过我是在2个版本上跑同一个文件,1个是4.72,1个是5.11)
电子爱好者
Powered by

我要回帖

更多关于 stm32f407固件库手册 的文章

 

随机推荐