新手上路
- 积分
- 30
- 金钱
- 30
- 注册时间
- 2011-8-13
- 在线时间
- 6 小时
|
发表于 2012-6-7 19:07:03
|
显示全部楼层
我现在也在搞这个用定时器2 cc2事件控制ADC1 4过通道循环扫描。如果不加定时器触发,能收到DMA中断数据。加了定时器就是没有看到数据输出
定时器的设置我是在开发板例程上改的。如下:不知道错在那里了。
void Timerx_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<0;//TIM2EN:定时器2时钟使能 (Timer 2 clock enable)
TIM2->ARR=arr; //更新事件装入活动的自动重装载
TIM2-> SC=psc; //TIMx时钟频率除数的预分频值
TIM2->CR1&=~(1<<4);//DIR:方向 (Direction)DIR:方向 (Direction)
//上面是时基配置
TIM2->CCMR1&=~(3<<8);//00:CC2通道被配置为输出;
TIM2->CCMR1|=7<<12; //CH2  WM2模式
TIM2->CCMR1|=1<<11; //CH2预装载使能
// TIM2->CCER|=1<<4; //OC2 输出使能
TIM2->CR1=0x8000; //ARPE使能
TIM2->CR1|=0x01; //使能定时器3
// //这两个东东要同时设置才可以使用中断
// TIM2->DIER|=1<<0; //允许更新中断
// TIM2->DIER|=1<<6; //允许触发中断
// TIM2->CR1|=1<<0; //使能定时器2
// MY_NVIC_Init(1,3,TIM2_IRQChannel,2);//抢占1,子优先级3,组2
}
void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
u32 DR_Base; //做缓冲用,不知道为什么.非要不可
RCC->AHBENR|=1<<0;//开启DMA1时钟
__nop(); //等待 DMA1 时钟稳定
__nop(); //经测试最少 2 个 nop
__nop();
DR_Base=cpar; //cpar:外设地址
DMA_CHx->CPAR=DR_Base; //DMA1 外设地址
DMA_CHx->CMAR=(u32)cmar; //DMA1,存储器地址
DMA1_MEM_LEN=cndtr; //保存DMA传输数据量
DMA_CHx->CNDTR=cndtr; //DMA1,传输数据量在每个数据传输后,这个数值递减。
DMA_CHx->CCR=0X00000000;//复位
DMA_CHx->CCR|=1<<1; //允许传输完中断
DMA_CHx->CCR|=0<<4; //从外设读取数据
DMA_CHx->CCR|=1<<5; //循环模式
DMA_CHx->CCR|=0<<6; //外设地址非增量模式
DMA_CHx->CCR|=1<<7; //存储器地址增量模式,因为只有为增量,才能够使得每次
DMA_CHx->CCR|=1<<8; //外设数据宽度为16位
DMA_CHx->CCR|=1<<10; //存储器数据宽度16位
DMA_CHx->CCR|=1<<12; //通道优先级中等优先级
DMA_CHx->CCR|=0<<14; //非存储器到存储器模式
MY_NVIC_Init(1,2,DMA1_Channel1_IRQChannel ,2);
ADC1->CR2|=1<<8; //开启ADC DMA转换 ttttttttttttttjjjjjjjjjjjj
ADC1->CR2|=1<<0; //开启ADC并启动转换 tttttttttttttjjjjjjjjjjjjjjj
}
void Adc_Init(void)
{
//先初始化IO口
RCC->APB2ENR|=1<<4; //使能PORTC口时钟
GPIOC->CRL&=0XFFFF0000;//PC 0 1 2 3 anolog输入
GPIOC->CRL|=0X00008888; //PC 0 1 2 3 anolog输入
//通道10/11设置
RCC->APB2ENR|=1<<9; //ADC1时钟使能ADC1EN:ADC1接口时钟使能 (ADC 1 interface clock enable)
__nop();
__nop();
__nop();
__nop();
__nop();
RCC->APB2RSTR|=1<<9; //ADC1RST:ADC1接口复位 (ADC 1 interface reset)
RCC->APB2RSTR&=~(1<<9);//复位结束
RCC->CFGR&=~(3<<14); //分频因子清零
//SYSCLK72MHZ/DIV2=12M ADC时钟设置为12M,ADC最大时钟不能超过14M!
//否则将导致ADC准确度下降!
RCC->CFGR|=2<<14; // 10:PCLK2 6分频后作为ADC时钟
ADC1->CR1&=~(0XF<<16); //工作模式清零
ADC1->CR1|=0<<16; //独立工作模式
ADC1->CR1|=1<<8; //SCAN:扫描模式 (Scan mode)
ADC1->CR2|=1<<1; //启用连续转换 CONT:连续转换 (Continuous conversion)
ADC1->CR1|=1<<14; //wwwwwwww软件通过这些位定义在间断模式下,收到外部触发后转换规则通道的数目
ADC1->CR1|=1<<11; //wwwwwwww规则通道组上使用间断模式用于开启或关闭规则通道组上的间断模式
ADC1->CR2&=~(7<<17); //清零通道组转换的外部事件
ADC1->CR2|=1<<18|1<<17; //的定时器2的CC2事件事件--选择定时器2的捕获比较2作为转换外部触发
// ADC1->CR2|=1<<19|1<<18|1<<17;//选择为软件触发触发启动
ADC1->CR1&=~(1<<10);//关闭自动的注入通道组转换;ttttttjjjjjj
ADC1->CR2&=~(1<<11); //右对齐ADC数据右对齐
ADC1->SQR1&=~(0XF<<20);
ADC1->SQR1|=3<<20; //4个转换在规则序列中
ADC1->SQR3 = 0X00000000;
ADC1->SQR3|= 0X0006B16A;//第一次转换10通道,顺次
//设置通道0~3的采样时间
ADC1->SMPR1&=0XFFFFF000;//通道10 11 12 13 采样时间清空
ADC1->SMPR1|=7<<0; //通道10 239.5周期,提高采样时间可以提高精确度
ADC1->SMPR1|=7<<3; //通道11 239.5周期,提高采样时间可以提高精确度
ADC1->SMPR1|=7<<6; //通道12 239.5周期,提高采样时间可以提高精确度
ADC1->SMPR1|=7<<9; //通道13 239.5周期,提高采样时间可以提高精确度
ADC_ExternalTrigConvCmd(ADC1,ENABLE);// ADC1->CR2|=1<<20;//1:使用外部事件启动转换。
ADC_Cmd(ADC1,ENABLE);//ADC1->CR2|=1<<0; //开启ADC并启动转换 能或者失能指定的ADC
ADC_ResetCalibration(ADC1);//ADC1->CR2|=1<<3; //使能复位校准
while(ADC1->CR2&1<<3); //等待校准结束
ADC_StartCalibration(ADC1);//ADC1->CR2|=1<<2; //开启AD校准
while(ADC1->CR2&1<<2); //等待校准结束
ADC_DMACmd(ADC1, ENABLE);//ADC1->CR2|=1<<8; //开启ADC DMA转换 ttttttttttttttjjjjjjjjjjjj
//ADC1->CR2|=0x000E0000; //软件控制转换 由bit21控制 ttttttttttttttjjjjjjjjjjjj
//ADC1->CR2|=1<<20; //使用用外部触发(SWSTART)!!! 必须使用一个事件来触发
//ADC1->CR2|=1<<0; ///开启AD转换器,第一次唤醒AD转换器
//该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除
} |
|