专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
DMA的中断
2019-08-13 20:33
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
12678
13
1516
本帖最后由 Bunny17 于 2017-10-10 11:21 编辑
每次进入中断函数,关闭中断使能,判断是否为我们需要的中断标志,做相应的操作,然后清除标志,重新使能中断,然后不做任何操作,退出中断函数后,DMA是否继续在传输呢,还是需要在中断里面又重新配置一次,开始DMA.
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
Bunny17
1楼-- · 2019-08-14 22:54
wxjhby 发表于 2017-10-10 11:11
写0还是写1?
写1是对的。
加载中...
Bunny17
2楼-- · 2019-08-15 00:49
我试了一下,是需要重新开启DMA的,但是如果我只是重新开始DMA,通过串口显示,一直都是一样的数据,难道我的ADC没有重新采样吗,我的ADC也是设置的连续转换模式啊。
while(DMAx->LISR&0X20)
{
LED0=!LED0;
DMAx->LIFCR |= 1<<5; //清除传输完成中断标志
}
Adc_Init();
MYDMA_Enable(DMA2_Stream0,512);
我的程序必须这样才可以连续采集,连续传输,通过串口显示就是正确的不重复的数据。
如果我将Adc_Init(); 改成仅仅
ADC1->CR2|=1<<0; //开启AD转换器 使能ADC
ADC1->CR2|=1<<30; //启动规则转换通道
这两行就不可以。
加载中...
wxjhby
3楼-- · 2019-08-15 02:49
本帖最后由 wxjhby 于 2017-10-10 12:01 编辑
DMA是循环模式,AD是连续采样的还不行就只能跟着寄存器慢慢调了 看是不是哪里漏了
加载中...
Bunny17
4楼-- · 2019-08-15 03:03
精彩回答 2 元偷偷看……
加载中...
Bunny17
5楼-- · 2019-08-15 05:48
本帖最后由 Bunny17 于 2017-10-12 11:56 编辑
void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u8 chx,u32 par,u32 mar,u16 ndtr)
{
DMA_TypeDef *DMAx;
u8 streamx;
if((u32)DMA_Streamx>(u32)DMA2)//得到当前stream是属于DMA2还是DMA1
{
DMAx=DMA2;
RCC->AHB1ENR|=1<<22;//DMA2时钟使能
}else
{
DMAx=DMA1;
RCC->AHB1ENR|=1<<21;//DMA1时钟使能
}
while(DMA_Streamx->CR&0X01);//等待DMA可配置 开发指南寄存器版本P226
streamx=(((u32)DMA_Streamx-(u32)DMAx)-0X10)/0X18; //得到stream通道号
if(streamx>=6)DMAx->HIFCR|=0X3D<<(6*(streamx-6)+16); //清空之前该stream上的所有中断标志
else if(streamx>=4)DMAx->HIFCR|=0X3D<<6*(streamx-4); //清空之前该stream上的所有中断标志
else if(streamx>=2)DMAx->LIFCR|=0X3D<<(6*(streamx-2)+16);//清空之前该stream上的所有中断标志
else DMAx->LIFCR|=0X3D<<6*streamx; //清空之前该stream上的所有中断标志
DMA_Streamx->PAR=par; //DMA外设地址
DMA_Streamx->M0AR=mar; //DMA 存储器0地址
DMA_Streamx->NDTR=ndtr; //数据传输量
DMA_Streamx->CR=0; //先全部复位CR寄存器值
DMA_Streamx->CR|=0<<6; //存储器到外设模式 改为外设到存储器
DMA_Streamx->CR|=1<<8; //非循环模式(即使用普通模式) 改为使能循环模式
DMA_Streamx->CR|=0<<9; //外设非增量模式
DMA_Streamx->CR|=1<<10; //存储器增量模式
DMA_Streamx->CR|=1<<11; //外设数据长度:8位 改为16位,因为ADC为12位
DMA_Streamx->CR|=0<<13; //存储器数据长度:8位 改为16位2017.08.03 又改回去改为8位2017.09.06
DMA_Streamx->CR|=1<<16; //中等优先级
DMA_Streamx->CR|=0<<21; //外设突发单次传输 ???
DMA_Streamx->CR|=0<<23; //存储器突发单次传输
DMA_Streamx->CR|=(u32)chx<<25;//通道选择
//DMA_Streamx->FCR=0X21; //FIFO控制寄存器
DMA_Streamx->CR&=~(1<<0); //关闭DMA传输
while(DMA_Streamx->CR&0X1); //确保DMA可以被设置
DMA_Streamx->CR|=1<<0; //开启DMA传输
}
//初始化ADC
void Adc_Init(void)
{
//先初始化IO口
RCC->APB2ENR|=1<<8; //使能ADC1时钟 中文参考手册P144
RCC->AHB1ENR|=1<<1; //使能PORTB时钟
RCC->AHB1ENR|=1<<2; //使能PORTC时钟
GPIO_Set(GPIOB,PIN0|PIN1,GPIO_MODE_AIN,0,0,GPIO_PUPD_PU); //PB0 PB1,模拟输入,下拉
GPIO_Set(GPIOC,PIN0|PIN1|PIN2|PIN3|PIN4|PIN5,GPIO_MODE_AIN,0,0,GPIO_PUPD_PU); //PC0-PC5,模拟输入,下拉
RCC->APB2RSTR|=1<<8; //ADCs复位
RCC->APB2RSTR&=~(1<<8); //复位结束
ADC->CCR=3<<16; //ADCCLK=PCLK2/8=96/8=12Mhz,ADC时钟最好不要超过36Mhz
ADC1->CR1=0; //CR1设置清零
ADC1->CR2=0; //CR2设置清零
ADC1->CR1|=0<<24; //12位模式
ADC1->CR1|=1<<8; //使能扫描模式
ADC1->CR2|=1<<1; //连续转换模式
ADC1->CR2&=~(1<<11); //右对齐
ADC1->CR2|=0<<28; //软件触发
ADC1->CR2|=1<<8; //使能DMA
ADC1->SQR1&=~(0XF<<20); //位 23:20 L[3:0]:规则通道序列长度
ADC1->SQR1|=7<<20;
//设置通道8的采样时间
ADC1->SMPR2&=~(7<<(3*8));//通道8采样时间清空 PB0 ADC12_IN8
ADC1->SMPR2|=7<<(3*8); ..............................
ADC1->SQR3&=0XC0000000;//规则序列1 通道
ADC1->SQR2&=0XFFFFFC00;//规则序列1 通道
ADC1->SQR3|=10<<0;
..................
//ADC->CCR=2<<14; //使能DMA模式2 ???
ADC1->CR2|=1<<0; //开启AD转换器 使能ADC
ADC1->CR2|=1<<30; //启动规则转换通道
加载中...
Bunny17
6楼-- · 2019-08-15 09:40
没找到问题出在哪里
加载中...
上一页
1
2
3
下一页
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
STM32开发板免费用活动
7 个回答
stm32 处理 DHT11占用太多时间,大家程序是怎么设计的
8 个回答
分享一个STM32单片机做的离线编程器代码
9 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
写1是对的。
while(DMAx->LISR&0X20)
{
LED0=!LED0;
DMAx->LIFCR |= 1<<5; //清除传输完成中断标志
}
Adc_Init();
MYDMA_Enable(DMA2_Stream0,512);
我的程序必须这样才可以连续采集,连续传输,通过串口显示就是正确的不重复的数据。
如果我将Adc_Init(); 改成仅仅
ADC1->CR2|=1<<0; //开启AD转换器 使能ADC
ADC1->CR2|=1<<30; //启动规则转换通道
这两行就不可以。
DMA是循环模式,AD是连续采样的还不行就只能跟着寄存器慢慢调了 看是不是哪里漏了
void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u8 chx,u32 par,u32 mar,u16 ndtr)
{
DMA_TypeDef *DMAx;
u8 streamx;
if((u32)DMA_Streamx>(u32)DMA2)//得到当前stream是属于DMA2还是DMA1
{
DMAx=DMA2;
RCC->AHB1ENR|=1<<22;//DMA2时钟使能
}else
{
DMAx=DMA1;
RCC->AHB1ENR|=1<<21;//DMA1时钟使能
}
while(DMA_Streamx->CR&0X01);//等待DMA可配置 开发指南寄存器版本P226
streamx=(((u32)DMA_Streamx-(u32)DMAx)-0X10)/0X18; //得到stream通道号
if(streamx>=6)DMAx->HIFCR|=0X3D<<(6*(streamx-6)+16); //清空之前该stream上的所有中断标志
else if(streamx>=4)DMAx->HIFCR|=0X3D<<6*(streamx-4); //清空之前该stream上的所有中断标志
else if(streamx>=2)DMAx->LIFCR|=0X3D<<(6*(streamx-2)+16);//清空之前该stream上的所有中断标志
else DMAx->LIFCR|=0X3D<<6*streamx; //清空之前该stream上的所有中断标志
DMA_Streamx->PAR=par; //DMA外设地址
DMA_Streamx->M0AR=mar; //DMA 存储器0地址
DMA_Streamx->NDTR=ndtr; //数据传输量
DMA_Streamx->CR=0; //先全部复位CR寄存器值
DMA_Streamx->CR|=0<<6; //存储器到外设模式 改为外设到存储器
DMA_Streamx->CR|=1<<8; //非循环模式(即使用普通模式) 改为使能循环模式
DMA_Streamx->CR|=0<<9; //外设非增量模式
DMA_Streamx->CR|=1<<10; //存储器增量模式
DMA_Streamx->CR|=1<<11; //外设数据长度:8位 改为16位,因为ADC为12位
DMA_Streamx->CR|=0<<13; //存储器数据长度:8位 改为16位2017.08.03 又改回去改为8位2017.09.06
DMA_Streamx->CR|=1<<16; //中等优先级
DMA_Streamx->CR|=0<<21; //外设突发单次传输 ???
DMA_Streamx->CR|=0<<23; //存储器突发单次传输
DMA_Streamx->CR|=(u32)chx<<25;//通道选择
//DMA_Streamx->FCR=0X21; //FIFO控制寄存器
DMA_Streamx->CR&=~(1<<0); //关闭DMA传输
while(DMA_Streamx->CR&0X1); //确保DMA可以被设置
DMA_Streamx->CR|=1<<0; //开启DMA传输
}
//初始化ADC
void Adc_Init(void)
{
//先初始化IO口
RCC->APB2ENR|=1<<8; //使能ADC1时钟 中文参考手册P144
RCC->AHB1ENR|=1<<1; //使能PORTB时钟
RCC->AHB1ENR|=1<<2; //使能PORTC时钟
GPIO_Set(GPIOB,PIN0|PIN1,GPIO_MODE_AIN,0,0,GPIO_PUPD_PU); //PB0 PB1,模拟输入,下拉
GPIO_Set(GPIOC,PIN0|PIN1|PIN2|PIN3|PIN4|PIN5,GPIO_MODE_AIN,0,0,GPIO_PUPD_PU); //PC0-PC5,模拟输入,下拉
RCC->APB2RSTR|=1<<8; //ADCs复位
RCC->APB2RSTR&=~(1<<8); //复位结束
ADC->CCR=3<<16; //ADCCLK=PCLK2/8=96/8=12Mhz,ADC时钟最好不要超过36Mhz
ADC1->CR1=0; //CR1设置清零
ADC1->CR2=0; //CR2设置清零
ADC1->CR1|=0<<24; //12位模式
ADC1->CR1|=1<<8; //使能扫描模式
ADC1->CR2|=1<<1; //连续转换模式
ADC1->CR2&=~(1<<11); //右对齐
ADC1->CR2|=0<<28; //软件触发
ADC1->CR2|=1<<8; //使能DMA
ADC1->SQR1&=~(0XF<<20); //位 23:20 L[3:0]:规则通道序列长度
ADC1->SQR1|=7<<20;
//设置通道8的采样时间
ADC1->SMPR2&=~(7<<(3*8));//通道8采样时间清空 PB0 ADC12_IN8
ADC1->SMPR2|=7<<(3*8); ..............................
ADC1->SQR3&=0XC0000000;//规则序列1 通道
ADC1->SQR2&=0XFFFFFC00;//规则序列1 通道
ADC1->SQR3|=10<<0;
..................
//ADC->CCR=2<<14; //使能DMA模式2 ???
ADC1->CR2|=1<<0; //开启AD转换器 使能ADC
ADC1->CR2|=1<<30; //启动规则转换通道
一周热门 更多>