野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14202|回复: 2

【F1-ADC】STM32 ADC 库函数 【ADC_SoftwareStartConvCmd()】的疑惑

[复制链接]
发表于 2015-10-1 15:15:58 | 显示全部楼层 |阅读模式
STM32F1的库中,有个软件触发ADC转换的函数,ADC在触发的时候有软件触发和外部事件触发(含内部定时器的事件和外部IO)。
软件触发函数的原型如下:
  1. void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState)
  2. {
  3.   /* Check the parameters */
  4.   assert_param(IS_ADC_ALL_PERIPH(ADCx));
  5.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  6.   if (NewState != DISABLE)
  7.   {
  8.     /* Enable the selected ADC conversion on external event and start the selected
  9.        ADC conversion */
  10.     ADCx->CR2 |= CR2_EXTTRIG_SWSTART_Set;
  11.   }
  12.   else
  13.   {
  14.     /* Disable the selected ADC conversion on external event and stop the selected
  15.        ADC conversion */
  16.     ADCx->CR2 &= CR2_EXTTRIG_SWSTART_Reset;
  17.   }
  18. }
复制代码
在库函数中跟踪:CR2_EXTTRIG_SWSTART_Reset 这个宏的定义是:0X 00 50 00 00,是将ADC_CR2寄存器的位22:SWSTART位20:EXTTRIG 都置1,
这样的话就是开启了 软件触发 外部触发 这两个功能。按道理来说,开启软件触发功能只需要将位22:SWSTART置1即可,位20:EXTTRIG不用写1而是写0。
那么代码应该是这样:ADC_CR2 = 0X00 40 00 00;而不是ADC_CR2= 0X00 50 00 00所以,这是否是库函数的一个bug,还是我暂时理解有误。暂时写这个帖子留个笔记。


在接下来的一个函数:获取软件触发状态的函数中,判断的只是位22:SWSTART,而没有判断位20:EXTTRIG
获取软件触发状态的函数原型如下:
  1. FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx)
  2. {
  3.   FlagStatus bitstatus = RESET;
  4.   /* Check the parameters */
  5.   assert_param(IS_ADC_ALL_PERIPH(ADCx));
  6.   /* Check the status of SWSTART bit */
  7.   if ((ADCx->CR2 & CR2_SWSTART_Set) != (uint32_t)RESET)
  8.   {
  9.     /* SWSTART bit is set */
  10.     bitstatus = SET;
  11.   }
  12.   else
  13.   {
  14.     /* SWSTART bit is reset */
  15.     bitstatus = RESET;
  16.   }
  17.   /* Return the SWSTART bit status */
  18.   return  bitstatus;
  19. }
复制代码
函数里面的宏:CR2_SWSTART_Set的定义是:0X00 40 00 00,只判断了位22:SWSTART。根据寄存器的手册描述:当位22:SWSTART由软件置1启动转换之后,硬件马上清除此位。
所以判断是否开始启动,应该是获取位22:SWSTART的状态。而位20:EXTTRIG置1只是表示使用外部事件启动转换,至于是否启动成功,硬件不会清除此位。


ADC_CR2寄存器位22:SWSTART位20:EXTTRIG说明如下:
1.jpg


回复

使用道具 举报

发表于 2015-10-30 15:31:48 | 显示全部楼层
火哥提到这个ADC_CR2= 0X00 50 00 00的问题,我也没想明白,不过我猜测可能是没有一个独立的函数来控制开启外部事件触发,所以本意就是把这二个放一块的吧!个人看法,还有一点不明白的想请教下火哥就是FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx)这个函数内部检测SWSTART位的值,手册上面写了,只要开始发生转换,硬件就会立马把它清零,这样的话,我们读取到这个SWSTART位的值应该是0才表示转换开始了吗,为什么函数源码是1才表示成功转换呢?
回复 支持 反对

使用道具 举报

发表于 2016-1-19 16:33:10 | 显示全部楼层
火哥 ,看到这个问题,还是没有理解
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 10:24 , Processed in 0.029085 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表