这段代码是什么意思?

时间:2016-12-07 17:59:38

标签: stm32 dac

while(1)
{ 
    for(x=0;x<5;)   //note: x is incremented elsewhere 
    {
        DAC->DHR12R1 = (uint16_t)(x/5.0*4095*3.0/3.3);
    }
}   

这个循环是什么意思?我知道DHR12R1是数据保持寄存器12位右边

1 个答案:

答案 0 :(得分:0)

我已将其转换为标准C程序,以查看写入DAC寄存器的值。

#include <stdio.h>
#include <stdint.h>
int x;
int main() {
  for(x=0;x<=5;x++) // Why x <= 5? See note at bottom
    printf("x=%d DAC->DHR12R1=%u\n", x, (uint16_t)(x/5.0*4095*3.0/3.3));
  return 0;
}

输出:

$ gcc -Wall -Wextra dac.c -o dac && ./dac
x=0 DAC->DHR12R1=0
x=1 DAC->DHR12R1=744
x=2 DAC->DHR12R1=1489
x=3 DAC->DHR12R1=2233
x=4 DAC->DHR12R1=2978
x=5 DAC->DHR12R1=3722

该值最终将在DAC通道1数据输出寄存器DAC->DOR1中结束,并根据公式转换为电压

U=Vref*DAC->DOR1/4095

所以,如果你的Vref是3伏特,那么你在x = 0时获得0伏特,在x = 1时获得0.545伏特等。

注意:我假设x在某个中断处理程序中递增1,然后x可以在重置为0之前简单地设置为5.如果它可以增加任意值,或者这个中断可以发生更多每次循环迭代一次,结果将在4096处回转。这意味着输出电压通常会落在GND0.727*Vref之间,偶尔会出现短暂的尖峰。 另请注意,如果在错误的时刻连续两次递增,则在x<5之前检查一次,而在此之后,在执行x=0之前,则会丢失一个脉冲。

因此,您应该考虑将限制检查移动到中断位置 增量发生,如

x = (x + 1) % 5;