打印
[STM8]

STM8S103F3 ADC转换时间问题

[复制链接]
3215|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hudiqi|  楼主 | 2014-9-12 18:21 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
时钟采用内部RC,系统时钟16M,ADC时钟4M,采用连续转换。ADC不取值转换时间3.5us 取值以后转换时间15.6us。转换时间一下子慢了这么多,不知道哪位前辈可以解答一下。
ADC配置文件如下:
#include "ADC.h"
void ADC_init(void)
{
  CLK_PCKENR2 |= (1<<4);         //enabled ADC1 clock

  ADC_CR1 = 0x22;                //fADC = fMASTER/4,Continuous conversion mode
  ADC_CR2 = 0x08;                //Right alignment
  ADC_CR3 = 0x00;                //Data buffer disabled
  ADC_CSR |= 0x04;               //ADC channel 4
  ADC_CSR |= 0x20;               //Interrupt enable for EOC
  ADC_TDRL = 0xff;
  ADC_CR1 |= 0x01;
  ADC_CR1 |= 0x01;
}

uint16_t ADC_GetConversionValue(void)
{
  u16 ADC_temp;
  ADC_temp = ADC_DRH;           //ADC_temp
  ADC_temp = ADC_temp<<8;        //TEMP左移八位
  ADC_temp = ADC_temp+ADC_DRL;  //把第八位加上
  return  ADC_temp;
}
中断函数:
#pragma vector=0x18   
__interrupt void ADC1_IRQHandler(void)
{
    ADC_CSR &= ~0x80;            //清空转换完成标志位EOC
    //ADC_Val = ADC_GetConversionValue();
    PB5_out = ~PB5_out;
}
注释掉ADC_Val = ADC_GetConversionValue();转换时间是3.5us
去掉注释转换时间为15.6us
沙发
mmuuss586| | 2014-9-12 19:22 | 只看该作者
不调用函数,直接读取寄存器,测试下。
应该会提高不少;

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
hudiqi + 1 很给力!
板凳
airwill| | 2014-9-12 21:07 | 只看该作者
看样子问题在
  ADC_temp = ADC_temp<<8;        //TEMP左移八位
16位数移位这么多次, 费了好多时间.
可以用联合的数据类型来避免移位操作.

使用特权

评论回复
地板
hudiqi|  楼主 | 2014-9-13 08:16 | 只看该作者
mmuuss586 发表于 2014-9-12 19:22
不调用函数,直接读取寄存器,测试下。
应该会提高不少;

在中断里面直接读取寄存器值,不调用函数时间确实减少很多。现在用时是3.6us。
可以解释一下为什么中断里面调用函数会这么耗时间吗?

使用特权

评论回复
5
hudiqi|  楼主 | 2014-9-13 08:23 | 只看该作者
为啥我的不能评分和结贴?第一次发帖,求指导。



使用特权

评论回复
6
saviourxx| | 2014-9-13 11:00 | 只看该作者
#define ADC1_DR_ADDR    (*(uint32_t*)0x40012440)
__IO uint16_t ADC_ConvVal;
void ADC1_IRQHandler(void)
{       
//        uint16_t *val;
       
  if(ADC_GetITStatus(ADC1, ADC_IT_EOC) != RESET)
  {                 
                /* Clear ADC1 AWD pending interrupt bit */
    ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
//    ADC_ConvVal = ADC_GetConversionValue(ADC1);
                ADC_ConvVal = ADC1_DR_ADDR;

直接读基地址不就行了嘛?
中断进函数要bl跳转指令啊,如果带参数还要压栈和出栈,你看下汇编指令

使用特权

评论回复
7
mmuuss586| | 2014-9-13 11:36 | 只看该作者
hudiqi 发表于 2014-9-13 08:23
为啥我的不能评分和结贴?第一次发帖,求指导。

重新分配分数,再结贴1次即可;

使用特权

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

本版积分规则

5

主题

18

帖子

1

粉丝