打印
[STM8]

永远返回RESET

[复制链接]
362|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zwll|  楼主 | 2020-11-4 20:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM8S的ADC1,等待ADC1_GetFlagStatus(ADC1_FLAG_EOC),永远返回RESET

使用特权

评论回复
沙发
wenfen| | 2020-11-4 20:53 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
板凳
zwll|  楼主 | 2020-11-4 21:03 | 只看该作者
我用STM8S的AIN0采集电压,配置如下:
GPIO_Init(GPIOB, GPIO_PIN_0, GPIO_MODE_IN_FL_NO_IT);
ADC1_DeInit();ADC1_Init(ADC1_CONVERSIONMODE_SINGLE,                 /*单次转换*/
              ADC1_CHANNEL_0,                                                                 /*目标通道*/
              ADC1_PRESSEL_FCPU_D8,                                                       /*Fadc = Fcpu/8*/
              ADC1_EXTTRIG_TIM,                                                               /*Timer1触发*/
              DISABLE,                                                                                 /*禁止外部触发*/
              ADC1_ALIGN_RIGHT,                                                               /*右对齐*/
              ADC1_SCHMITTTRIG_CHANNEL0,                                             /*禁止ADC通道的施密特触发功能*/
              DISABLE                                                                                  /*以降低IO的静态功耗*/
             );

ADC1_Cmd(ENABLE);
ADC1_StartConversion();
while(ADC1_GetFlagStatus(ADC1_FLAG_EOC) == RESET);
。。。。。。
上面的程序,永远在while()处等待

使用特权

评论回复
地板
zwll|  楼主 | 2020-11-4 21:07 | 只看该作者
是不是还差一个配置呀,导致永远转换不完?

使用特权

评论回复
5
dingy| | 2020-11-4 21:13 | 只看该作者

/*Timer1触发*/

有触发吗,改为软件触发

使用特权

评论回复
6
zwll|  楼主 | 2020-11-4 21:16 | 只看该作者
你意思是ADC1_EXTTRIG_TIM下面的DISABLE改成ENABLE?

使用特权

评论回复
7
chenjunt| | 2020-11-4 21:19 | 只看该作者

感觉你的配置有问题

ADC1_EXTTRIG_TIM,看看触发源里面有没有软件触发的定义

使用特权

评论回复
8
zwll|  楼主 | 2020-11-4 21:24 | 只看该作者

typedef enum
{
  ADC1_EXTTRIG_TIM   = (uint8_t)0x00, /**< Conversion from Internal TIM1 TRGO event */
  ADC1_EXTTRIG_GPIO  = (uint8_t)0x10  /**< Conversion from External interrupt on ADC_ETR pin*/
} ADC1_ExtTrig_TypeDef;

这是stm8s_adc1.h里面的定义,ADC1触发方式有两种,外部引脚触发和TIM1触发,我用TIM1触发,ADC1_ExtTriggerState也改成了ENABLE,改后的代码如下:
GPIO_Init(GPIOB, GPIO_PIN_0, GPIO_MODE_IN_FL_NO_IT);
ADC1_DeInit();ADC1_Init(ADC1_CONVERSIONMODE_SINGLE,                 /*单次转换*/
              ADC1_CHANNEL_0,                                                                 /*目标通道*/
              ADC1_PRESSEL_FCPU_D8,                                                       /*Fadc = Fcpu/8*/
              ADC1_EXTTRIG_TIM,                                                               /*Timer1触发*/
              ENABLE,                                                                                /*使能TIM1触发*/
              ADC1_ALIGN_RIGHT,                                                               /*右对齐*/
              ADC1_SCHMITTTRIG_CHANNEL0,                                             /*禁止ADC通道的施密特触发功能*/
              DISABLE                                                                                  /*以降低IO的静态功耗*/
             );

ADC1_Cmd(ENABLE);
ADC1_StartConversion();
while(ADC1_GetFlagStatus(ADC1_FLAG_EOC) == RESET);
。。。。。。
程序执行结果还是一样,永远在while()处等待,现在触发源TIM1在配置函数里已经打开了,难道TIM1需要单独配置一下吗?

使用特权

评论回复
9
xxmmi| | 2020-11-4 21:27 | 只看该作者
TIM1应该也要正确配置的

使用特权

评论回复
10
zwll|  楼主 | 2020-11-4 21:34 | 只看该作者
电压已经读出来了,TIM1确实不用配置

使用特权

评论回复
11
yufe| | 2020-11-4 21:37 | 只看该作者
犯了个低级错误

使用特权

评论回复
12
zwll|  楼主 | 2020-11-4 21:41 | 只看该作者
嗯,我的判断语句不是前面发的帖子的while(),是if(ADC1_GetFlagStatus(ADC1_FLAG_EOC) == SET)

使用特权

评论回复
13
zhanglli| | 2020-11-4 21:45 | 只看该作者
问题在这句话里,永远进入不了if语句的{}内

使用特权

评论回复
14
zwll|  楼主 | 2020-11-4 21:50 | 只看该作者
知道怎么回事了,多谢大家

使用特权

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

本版积分规则

885

主题

11314

帖子

5

粉丝