打印
[STM32F0]

STM32F0 AD模块不能正常使用!

[复制链接]
3177|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小S咯|  楼主 | 2018-1-3 16:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 小S咯 于 2018-1-3 16:50 编辑

今天发现了一个奇怪的现象。。。。望大神解答
本人用的是STM32F030K6T6芯片,之前写好了程序没问题。现在程序加了AD模块,利用热敏电阻测温度。因为一直是调试状态下进行,程序也可以正常运行。
现在拔掉了STLINK,下载到板子上跑就不正常了。
源程序是STM8通过串口转485信号,发送给STM32F0,STM32F0接到后亮对应的灯,下载板子后,只亮了初始的灯,STM8怎么发都没反应。接上STLINK进入调试模式又正常了。还有把AD屏蔽了,下载板子就正常了
什么情况??
沙发
小S咯|  楼主 | 2018-1-3 16:57 | 只看该作者
本帖最后由 小S咯 于 2018-1-3 17:04 编辑

找到问题所在,但是不知道怎么解决。
这是我采集AD值函数,没有开中断,是不是卡在while???为什么调试的时候没问题
u32 ADC_GetValue(void)
{
    u32 temp;
    ADC_StartOfConversion(ADC1);
    while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==0);
    temp = ADC_GetConversionValue(ADC1);
    return temp;
}

使用特权

评论回复
板凳
小S咯|  楼主 | 2018-1-3 17:05 | 只看该作者
找到了。
没有清标志,加上    ADC_ClearFlag(ADC1,ADC_FLAG_EOC);
调试的时候读DR寄存器会自动清标志,下载到板子上不会自动清标志,加上就好

使用特权

评论回复
地板
lzbf| | 2018-1-3 17:07 | 只看该作者
没有启动正常吧。

使用特权

评论回复
5
houjiakai| | 2018-1-3 17:07 | 只看该作者
6
youtome| | 2018-1-3 17:08 | 只看该作者
程序是怎么配置的

使用特权

评论回复
7
cemaj| | 2018-1-3 17:08 | 只看该作者
ad采样程序呢?

使用特权

评论回复
8
updownq| | 2018-1-3 17:08 | 只看该作者
小S咯 发表于 2018-1-3 16:57
找到问题所在,但是不知道怎么解决。
这是我采集AD值函数,没有开中断,是不是卡在while???为什么调试的 ...

应该是这个标志位没有读取通过。

使用特权

评论回复
9
lzbf| | 2018-1-3 17:09 | 只看该作者
小S咯 发表于 2018-1-3 16:57
找到问题所在,但是不知道怎么解决。
这是我采集AD值函数,没有开中断,是不是卡在while???为什么调试的 ...

while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==0);检测的标志位怎么样了

使用特权

评论回复
10
houjiakai| | 2018-1-3 17:09 | 只看该作者

static void GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    /* Enable the GPIOA Clock */
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

    /* Configure PA.1 (ADC Channel1) & PA.4 (ADC Channel4) in analog mode */
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_1 | GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
    GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

static void DMA_Config(void)
{
    DMA_InitTypeDef DMA_InitStructure;

    /* Enable DMA1 clock */
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
    //DMA1通道1配置
    DMA_DeInit(DMA1_Channel1);
    //外设地址
    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_ADDRESS;
    //内存地址
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&RegularConvertedAdcValue;
    //DMA传输方向单向
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    //设置DMA在传输时缓冲区的长度
    DMA_InitStructure.DMA_BufferSize = 2;
    //设置DMA的外设递增模式,一个外设
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    //设置DMA的内存递增模式
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    //外设数据字长
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
    //内存数据字长
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    //设置DMA的传输模式:连续不断的循环模式
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
    //设置DMA的优先级别
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    //设置DMA的2个memory中的变量互相访问
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

    DMA_Init(DMA1_Channel1, &DMA_InitStructure);

    /* Enable DMA1 Channel1 */
    DMA_Cmd(DMA1_Channel1, ENABLE);
}

static void ADC_Config(void)
{
    ADC_InitTypeDef  ADC_InitStructure;

    /* ADC1 DeInit */
    ADC_DeInit(ADC1);

    /* Load ADC default value */
    ADC_StructInit(&ADC_InitStructure);

    /* Enable ADC1 clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

    //转换分辨率
    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
    //连续转换
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    //外部触发禁止
    ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    //ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_TRGO;
    //数据右对齐
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    //扫描方向
    ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;

    ADC_Init(ADC1, &ADC_InitStructure);

    /* ADC1 regular channel1 configuration */
    ADC_ChannelConfig(ADC1, ADC_Channel_1, ADC_SampleTime_55_5Cycles);
    ADC_ChannelConfig(ADC1, ADC_Channel_4, ADC_SampleTime_55_5Cycles);

    /* ADC Calibration */
    ADC_GetCalibrationFactor(ADC1);

    /* ADC DMA request in Circular mode */
    ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);

    /* Enable ADC DMA request */
    ADC_DMACmd(ADC1, ENABLE);

    /* Enable ADC1 */
    ADC_Cmd(ADC1, ENABLE);

    /* Wait until the ADC enable falg is set to start conversion */
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));

    /* Start ADC1 Software Conversion */
    ADC_StartOfConversion(ADC1);
}

使用特权

评论回复
11
youtome| | 2018-1-3 17:09 | 只看该作者
外部的ADIO配置有问题吗?

使用特权

评论回复
12
cemaj| | 2018-1-3 17:09 | 只看该作者
配置的有问题吧。

使用特权

评论回复
13
updownq| | 2018-1-3 17:09 | 只看该作者
小S咯 发表于 2018-1-3 16:57
找到问题所在,但是不知道怎么解决。
这是我采集AD值函数,没有开中断,是不是卡在while???为什么调试的 ...

可以使用计数的方式,多少次读取不通过之后,程序就跳过。

使用特权

评论回复
14
小S咯|  楼主 | 2018-1-3 17:35 | 只看该作者
问题解决了。谢谢各位,一起进步。。

使用特权

评论回复
15
小S咯|  楼主 | 2018-1-3 17:37 | 只看该作者
lzbf 发表于 2018-1-3 17:09
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==0);检测的标志位怎么样了

大意了。之前看数据手册,他说读DR会自动清标志,我就没写了,调试的时候也确实会清标志,只是下载到板子上就不会清了,读了第一次,第二次开始卡在while了,手动清一下标志就OK了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

178

帖子

4

粉丝