初级会员

- 积分
- 86
- 金钱
- 86
- 注册时间
- 2014-7-27
- 在线时间
- 8 小时
|

楼主 |
发表于 2014-8-3 14:27:20
|
显示全部楼层
代码基本参考自ST的官方固件
uint32_t SDADC1_Config(void)
{
SDADC_AINStructTypeDef SDADC_AINStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
uint32_t SDADCTimeout = 0;
/* MPX2102_SDADC APB2 interface clock enable */
RCC_APB2PeriphClockCmd(MPX2102_SDADC_CLK, ENABLE);
/*  WR APB1 interface clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
/* Enable MPX2102_SDADC analog interface */
  WR_SDADCAnalogCmd(MPX2102_SDADC_PWR, ENABLE);
/* Set the SDADC divider: The SDADC should run @6MHz */
/* If Sysclk is 72MHz, SDADC divider should be 12 */
RCC_SDADCCLKConfig(RCC_SDADCCLK_SYSCLK_Div12);
/* GPIOE  eripheral clock enable */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
/* MPX2102_SDADC channel 8P (PE8) and channel 8N (PE9) */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Pin = MPX2102_GPIO_PIN_P | MPX2102_GPIO_PIN_N;
GPIO_Init(MPX2102_SDADC_GPIO_PORT, &GPIO_InitStructure);
/* Select External reference: The reference voltage selection is available
only in SDADC1 and therefore to select the VREF for SDADC2/SDADC3, SDADC1
clock must be already enabled */
SDADC_VREFSelect(MPX2102_SDADC_VREF);
/* Insert delay equal to ~5 ms */
Delay(5000);
/* Enable MPX2102_SDADC */
SDADC_Cmd(MPX2102_SDADC, ENABLE);
/* Enter initialization mode */
SDADC_InitModeCmd(MPX2102_SDADC, ENABLE);
SDADCTimeout = SDADC_INIT_TIMEOUT;
/* wait for INITRDY flag to be set */
while((SDADC_GetFlagStatus(MPX2102_SDADC, SDADC_FLAG_INITRDY) == RESET) && (--SDADCTimeout != 0));
if(SDADCTimeout == 0)
{
/* INITRDY flag is not set */
return 1;
}
/* Analog Input configuration conf0: use differential mode and gain = 4 */
SDADC_AINStructure.SDADC_InputMode = SDADC_InputMode_Diff;
SDADC_AINStructure.SDADC_Gain = MPX2102_SDADC_GAIN;
SDADC_AINStructure.SDADC_CommonMode = SDADC_CommonMode_VSSA;
SDADC_AINStructure.SDADC_Offset = 0;
SDADC_AINInit(MPX2102_SDADC, SDADC_Conf_0, &SDADC_AINStructure);
/* select MPX2102_SDADC channel 8 to use conf0 */
SDADC_ChannelConfig(MPX2102_SDADC, MPX2102_SDADC_CHANNEL, SDADC_Conf_0);
/* select channel 8 */
SDADC_InjectedChannelSelect(MPX2102_SDADC, MPX2102_SDADC_CHANNEL);
/* Select an external trigger */
SDADC_ExternalTrigInjectedConvConfig(MPX2102_SDADC, SDADC_ExternalTrigInjecConv_T19_CC2);
/* Select rising edge */
SDADC_ExternalTrigInjectedConvEdgeConfig(MPX2102_SDADC, SDADC_ExternalTrigInjecConvEdge_Rising);
/* Exit initialization mode */
SDADC_InitModeCmd(MPX2102_SDADC, DISABLE);
SDADC_DMAConfig(SDADC1, SDADC_DMATransfer_Injected, ENABLE);
/* Enable end of injected conversion interrupt */
// SDADC_ITConfig(MPX2102_SDADC, SDADC_IT_JEOC, ENABLE);
// /* NVIC Configuration */
// NVIC_InitStructure.NVIC_IRQChannel = SDADC1_IRQn;
// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
// NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
// NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
// NVIC_Init(&NVIC_InitStructure);
/* configure calibration to be performed on conf0 */
SDADC_CalibrationSequenceConfig(MPX2102_SDADC, SDADC_CalibrationSequence_1);
/* start MPX2102_SDADC Calibration */
SDADC_StartCalibration(MPX2102_SDADC);
/* Set calibration timeout: 5.12 ms at 6 MHz in a single calibration sequence */
SDADCTimeout = SDADC_CAL_TIMEOUT;
/* wait for MPX2102_SDADC Calibration process to end */
while((SDADC_GetFlagStatus(MPX2102_SDADC, SDADC_FLAG_EOCAL) == RESET) && (--SDADCTimeout != 0));
if(SDADCTimeout == 0)
{
/* EOCAL flag can not set */
return 2;
}
return 0;
}
void DMA2_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* DMA2 clock enable */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2,ENABLE);
/* DMA2 Channel3 Config */
DMA_DeInit(DMA2_Channel3);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SDADC1_JDATAR;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)InjectedConvData;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = ADCConvertNum;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA2_Channel3, &DMA_InitStructure);
/* DMA2 Channel3 enable */
//DMA_ITConfig(DMA2_Channel3, DMA_IT_TC, DISABLE);
NVIC_InitStructure.NVIC_IRQChannel = DMA2_Channel3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
DMA_ITConfig(DMA2_Channel3, DMA_IT_TC, ENABLE);
DMA_Cmd(DMA2_Channel3, ENABLE); |
|