搜索
ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU

[STM32F1] 为什么程序死在这

[复制链接]
125|28
 楼主 | 2020-9-29 21:39 | 显示全部楼层 |阅读模式
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束

使用特权

评论回复
| 2020-9-29 21:40 | 显示全部楼层
是第一次就死在这里了还是之前可以跳过去?

使用特权

评论回复
| 2020-9-29 21:42 | 显示全部楼层
如果是第一次的话,估计ADC没有配置对,建议检查下配置

使用特权

评论回复
| 2020-9-29 21:43 | 显示全部楼层
如果不是第一次(之前能够采样到AD正确的数据),可能是ADC转换后没有及时读取或者ADC停止了工作

使用特权

评论回复
 楼主 | 2020-9-29 21:44 | 显示全部楼层

void Lsens_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
        
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTF时钟        
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PF8 anolog输入
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //模拟输入引脚
        GPIO_Init(GPIOA, &GPIO_InitStructure);        
}
void T_Adc_Init(void)  //ADC通道初始化
{
        ADC_InitTypeDef ADC_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1        , ENABLE );          //使能GPIOA,ADC1通道时钟
  
        RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //分频因子6时钟为72M/6=12MHz

        ADC_DeInit(ADC1);  //将外设 ADC1 的全部寄存器重设为缺省值

        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //ADC工作模式:ADC1和ADC2工作在独立模式
        ADC_InitStructure.ADC_ScanConvMode = DISABLE;        //模数转换工作在单通道模式
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;        //模数转换工作在单次转换模式
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //转换由软件而不是外部触发启动
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        //ADC数据右对齐
        ADC_InitStructure.ADC_NbrOfChannel = 1;        //顺序进行规则转换的ADC通道的数目
        ADC_Init(ADC1, &ADC_InitStructure);        //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
        ADC_Cmd(ADC1, ENABLE);        //使能指定的ADC1

        ADC_ResetCalibration(ADC1);        //重置指定的ADC1的复位寄存器

    while(ADC_GetResetCalibrationStatus(ADC1));        //获取ADC1重置校准寄存器的状态,设置状态则等待

        ADC_StartCalibration(ADC1);         //开启AD校准

        while(ADC_GetCalibrationStatus(ADC1));                //获取指定ADC1的校准程序,设置状态则等待
}
u16 T_Get_Adc(u8 ch)   
        {

        ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );        //ADC1,ADC通道3,第一个转换,采样时间为239.5周期                                      

        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
        return ADC_GetConversionValue(ADC1);        //返回最近一次ADC1规则组的转换结果
        }
//读取Light Sens的值
//0~100:0,最暗;100,最亮
u8 Lsens_Get_Val(void)
{
        u32 temp_val=0;
        u8 t;
        for(t=0;t<LSENS_READ_TIMES;t++)
        {
                temp_val+=T_Get_Adc(0);                   //读取ADC值
                delay_ms(5);
        }
        temp_val/=LSENS_READ_TIMES;//得到平均值
        if(temp_val>4000)temp_val=4000;
        return (u8)(100-(temp_val/40));
}
第一次就死在这了

使用特权

评论回复
| 2020-9-29 21:45 | 显示全部楼层
检查下外围电路

使用特权

评论回复
| 2020-9-29 21:46 | 显示全部楼层
从配置上没看出什么问题

使用特权

评论回复
| 2020-9-29 21:46 | 显示全部楼层
我没用过内部的温度采集,主要是不准,速度又慢(最慢的),没办法合拍。速度慢可能是为了低功耗?

使用特权

评论回复
| 2020-9-29 21:47 | 显示全部楼层

楼主:每次读取ADC前要启动ADC转换。
ADC_SoftwareStartConvCmd(ADC1, ENABLE);

使用特权

评论回复
| 2020-9-29 21:48 | 显示全部楼层

ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能
//while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
改成延时呢
return ADC_GetConversionValue(ADC1);   

使用特权

评论回复
| 2020-9-29 21:49 | 显示全部楼层
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );        //ADC1,ADC通道3,第一个转换,采样时间为239.5周期

这句放在初始化那边看看  

使用特权

评论回复
 楼主 | 2020-9-29 21:52 | 显示全部楼层
问题解决了把delay_ms(5);屏蔽了就好使了,

使用特权

评论回复
| 2020-9-29 21:53 | 显示全部楼层
嗯,应该是转换完后你没有及时去读取的原因

使用特权

评论回复
| 2020-9-29 21:54 | 显示全部楼层
通常不建议这样使用adc

使用特权

评论回复
| 2020-9-29 21:55 | 显示全部楼层
如果你一定要这样做,有一个比较安全的办法就是,在长时间无法读到需要的信号时自己主动从循环里退出来,返回一个可以接受的数值

使用特权

评论回复
| 2020-9-29 21:57 | 显示全部楼层
兄弟你会ucos吗

使用特权

评论回复
| 2020-9-29 21:57 | 显示全部楼层
略懂,我们自己做芯片,自己写类似于UCOS一样的实时操作系统。

使用特权

评论回复
 楼主 | 2020-9-29 21:59 | 显示全部楼层
能麻烦你帮我看一下我的程序么,进不到下一个任务

使用特权

评论回复
| 2020-9-29 22:00 | 显示全部楼层
是不是ADC配置有问题?

使用特权

评论回复
| 2020-9-29 22:02 | 显示全部楼层
你的IO复用功能设置正确了吗?

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

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