[STM32F2] 程序一直跑不起来

[复制链接]
 楼主| kangzj 发表于 2021-3-16 22:39 | 显示全部楼层 |阅读模式
用stm32f205芯片,写了个读取电压的程序,用ADC+DMA,单通道读取,程序一直跑不起来
liuzaiy 发表于 2021-3-16 22:41 | 显示全部楼层
驱动部分程序看看
 楼主| kangzj 发表于 2021-3-16 22:44 | 显示全部楼层

static void ADCx_GPIO_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
        
        GPIO_Init(GPIOC, &GPIO_InitStructure);
}



static void ADCx_Mode_Config(void)
{
        DMA_InitTypeDef DMA_InitStruct;
        ADC_InitTypeDef ADC_InitStruct;
        ADC_CommonInitTypeDef ADC_CommonInitStruct;
        
        RCC_APB2PeriphClockCmd ( RCC_APB2Periph_ADC1, ENABLE );
        RCC_AHB1PeriphClockCmd ( RCC_AHB1Periph_DMA2, ENABLE );
        
        DMA_DeInit(DMA2_Stream0);
  DMA_InitStruct.DMA_Channel = DMA_Channel_0;
  DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)(&(ADC1->DR));
  DMA_InitStruct.DMA_Memory0BaseAddr = (uint32_t)&ADC_ConvertedValue;
  DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralToMemory;/*ÍâÉèµ½ÄÚ´æ*/
  DMA_InitStruct.DMA_BufferSize = 1;
  DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Disable;
  DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStruct.DMA_Priority = DMA_Priority_High;
  DMA_InitStruct.DMA_FIFOMode = DMA_FIFOMode_Disable;
  DMA_InitStruct.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
  DMA_InitStruct.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  DMA_InitStruct.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  
  DMA_Init(DMA2_Stream0, &DMA_InitStruct);
        DMA_Cmd(DMA2_Stream0, ENABLE);
        
        ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
        ADC_InitStruct.ADC_ScanConvMode = DISABLE;
        ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;
        ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
        ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
        ADC_InitStruct.ADC_NbrOfConversion = 1;
        
        ADC_CommonInitStruct.ADC_Mode = ADC_Mode_Independent;
        ADC_CommonInitStruct.ADC_Prescaler = ADC_Prescaler_Div6;
        ADC_CommonInitStruct.ADC_DMAAccessMode = ADC_DMAAccessMode_3;
        ADC_CommonInitStruct.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_10Cycles;
        
        ADC_Init(ADC1, &ADC_InitStruct);
        ADC_CommonInit(&ADC_CommonInitStruct);
        
        ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_15Cycles);

        ADC_Cmd(ADC1, ENABLE);
        ADC_SoftwareStartConv(ADC1);
}
chenjunt 发表于 2021-3-16 22:46 | 显示全部楼层
要说明,你遇到了什么,调试到哪个步骤,出现什么故障。
 楼主| kangzj 发表于 2021-3-16 22:48 | 显示全部楼层
就是以前用stm32f103,ADC的操作比较简单,现在用205的,写了这段驱动,一直读取不到ADC_DR数据寄存器的数据
 楼主| kangzj 发表于 2021-3-16 22:52 | 显示全部楼层
不知道问题出在DMA传输还是ADC。
huwr 发表于 2021-3-16 22:54 | 显示全部楼层
换个通道测试下看看;
gongche 发表于 2021-3-16 22:57 | 显示全部楼层
这个问题, 直接使用库里的例程就可以了
huwr 发表于 2021-3-16 22:59 | 显示全部楼层
一直读取不到ADC_DR数据寄存器的数据,不知道问题出在DMA传输还是ADC。
huanghuac 发表于 2021-3-16 23:00 | 显示全部楼层
我不知道你是怎么读的. 因为 ADC 的结果被 DMA 读了, 你的软件就检测不到 ADC 转换完成状态了.
 楼主| kangzj 发表于 2021-3-16 23:02 | 显示全部楼层
可以读取到电压了,不过还有一个问题就是,启动才读取一次,重新上电后读取的电压才有改变,目前管脚是悬空的
wenfen 发表于 2021-3-16 23:03 | 显示全部楼层

ADC_SoftwareStartConv(ADC1);

只在初始化的时候触发了一次. 你可以在主程序里也也调用触发
tian111 发表于 2021-3-16 23:05 | 显示全部楼层
或者设置 ADC 自动连续转换
songqian17 发表于 2021-3-16 23:07 | 显示全部楼层
设置是直接
ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;
吗?
chenho 发表于 2021-3-16 23:09 | 显示全部楼层
这个是有设置的,还是说有其他设置?
zwll 发表于 2021-3-16 23:13 | 显示全部楼层
是的, 你试试吧, 可能 DMA 也需要中断处理了
huwr 发表于 2021-3-16 23:15 | 显示全部楼层
没用过F2的芯片,跟F1有什么区别吗?
happy_10 发表于 2021-3-16 23:17 | 显示全部楼层

是不是通道配置有问题,建议换一个吧。
chuxh 发表于 2021-3-16 23:18 | 显示全部楼层
ADC 的结果被 DMA 读了, 软件就检测不到 ADC 转换完成状态了
 楼主| kangzj 发表于 2021-3-16 23:20 | 显示全部楼层
好的,我明天去单位试一下,多谢各位大侠了哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

672

主题

7007

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部