[mw_shl_code=c,true]__IO uint16_t adc_Value[320];
void TIM3_PWM_Init(u32 arr,u32 psc)
{
//此部分需手动修改IO口设置
RCC->APB1ENR|=1<<1; //TIM3时钟使能
TIM3->ARR=arr; //设定计数器自动重装值
TIM3->  SC=psc; //预分频器不分频
TIM3->CCMR1|=6<<4; //CH1 PWM1模式
TIM3->CCMR1|=1<<3; //CH1 预装载使能
TIM3->CCER|=1<<0; //OC1 输出使能
TIM3->CCER|=1<<1; //OC1 低电平有效
TIM3->CCER|=1<<1; //OC1 低电平有效
TIM3->CCR1 =arr/2; //ARPE使能
TIM3->CR1|=1<<0; //使能定时器3
}
void ADC_DMA_init(void)
{
RCC->AHB1ENR|=1<<22;//DMA2时钟使能
DMA2_Stream4->  AR=(u32)&(ADC1->DR); //DMA外设地址
DMA2_Stream4->M0AR=(u32)adc_Value; //DMA 存储器0地址
DMA2_Stream4->NDTR=320; //DMA 存储器0地址
DMA2_Stream4->CR=0; //先全部复位CR寄存器值
DMA2_Stream4->CR|=0<<6; //存储器到外设模式
DMA2_Stream4->CR|=1<<8; //循环模式
DMA2_Stream4->CR|=0<<9; //外设非增量模式
DMA2_Stream4->CR|=1<<10; //存储器增量模式
DMA2_Stream4->CR|=1<<11; //外设数据长度:16位
DMA2_Stream4->CR|=1<<13; //存储器数据长度:16位
DMA2_Stream4->CR|=1<<16; //中等优先级
DMA2_Stream4->CR|=0<<21; //外设突发单次传输
DMA2_Stream4->CR|=0<<23; //存储器突发单次传输
DMA2_Stream4->CR|= 0x0<<25;//通道选择
DMA2_Stream4->CR|= 1<< 0;//开DMA
}
//初始化ADC
//这里我们仅以规则通道为例
void Adc_Init(void)
{
//先初始化IO口
RCC->APB2ENR|=1<<8; //使能ADC1时钟
RCC->AHB1ENR|=1<<0; //使能PORTA时钟
GPIO_Set(GPIOA,PIN6,GPIO_MODE_AIN,0,0,GPIO_PUPD_PU); //PA6,模拟输入,下拉
RCC->APB2RSTR|=1<<8; //ADCs复位
RCC->APB2RSTR&=~(1<<8); //复位结束
ADC->CCR=1<<16; //ADCCLK=PCLK2/4=84/4=21Mhz,ADC时钟最好不要超过36Mhz
ADC1->CR1=0; //CR1设置清零
ADC1->CR2=0; //CR2设置清零
ADC1->CR1|=0<<24; //12位模式
ADC1->CR1|=0<<8; //非扫描模式
ADC1->CR2&=~(1<<1); //单次转换模式
ADC1->CR2&=~(1<<11); //右对齐
ADC1->CR2 |= 3<<28; //硬件触发,上升沿下降沿都触发
ADC1->CR2 |=7<<24; //TIM3 通道1触发
ADC1->CR2 |= 1 << 8; //开DMA
ADC1->SQR1&=~(0XF<<20);
ADC1->SQR1|=0<<20; //1个转换在规则序列中 也就是只转换规则序列1
//设置通道6的采样时间
ADC1->SMPR2&=~(7<<(3*6)); //通道6采样时间清空
ADC1->SMPR2|=0<<(3*6); //通道6 480个周期,提高采样时间可以提高精确度
ADC1->SQR3|=0x6;
ADC1->CR2 |= ADC_CR2_DDS; //必须置位才会一直循环采样,否则只能采样DMA设置值的次数
ADC1->CR2|=1<<0; //开启AD转换器
ADC_DMA_init();
TIM3_PWM_Init(1000,168-1);
} [/mw_shl_code]
|