初级会员

- 积分
- 130
- 金钱
- 130
- 注册时间
- 2012-12-27
- 在线时间
- 0 小时
|
发表于 2013-11-26 10:48:00
|
显示全部楼层
回复【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=0x00160100; // [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();
__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=0x00002580; // [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
{
  Bout(8)=1;//标记没有执行到这里
usart_2_usb_send();
Finish_Flag=1;
DMA1->IFCR|=0x0F; // 清DMA中断标志
}
PB8是标记位,经检测,DMA中断进入不了,求解答。 |
|