关于STM32的DMA天门中断楚江开DMA_IT_TC是不是地址传输满了才天门中断楚江开?

DMA的传输完成中断疑问??? - STM32 - 意法半导体STM32/STM8技术社区
后使用快捷导航没有帐号?
查看: 331|回复: 7
DMA的传输完成中断疑问???
在线时间23 小时
该用户从未签到主题帖子精华
中级会员, 积分 304, 距离下一级还需 196 积分
本帖最后由 dh2964169 于
20:14 编辑
请问下各位:&&DMA的中断完成标志位问题??
& &&&总体描述: DMA存储来自SPI的500个数据,我检测中断传输完成标志位,然后再到中断服务函数中,打印出这500个数据;
& && & 问题是:是DMA将500个完全缓存到内存中后,然后中断完成标志位置1,再进入中断服务函数,打印出500个数据?还是DMA接收1个数据后,就进入中断函数打印这个数据,然后循环进行直到取满500个数据呢?
程序例子如下:
& && && &while (1)
& && &&&{& && && && && &&&
& && && && && & GPIO_ResetBits(AD_CS_GPIO_PORT,AD_CS_PIN);& && &&&//CS置0& && && && && && &
& && && && && && && && & Delay(5);& && && && && && && && && && && && && && && &&&
& && && && && & SPI_Cmd(AD_SPI, ENABLE);& && && && && && && && && && && && && & //SPI开启& && &&&
& && && && && && && &&&data=SPIx_ReadWriteByte();& && && && && && && && && && &&&//产生16个周期的读取数据
& && && && && & SPI_Cmd(AD_SPI, DISABLE);& && && && && && && && && && && && && &//SPI关闭
& && && && && && &&&Delay(140);& && && && && && && && && && && && && && && && && &
& && && && && & GPIO_SetBits(AD_CS_GPIO_PORT,AD_CS_PIN);& && && & //CS置1
& && && && && && &&&Delay(5);& && && && && && && && && && && && && && && && && && && && && && &
///////////////////////////中断服务函数//////////////////////////////////
& && &&&void DMA1_Stream0_IRQHandler(void)&&
& && & {& && &&&
& && && && && &&&for (j=500;j&1;j--)
& && && && &&&{& && &&&
& && && && && & printf(&%d\n&,ADC_ConvertedValue[j]);
& && && && &&&}
& && && && && &DMA_ClearITPendingBit(DMA1_Stream0,DMA_IT_TCIF0);& && && &//清除完成中断标志位
& &&&程序调试过程中,使能SPI后,再执行&&data=SPIx_ReadWriteByte();&&不管你缓存的数据再多,都马上进入DMA传输完成中断服务函数。所以我疑惑,到底是采集完整个数据后进入中断服务函数,还是采集一个数据就进入中断函数。所以仿真不出来效果。
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
在线时间634 小时
ST金币2270
该用户从未签到主题帖子精华
本帖最后由 黑皮男 于
21:03 编辑
DMA传输是自动触发的,不需要再在代码中显示的提供时钟信号。楼主这个传输过程不对,应该是使能DMA,并使能SPI的DMA传输请求就可以了
在线时间1109 小时
ST金币6700
该用户从未签到主题帖子精华
建议楼主在中断中设立一个标志位就退出,然后在主函数中检测标志位为1时打印500个数据后清标志位。在中断中尽量不要调用子函数,特别是打印这种慢函数。如果你在中断函数中打印500个数据,估计会与下一次中断冲突。
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
在线时间24 小时
该用户从未签到主题帖子精华
建议楼主在中断中设立一个标志位就退出,然后在主函数中检测标志位为1时打印500个数据后清标志位。在中断中 ...
元老同学的编程习惯很好呀....
PS:楼主,为什么不用cubeMx呢?为什么不用cubeMx呢?为什么不用cubeMx呢?
在线时间0 小时
该用户从未签到主题帖子精华
新手上路, 积分 6, 距离下一级还需 44 积分
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
在线时间23 小时
该用户从未签到主题帖子精华
中级会员, 积分 304, 距离下一级还需 196 积分
元老同学的编程习惯很好呀....
PS:楼主,为什么不用cubeMx呢?为什么不用cubeMx呢?为什么不用cubeMx呢? ...
我已经下好了,cubeMx了,只不过还没有去学习呢;难道使用不同的编程方式,这个会不会有所改善呢;
确实呢,不管如何,也要去试试
在线时间23 小时
该用户从未签到主题帖子精华
中级会员, 积分 304, 距离下一级还需 196 积分
DMA传输是自动触发的,不需要再在代码中显示的提供时钟信号。楼主这个传输过程不对,应该是使能DMA,并使能 ...
首先谢谢您的指点啊疑问代码:
& & while (1)
& && &&&{& && && && && &&&
& && && && && & GPIO_ResetBits(AD_CS_GPIO_PORT,AD_CS_PIN);& && && &//CS置0& && && && && && &
& && && && && && && && & Delay(5);& && && && && && && && && && && &&&
& && && && && &
& && && && && & SPI_Cmd(AD_SPI, ENABLE);& && && && && && && && && && && && && & //SPI开启& && &&&
& && && && && && && && && &&&data=SPIx_ReadWriteByte();& && && && && && && && && && &&&//产生16个周期的读取数据
& && && && && & SPI_Cmd(AD_SPI, DISABLE);& && && && && && && && && && && && && &//SPI关闭
& && && && && && &&&Delay(140);& && && && && && && && && && && && && && && && && && && && && & //延时时间稍长,为的是让CS=1前,关闭SPI,否则CS=1与sck有重合
& && && && && & GPIO_SetBits(AD_CS_GPIO_PORT,AD_CS_PIN);& && && && && &&&//CS置1
& && && && && && &&&i--;
& && && && && && &&&Delay(5);& && && && && && && && && && && && && && && && && && && && && && &
& && & 先前也稍稍尝试过,不用data=SPIx_ReadWriteByte(); 但是狗血的是我这款AD7357它需要满足:cs=0,16个周期SCLK,cs=1这个循环的过程,才能有输出数据,不能够将CS拉低后AD一直出数据;所以采用这样的方式,
& && &请问下@黑皮男 ,有没有更好的解决方法呢,谢谢你啦
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
在线时间634 小时
ST金币2270
该用户从未签到主题帖子精华
本帖最后由 黑皮男 于
11:26 编辑
首先谢谢您的指点啊疑问代码:
& & while (1)
& && &&&{& && && && && &&&
这个需要用到定时器了,使用pwm来驱动cs,pwm溢出事件触发dma的数据传输,这个我没试过,理论上是可行的
STM32粉丝勋章Ⅳ
狂欢节专属(智多星)
STM32粉丝勋章Ⅱ
狂欢节专属(研讨会问答)
站长推荐 /2
Tel: 3-8064
备案号: 苏ICP备号-2
|||意法半导体STM32/STM8技术社区
Powered by后使用快捷导航没有帐号?
请完成以下验证码
查看: 3463|回复: 8
有关STM32使用ADC的DMA中断问题
在线时间6 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 32, 距离下一级还需 168 积分
一粒金砂(中级), 积分 32, 距离下一级还需 168 积分
本人需要调试一个AD功能,就是用单通道连续采样4次AD口(PA0)的数据存入DMA中后,产生一次DMA中断。设计思路是:
1)需要采样时利用软件触发AD的方式,将单通道连续采样的数据通过DMA存到对应数组;
2)在DMA中断里关闭AD,直到下一次需要采样时再打开AD。
但实际调试的时后发现,如果 DMA_InitStructure.DMA_Mode 设置成DMA_Mode_Circular,中断会不停产生。但是如果DMA_MODE设置成DMA_Mode_Normal以后,产生一次中断以后就不再产生中断了。请大家帮我看看是什么原因,代码是在stm32自带ADC1_DMA中的例程基础上增加中断控制处理。
ADC_InitTypeDef ADC_InitS
DMA_InitTypeDef DMA_InitS
NVIC_InitTypeDef NVIC_InitS& &
__IO uint16_t ADCConvertedValue[4];
// 配置PA0口为AD口
void ADC1_GPIO_Config(void)
& & & & GPIO_InitTypeDef&&GPIO_InitS&&/* Enable ADC1 and GPIOA clock */
& & & & RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA,ENABLE);
& & & & GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;&&
&&GPIO_Init(GPIOA, &GPIO_InitStructure);
void ADC1_Mode_Config(void)
&&/* DMA1 channel1 configuration ----------------------------------------------*/
&&DMA_DeInit(DMA1_Channel1);
&&DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_A
&&DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADCConvertedV& & & & // (uint32_t)&ADCConvertedV
&&DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
&&DMA_InitStructure.DMA_BufferSize = 4;
&&DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_D
&&DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_E& & & & //DMA_MemoryInc_D
&&DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfW
&&DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfW
&&DMA_InitStructure.DMA_Mode = DMA_Mode_C& && &&&// DMA_Mode_Normal
&&DMA_InitStructure.DMA_Priority = DMA_Priority_H
&&DMA_InitStructure.DMA_M2M = DMA_M2M_D
&&DMA_Init(DMA1_Channel1, &DMA_InitStructure);
&&/* Enable DMA1 channel1 */
&&DMA_Cmd(DMA1_Channel1, ENABLE);
&&/* ADC1 configuration ------------------------------------------------------*/
&&ADC_InitStructure.ADC_Mode = ADC_Mode_I
&&ADC_InitStructure.ADC_ScanConvMode = DISABLE;& & & & //ENABLE;
&&ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
&&ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_N
&&ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_R
&&ADC_InitStructure.ADC_NbrOfChannel = 1;
&&ADC_Init(ADC1, &ADC_InitStructure);
&&/* ADC1 regular channel14 configuration */
&&//ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_55Cycles5);
& & & & ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
&&/* Enable ADC1 DMA */
&&ADC_DMACmd(ADC1, ENABLE);
&&/* Enable ADC1 */
&&ADC_Cmd(ADC1, ENABLE);
&&/* Enable ADC1 reset calibration register */& &
&&ADC_ResetCalibration(ADC1);
&&/* Check the end of ADC1 reset calibration register */
&&while(ADC_GetResetCalibrationStatus(ADC1));
&&/* Start ADC1 calibration */
&&ADC_StartCalibration(ADC1);
&&/* Check the end of ADC1 calibration */
&&while(ADC_GetCalibrationStatus(ADC1));
&&/* Start ADC1 Software Conversion */
&&//ADC_SoftwareStartConvCmd(ADC1, ENABLE);
& & & & & & & & & & & & NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
& & & & & & & & & & & & NVIC_InitStructure.NVIC_IRQChannel=DMA1_Channel1_IRQn;
& & & & & & & & & & & & NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
& & & & & & & & & & & & NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
& & & & & & & & & & & & NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
& & & & & & & & & & & & NVIC_Init(&NVIC_InitStructure);
& & & & & & & & & & & & DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE); //??DMA??????
stm32f10x_it.c里的DMA中断处理:
void DMA1_Channel1_IRQHandler(void)
& & & & if(DMA_GetITStatus(DMA1_IT_TC1) != RESET)
& & & & & & & & //filter();//ADC????
& & & & & & & & ADC_SoftwareStartConvCmd(ADC1, DISABLE);
& & & & & & & & DMA_ClearITPendingBit(DMA1_IT_TC1);
程序里启动ADC和DMA时同时调用了以下函数:
DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
在线时间127 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 16, 距离下一级还需 184 积分
一粒金砂(中级), 积分 16, 距离下一级还需 184 积分
用单次,然后用一个全局计数器,4次后再清零试试看
这种方法也可以,但是我要弄明白是哪里设置错了,并不要避开这个问题。&
在线时间127 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 16, 距离下一级还需 184 积分
一粒金砂(中级), 积分 16, 距离下一级还需 184 积分
还有种办法,设立一个长的缓冲区,比如1024,然后4次一下分别读取值
这种方法可以用CIRCULAR
&&&&&&&&&&
在线时间6 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 32, 距离下一级还需 168 积分
一粒金砂(中级), 积分 32, 距离下一级还需 168 积分
用单次,然后用一个全局计数器,4次后再清零试试看
这种方法也可以,但是我要弄明白是哪里设置错了,并不要避开这个问题。
在线时间6 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 32, 距离下一级还需 168 积分
一粒金砂(中级), 积分 32, 距离下一级还需 168 积分
找到问题了,在DMA传输完4次数据以后,如果需要重新采样到DMA,需要对DMA_CNDTRx重新赋值。查了一下手册对于这个寄存器的相关操作: “这个寄存器只能在通道不工作(DMA_CCRx的EN=0)时写入。”,于是翻查了一下函数库里的相关函数,在重新启动AD前调用下面的函数就可以了。
DMA_Cmd(DMA1_Channel1, DISABLE);
DMA_SetCurrDataCounter(DMA1_Channel1, 4);
DMA_Cmd(DMA1_Channel1, ENABLE);
测试了一下,DMA设置成DMA_Mode_Normal模式工作正常,可以防止数据覆盖。
在线时间1521 小时
威望6458分
芯币23371枚
E金币400枚
TA的帖子TA的资源
连续AD转换,连续dma,当dam传输完一半时处理数据。
在线时间1529 小时
威望6386分
芯币4194枚
E金币240枚
TA的帖子TA的资源
五彩晶圆(高级), 积分 6386, 距离下一级还需 3614 积分
五彩晶圆(高级), 积分 6386, 距离下一级还需 3614 积分
好像没有看到使能DMA的时钟总线哦,要看看DMA挂在哪个总线下面哦。。。。。
看得真仔细!是的,上面代码忘记写了,后面软件调试时也查到了这个问题,已纠正&
在线时间6 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 32, 距离下一级还需 168 积分
一粒金砂(中级), 积分 32, 距离下一级还需 168 积分
好像没有看到使能DMA的时钟总线哦,要看看DMA挂在哪个总线下面哦。。。。。
看得真仔细!是的,上面代码忘记写了,后面软件调试时也查到了这个问题,已纠正
基本要对所有的外设,都有相似或者相同的写法。所以一眼就能看出你的问题啦。&
在线时间1529 小时
威望6386分
芯币4194枚
E金币240枚
TA的帖子TA的资源
五彩晶圆(高级), 积分 6386, 距离下一级还需 3614 积分
五彩晶圆(高级), 积分 6386, 距离下一级还需 3614 积分
看得真仔细!是的,上面代码忘记写了,后面软件调试时也查到了这个问题,已纠正
基本要对所有的外设,都有相似或者相同的写法。所以一眼就能看出你的问题啦。
论坛测评队员
EEWORLD 官方微信
Powered by您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
STM32使用DMA加串口空闲中断接收数据.doc 7页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
你可能关注的文档:
··········
··········
STM32使用DMA加串口空闲中断接收数据
STM32中,需要用串口接收数据,是使用串口中断来接收数据。但是用这种方法的话,就要频繁进入串口中断,然后处理,效率就比较低。于是就想到用DMA来接收串口数据,这个STM32也是支持的。但是关键的一点,怎么知道数据接收完毕了呢?如果接收的数据长度固定,那就好办,直接设置DMA的接收数据个数就行了。但是如果长度不固定了,那应该怎么办了?
?????????这个时候,就要用到STM32在串口中提供的另一个好用的东西了,就是串口空闲中断。在STM32的串口控制器中,设置了有串口空闲中断,即如果串口空闲,又开启了串口空闲中断的话,就触发串口空闲中断,然后程序就会跳到串口中断去执行。有了这个,是不是可以判断什么时候串口数据接收完毕了呢?因为串口数据接收完毕后,串口总线肯定是会空闲的嘛,那这个中断肯定是会触发的了。
?????????还有一个问题,这串口空闲中断是只要串口空闲就会产生吗?其实不是的,串口空闲中断要触发的话,是要RXNE位被置位后,串口总线空闲才会触发的。所以我们不用担心,串口数据发送完毕后,会不会触发串口空闲中断了。
?????????下面用代码来说明。
1、??配置串口。包括设置串口的引脚配置,串口的配置,串口中断的配置,串口的接收DMA的配置
void USART_init(void)
GPIO_InitTypeDef
GPIO_InitS
USART_InitTypeDef
USART_InitS
NVIC_InitTypeDef
NVIC_InitS
//开启时钟
RCC_APB2PeriphClockCmd(USART_RCC,ENABLE);
//配置TX端口
GPIO_InitStructure.GPIO_Pin = GPIO_USART_TX;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIO_USART_TYPE,&GPIO_InitStructure);
//配置RX端口
GPIO_InitStructure.GPIO_Pin = GPIO_USART_RX;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIO_USART_TYPE,&GPIO_InitStructure);
//配置串口模式
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_N
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1,&USART_InitStructure);
//中断配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* 若总线空闲,产生中断 */
USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);
正在加载中,请稍后...
42页13页37页30页11页12页42页19页19页12页查看: 16085|回复: 14
DMA传输完成中断无法进入
主题帖子精华
初级会员, 积分 62, 距离下一级还需 138 积分
在线时间1 小时
&&&&& 兄弟通过DMA传送ADC的采样数据到了一个数组ADC_BUF[], 现在想进入DMA传送完成中断,在中断中把ADC_BUF[]中的数据读出来处理。但是不知道为啥,只要使能DMA传输完成中断,即:&DMA_CHx-&CCR|=1&&1;& //允许传输完成中断&& ,就出现死机的问题。&
&&&&&&在原正常程序中只增加以下语句,其他地方都没有变化;
1、DMA初始化程序中,增加
&& &DMA_CHx-&CCR|=1&&1;& //允许传输完成中断&&
&&& MY_NVIC_Init(1,2,DMA1_Channel1_IRQChannel,2);&&&
2、增加DMA中断服务程序:
void DMA1_Channel1_IRQHandler(void)
&if((DMA1-&ISR)&(1&&1))&&&&&&& //判断传输完成中断位是否置位
& DMA1-&IFCR |= 1&&1 ; //清除完成传输中断
& LED0=!LED0;
使能DMA中断后,出现的问题:
1、无法进入其他中断,如定时器4的中断,定时器4的中断初始化:&&& MY_NVIC_Init(1,1,TIM4_IRQChannel,2);//抢占1,子优先级1,组2&&&&&
2、通过硬件仿真,发现没有进入&DMA1_Channel1_IRQHandler,一次都没有;
3、每次停止硬件仿真,就停留在下面这个地方:
37aae15e05cb9d334aee_190.bmp (0 Bytes, 下载次数: 0)
22:54 上传
看了以下坛里相关的帖子,
void DMA1_Channel1_IRQHandler(void);&&&&&& 在stm32f10x_it.h 中有定义;
DMA1_Channel1_IRQChannel&&&& 在 stm32f10x_nvic.H 中有定义:#define DMA1_Channel1_IRQChannel&&&& ((u8)0x0B)& /* DMA1 Channel 1 global Interrupt */
为什么允许DMA中断会导致无法进入其他中断的问题,而且,DMA中断也无法进入? 各位兄弟请多指教,谢谢!
主题帖子精华
金钱125990
在线时间1075 小时
我测试了下我们的战舰板DMA例程,没问题。
你看看你是不是通道数搞错了?
14:20 上传
点击文件名下载附件
137.76 KB, 下载次数: 3302
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
初级会员, 积分 62, 距离下一级还需 138 积分
在线时间1 小时
DMA配置如下:
void&DMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32&masteraddr,u32&slaveaddr,u16&number)&
{&
RCC-&AHBENR|=1&&0;//开启DMA1时钟&
delay_ms(5);
DMA_CHx-&CPAR=(u32)&&&&//DMA1&外设地址&ADC1_DR_Address&
DMA_CHx-&CMAR=(u32)&&&//DMA1,ADC&存储器地址&
DMA_CHx-&CNDTR=&number&;&&//DMA1,传输数据量&
DMA_CHx-&CCR=0X;//复位&
DMA_CHx-&CCR|=1&&7;&&//存储器增量模式&
DMA_CHx-&CCR|=1&&8;&&//外设数据宽度为16位&
DMA_CHx-&CCR|=1&&10;&//存储器数据宽度16位&
DMA_CHx-&CCR|=2&&12;&//高优先级&
DMA_CHx-&CCR|=1&&5;&&//循环模式&
DMA_CHx-&CCR|=1&&1;&&//允许传输完成中断 &&
MY_NVIC_Init(3,2,DMA1_Channel1_IRQChannel,2);&&&&&
}&
主程序中调用:
DMA_Config(DMA1_Channel1,(u32)&ADC_Buf,(u32)&ADC1-&DR,sizeof(ADC_Buf));&&&//DMA1通道配置
注释掉: DMA_CHx-&CCR|=1&&1;&&//允许传输完成中断&&&&&&就没有问题,可以正常传送采样数据,但是使能这个中断,就出问题,郁闷了,硬件仿真看,寄存器中的中断使能都有了&啊
主题帖子精华
初级会员, 积分 62, 距离下一级还需 138 积分
在线时间1 小时
照着原子哥的程序,把MINI版也做成 中断, 但还是没有办法进中断,啥原因,各位大侠指教,谢谢!
23:55 上传
点击文件名下载附件
524.54 KB, 下载次数: 948
主题帖子精华
金钱125990
在线时间1075 小时
回复【4楼】junjunyu:
---------------------------------
检查中断名字是否和.s文件里面的一致!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
初级会员, 积分 62, 距离下一级还需 138 积分
在线时间1 小时
问题解决了,确实和.s文件里面的中断名不一致,这个老帖子说过,没注意是.S文件。搜了一下,.h文件中有相同声明
就觉得是一致的,再提醒一下像我这样的新手,是.S文件,我这里.S是:DMAChannel1_IRQHandler,&不要用void&DMA1_Channel1_IRQHandler(void)。
感谢原子提醒,谢谢!&
主题帖子精华
新手入门, 积分 22, 距离下一级还需 -2 积分
在线时间0 小时
回复【5楼】正点原子:
---------------------------------
请问,我的程序也出现了相同的原因,DMA传送进不了中断,我检查了我的启动文件.s和中断函数名,启动文件里是DMA1_Channel6_IRQHandler,中断函数名用的是void&DMA1_Channel6_IRQHandler(void),但是还是进不了中断,不知道是什么原因呢?
主题帖子精华
金钱125990
在线时间1075 小时
回复【7楼】alyssala:
---------------------------------
那就是你中断配置有问题了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
初级会员, 积分 130, 距离下一级还需 70 积分
在线时间0 小时
回复【8楼】正点原子:
---------------------------------
原子哥,我这问题一样,也是不了DMA中断。.s文件查过了,一样;DMA初始化也没有&&&DMA_CHx-&CCR|=1&&1;&&//允许传输完成中断&&;程序如下。
void&&MYADC_Init(void)
{&&&&
RCC-&APB2ENR|=1&&9;&&&& //&ADC1时钟使能
__nop();
&&&&__nop();& &&
RCC-&APB2RSTR|=1&&9;&&& //&ADC1复位
RCC-&APB2RSTR&=~(1&&9); //&复位结束 &&&&
RCC-&CFGR|=2&&14;
//&72M/6=12M
ADC1-&CR2=0x; //&[1]=0,单次转换模式;[8]=1,允许DMA访问;[11]=0,右对齐;[19:17]=3,TIM2_CC2触发,[20]=1,使用外部触发
ADC1-&SQR1=0;&&&&&
//&规则通道中只有一个转换,
ADC1-&SQR3=0;
//&是通道0,&ADC_CH0;
ADC1-&SMPR2=0;
//&采样时间1.5周期,&(1.5+12.5)*1/12=1.17uS
ADC1-&CR2|=1&&0; &&&&//&开启AD转换器 &
ADC1-&CR2|=1&&3;&&&&&&&&//&使能复位校准&&
while(ADC1-&CR2&1&&3);&&//&等待校准结束&
while(ADC1-&CR2&1&&2);&&//&等待校准结束
ADC1-&CR2&=~(1&&0); &&&&//&禁用AD
MYDMA_Init();
//&DMA1_Channel1
}
void&MYDMA_Init(void)
{
& RCC-&AHBENR|=1&&0;
//&开启DMA1时钟
& __nop();
__nop();
& DMA1_Channel1-&CPAR=(u32)(&(ADC1-&DR));&&
//&DMA1&外设地址&
DMA1_Channel1-&CMAR=(u32)ADC;
//&DMA1,存储器地址
DMA1_MEM_LEN=(u32)sizeof(ADC);
DMA1_Channel1-&CNDTR=DMA1_MEM_LEN;
//&DMA1,传输数据量
DMA1_Channel1-&CCR=0x;
//&[0]=1,通道开启;&[1]TCIE=1,允许传输完成中断;[4]=0,从外设读取数据;[5]=0,普通模式,单次模式;[6]=0,外设地址非增量模式;[7]=1,存储器增量模式;[9:8]=1,[11,10]=1,外设及存储器数据宽度为16位;[13:12]=2,通道高优先级;[14]=0,非存储器到存储器模式
MY_NVIC_Init(2,2,DMA1_Channel1_IRQChannel,2); //&抢占2,子优先级2,组2&
}
//开启一次DMA传输
void&DMA_Once(void)
{
DMA1_Channel1-&CCR&=~(1&&0);&&&&&&&
//&关闭DMA传输,&否则不能修改CNDTR&
DMA1_Channel1-&CNDTR=DMA1_MEM_LEN;&
//&DMA1,传输数据量&
DMA1_Channel1-&CCR|=1&&0;&&&&&&&&&&
//&开启DMA传输
}
void&DMA1_Channel1_IRQHandler&&(void)
&//DMA1_Channel1_IRQHandler
{
&&&&nbspBout(8)=1;//标记没有执行到这里
usart_2_usb_send();
Finish_Flag=1;
DMA1-&IFCR|=0x0F;&&
//&清DMA中断标志
}
PB8是标记位,经检测,DMA中断进入不了,求解答。
主题帖子精华
金钱125990
在线时间1075 小时
你确定DMA已经在运行了么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
初级会员, 积分 152, 距离下一级还需 48 积分
在线时间19 小时
不知道楼上诸位怎么解决这个问题的,我也遇到了
主题帖子精华
初级会员, 积分 121, 距离下一级还需 79 积分
在线时间11 小时
回复【9楼】BULELJ:
---------------------------------
MY_NVIC_Init(2,2,DMA1_Channel1_IRQChannel,2); //&抢占2,子优先级2,组2&这一句是不是有问题,DMA1_Channel1_IRQChannel应该是DMA1_Channel2_IRQn
固步自封于FLASH,只能机械性的运作,人应像翱翔天际的雄鹰,装载高速变化的CPU及强大的存储能力,摆脱老旧的结构束缚,翱翔在智能化信息的海洋。
主题帖子精华
初级会员, 积分 121, 距离下一级还需 79 积分
在线时间11 小时
回复【9楼】BULELJ:
---------------------------------
或者是DMA1_Channel1-&CCR中的TCIE位没置1使能
固步自封于FLASH,只能机械性的运作,人应像翱翔天际的雄鹰,装载高速变化的CPU及强大的存储能力,摆脱老旧的结构束缚,翱翔在智能化信息的海洋。
主题帖子精华
新手入门, 积分 37, 距离下一级还需 -17 积分
在线时间11 小时
太给力了,竟然也遇到了同样的问题,
主题帖子精华
初级会员, 积分 77, 距离下一级还需 123 积分
在线时间14 小时
我测试了下我们的战舰板DMA例程,没问题。
你看看你是不是通道数搞错了?
DMA试验-中断版本,有没有寄存器版本的, 如果有,麻烦发我邮箱一份
Powered by

我要回帖

更多关于 系统中断 的文章

 

随机推荐