新手入门
- 积分
- 1
- 金钱
- 1
- 注册时间
- 2019-4-29
- 在线时间
- 0 小时
|
发表于 2016-4-14 09:12:11
|
显示全部楼层
本帖最后由 kelei999999 于 2016-4-14 11:48 编辑
看我的:
初始化代码:
void ADC_Init(void)
{
ADC1->CR1 = /*ADC_CR1_EOCIE | */ADC_CR1_OVRIE | ADC_CR1_SCAN;
ADC1->SMPR1 = 0;//采样3个AD时钟周期
ADC1->SMPR2 = 0;//采样3个AD时钟周期
ADC1->SQR1 = (15 << 20) + (18 << 15) + (16 << 10) + (15 << 5) + 14;//0xF83DCD;
ADC1->SQR2 = (13 << 25) + (12 << 20) + (11 << 15) + (10 << 10) + (9 << 5) + 8;//0x18B52507;
ADC1->SQR3 = (7 << 25) + (6 << 20) + (3 << 15) + (2 << 10) + (1 << 5) + 0;
ADC->CCR = ADC_CCR_TSVREFE | ADC_CCR_VBATE | ADC_CCR_ADCPRE_0;
ADC1->CR2 = /*ADC_CR2_EOCS | */ADC_CR2_DDS | ADC_CR2_DMA | ADC_CR2_ADON | ADC_CR2_CONT;
ADC1->SR = 0;
HAL_NVIC_EnableIRQ(ADC_IRQn);
HAL_NVIC_SetPriority(ADC_IRQn, 0, 0);//最高优先级
DMA2_Stream0->CR = /*DMA_SxCR_CHSEL_0 | */ DMA_SxCR_PL | DMA_SxCR_MSIZE_1 | DMA_SxCR_PSIZE_1 | DMA_SxCR_MINC | DMA_SxCR_TCIE
| DMA_SxCR_TEIE | DMA_SxCR_DMEIE | DMA_SxCR_CIRC;
DMA2_Stream0->NDTR = 64;
DMA2_Stream0->PAR = (unsigned int)(&ADC1->DR);
DMA2_Stream0->M0AR = (unsigned int)ADBUF;
DMA2->LIFCR = 0xffffffff;
DMA2->HIFCR = 0xffffffff;
HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);
HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 4, 1);
DMA2_Stream0->CR |= DMA_SxCR_EN;
ADC1->CR2 |= ADC_CR2_SWSTART;
}
DMA中断
void DMA2_Stream0_IRQHandler(void)
{
ADC1->CR2 &= ~ADC_CR2_ADON;//关闭ADC1
ADC1->CR2 &= ~ADC_CR2_SWSTART;
DMA2_Stream0->CR &= ~DMA_SxCR_EN;//关闭DMA_Stream0
DMA2_Stream0->NDTR = 64;
DMA2_Stream0->M0AR = (unsigned int)ADBUF;
if(DMA2->LISR & DMA_LISR_TCIF0)
{
}
AD_ERROR = 0;//在此处不断的清零
DMA2->LIFCR |= (DMA_LIFCR_CTCIF0 | DMA_LIFCR_CHTIF0 |
DMA_LIFCR_CTEIF0 | DMA_LIFCR_CDMEIF0 | DMA_LIFCR_CFEIF0);
DMA2_Stream0->CR |= DMA_SxCR_EN;
ADC1->CR2 |= ADC_CR2_ADON;
LED1(0);
// DMA2->HIFCR |= (DMA_LIFCR_CTCIF0 | DMA_LIFCR_CHTIF0 |
// DMA_LIFCR_CTEIF0 | DMA_LIFCR_CDMEIF0 | DMA_LIFCR_CFEIF0);
// DMA2->LIFCR = 0xffffffff;
// DMA2->HIFCR = 0xffffffff;
//ADC1->CR2 |= ADC_CR2_SWSTART;//--------------------------------------------启动AD
}
我没有让AD一只工作,而是在一个100us的定时中断的不断启动。当然也可以通过按键启动,按一次,启动一次!
ADC1->CR2 |= ADC_CR2_SWSTART;//--------------------------------------------启动AD
还有,发现AD DMA工作时有一定几率阻塞,导致DMA不中断
|
|