我最近再学洗stm32L系列,想写一个单通道AD连续采样的例子。网上实在没找到什么例程,自己写的调试没成功,现在不知道问题出在哪,请各位帮帮忙!
这是我写的AD配置程序,应该配置完成就直接可以采样了吧!但没成功。
/**
* AD转换器配置函数
* @param None
* @return None
*/
void ADConfig(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
/** 时钟配置:3V电源,AD,AD409 */
RCC_AHBPeriphClockCmd(AD_RCC, ENABLE);
/** AD输入引脚配置 */
GPIO_InitStructure.GPIO_Pin = AD_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; //模拟输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(AD_PORT, &GPIO_InitStructure);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_DeInit(DMA1_Channel1); /**< 配置通道 */
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR; /**< "桥梁"的一端,AD采样值 */
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_Buffer; /**< "桥梁"的另一端,内存存储基地址 */
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; /**< 单向传输 */
DMA_InitStructure.DMA_BufferSize = AD_BUFFER_SIZE; /**< 缓存大小 */
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; /**< 关闭外设指针的自动递增 */
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; /**< 开启内存指针的自动递增 */
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; /**< 外设数据宽度 */
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; /**< 内存数据宽度 */
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; /**< 循环缓存 */
DMA_InitStructure.DMA_Priority = DMA_Priority_High; /**< 优先级 */
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; /**< 禁用memory to memory */
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
DMA_Cmd(DMA1_Channel1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; /**< 分辨率 12位 */
ADC_InitStructure.ADC_ScanConvMode = DISABLE; /**< 关闭扫描模式,只有1个通道时,一般关闭 */
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; /**< 开启连续转换模式 */
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; /**< 关闭外部触发,使用软件触发(ADC_SoftwareStartConvCmd) */
//ADC_InitStructure.ADC_ExternalTrigConv = ;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; /**< 12位数据右对齐 */
ADC_InitStructure.ADC_NbrOfConversion = 1; /**< 开启通道数,1个 */
ADC_Init(ADC1, &ADC_InitStructure);
/**< 采样周期设为:采样时间:192cycles, 转化时间:12cycles, 总时间:(12+192)/16M = 13us; */
ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_192Cycles);
ADC_DMACmd(ADC1, ENABLE);
ADC_Cmd(ADC1, ENABLE);
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_RCNR)!= SET); /**< Regular channel not ready */
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADONS)!= RESET); /**< ADC ON status */
ADC_SoftwareStartConv(ADC1); /**< 软件触发 */
}
这样配置行吗?
|