#define DMA_CYCLE_EN 1
uint32_t ADC_Result_Array[16] = {0};
/******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
/*****************************************************************************
* Function implementation - global ('extern') and local ('static')
******************************************************************************/
static void ZeroMemory(uint8_t *buf,uint32_t size)
{
uint32_t i = 0;
for(i = 0;i < size;i ++)
{
*buf = 0x0;
}
}
static void Error_Handle()
{
while(1);
}
void DMA_CHANNEL1_IRQ_FUNCTION(void)
{
if( DMA_GetITStatus(DMA_IT_TC1) )
{
DMA_ClearITPendingBit(DMA_IT_TC1);
#ifdef DMA_CYCLE_EN
CW_DMACHANNEL1->CNT = 0x10010; //重置CNT计数
CW_DMACHANNEL1->DSTADDR = (uint32_t)( &ADC_Result_Array[0] ); //重置目的地址
DMA_Cmd(CW_DMACHANNEL1, ENABLE); //使能DMA
#else
ADC_Disable(); //传输完成,停止ADC
#endif
}
if( DMA_GetITStatus(DMA_IT_TE1) )
{
DMA_ClearITPendingBit(DMA_IT_TE1);
Error_Handle();
}
}
/**
* [url=home.php?mod=space&uid=247401]@brief[/url] Configure the nested vectored interrupt controller.
* @param None
* @retval None
*/
void NVIC_Configuration(void)
{
__disable_irq();
NVIC_ClearPendingIRQ(DMACH1_IRQn);
NVIC_EnableIRQ(DMACH1_IRQn);
__enable_irq();
}
/**
******************************************************************************
** \brief Main function of project
**
** \return uint32_t return value, if needed
**
**
**
******************************************************************************/
int32_t main(void)
{
ADC_InitTypeDef ADC_InitStruct;
DMA_InitTypeDef DMA_InitStruct;
RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_DMA | RCC_AHB_PERIPH_GPIOA | RCC_AHB_PERIPH_GPIOB, ENABLE); //Open DMA and GPIOA/B Clk
RCC_APBPeriphClk_Enable2(RCC_APB2_PERIPH_ADC, ENABLE); //Open ADC Clk
//PB8/PB9 推挽输出
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pins = GPIO_PIN_8 | GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_Init(CW_GPIOB, &GPIO_InitStruct);
PB08_SETLOW();
PB09_SETLOW();
//配置ADC测试IO口
PA00_ANALOG_ENABLE() ; //PA00 (AIN0)
//ADC初始化
ADC_InitStruct.ADC_OpMode = ADC_SingleChOneMode; //单通道单次转换模式
ADC_InitStruct.ADC_ClkDiv = ADC_Clk_Div128; //PCLK
ADC_InitStruct.ADC_SampleTime = ADC_SampTime5Clk; //5个ADC时钟周期
ADC_InitStruct.ADC_VrefSel = ADC_Vref_VDDA; //VDDA参考电压
ADC_InitStruct.ADC_InBufEn = ADC_BufEnable; //开启跟随器
ADC_InitStruct.ADC_TsEn = ADC_TsDisable; //内置温度传感器禁用
ADC_InitStruct.ADC_DMAEn = ADC_DmaEnable; //ADC转换完成触发DMA传输
ADC_InitStruct.ADC_Align = ADC_AlignRight; //ADC转换结果右对齐
ADC_InitStruct.ADC_AccEn = ADC_AccDisable; //转换结果累加不使能
ADC_Init(&ADC_InitStruct); //初始化ADC配置
CW_ADC->CR1_f.DISCARD = FALSE; //配置数据更新策略,不包含在ADC结构体中
CW_ADC->CR1_f.CHMUX = ADC_Vref1P2Input; //ADC_ExInputCH0; //配置ADC输入通道,不包含在ADC结构体中
ADC_ClearITPendingBit(ADC_IT_EOC);
ADC_ITConfig(ADC_IT_EOC, ENABLE);
ADC_EnableNvic(ADC_INT_PRIORITY);
DMA_StructInit( &DMA_InitStruct );
ZeroMemory((uint8_t *)&ADC_Result_Array[0],sizeof(ADC_Result_Array));
DMA_InitStruct.DMA_Mode = DMA_MODE_BLOCK;
DMA_InitStruct.DMA_TransferWidth = DMA_TRANSFER_WIDTH_32BIT;
DMA_InitStruct.DMA_SrcInc = DMA_SrcAddress_Fix;
#ifdef DMA_CYCLE_EN
DMA_InitStruct.DMA_DstInc = DMA_DstAddress_Increase;
#else
DMA_InitStruct.DMA_DstInc = DMA_DstAddress_Fix;
#endif
DMA_InitStruct.DMA_TransferCnt = 16;
DMA_InitStruct.DMA_SrcAddress = (uint32_t) &(CW_ADC->RESULT0);
DMA_InitStruct.DMA_DstAddress = (uint32_t)&ADC_Result_Array[0];
DMA_InitStruct.TrigMode = DMA_HardTrig;
DMA_InitStruct.HardTrigSource = DMA_HardTrig_ADC_TRANSCOMPLETE;
DMA_Init(CW_DMACHANNEL1,&DMA_InitStruct);
DMA_ClearITPendingBit(DMA_IT_ALL);
DMA_ITConfig(CW_DMACHANNEL1, DMA_IT_TC|DMA_IT_TE , ENABLE); //使能DMA_CHANNEL1中断
NVIC_Configuration(); //使能DMA_CHANNEL1中断
DMA_Cmd(CW_DMACHANNEL1, ENABLE); //使能DMA
//ADC使能
ADC_Enable();
ADC_SoftwareStartConvCmd(ENABLE);
while(1)
{
PB08_TOG();
PB09_TOG();
FirmwareDelay(1000000);
}
}
|