Jump to content

    

Проблема с ADC в STM32F3 Discovery

Здравствуйте!

Пытаюсь запустить АЦП. Согласно пункту 15.3.6 ADC voltage regulator пишу последовательность включения регулятора.

ADVREG enable sequence
To enable the ADC voltage regulator, perform the sequence below:
1. Change ADVREGEN[1:0] bits from ‘10’ (disabled state, reset state) into ‘00’.
2. Change ADVREGEN[1:0] bits from ‘00’ into ‘01’ (enabled state).

 

Получается так...

//ADC voltage regulator enable sequence
	ADC1->CR |= ~(1<<29|1<<28); //ADVREGEN[1:0]:00, Intermediate state
	ADC1->CR |=  (0<<29|1<<28); //ADVREGEN[1:0]:01, ADC voltage regulator enable
	_delay_us(100);

Да не тут то было, в отладчике биты регистра CR другие!

Clip2net_190226224727.png.930ef6b53252822981217c556be19179.png

Нашел в нете, что у stm32l476 например DEEPPWD бит отвечает за Deep-power-down mode. Само собой с таким кодом программа зависает...

Как может быть, что референс не совпадает с реальными регистрами микроконтроллера?

Как всё таки включить регулятор??

Share this post


Link to post
Share on other sites

В сбросе амперсанд поставьте.

 

Share this post


Link to post
Share on other sites
10 hours ago, Сёха said:

в отладчике биты регистра CR другие

Есть такая беда с ST'шной периферией.

Они периодически меняют периферию, и писатели отладчиков и прочих периферийных драйверов в этом путаются. Видимо, и тут пропустили отличия и вставили описание от стандартного АЦП.

Слава богу, в документации ошибок таких нет (я не слышал, по крайней мере).

Share this post


Link to post
Share on other sites

Вот так работает

    ADC3->CR = (1<<28);   // ADC voltage regulator enable
// delay 10+ uSec
    for(i=360; i; i--);

//    ADC3->CR |= (1<<31);
//    while(ADC3->CR & (1<<31));
//
    ADC3->CR |= (1<<0); // Enable ADC

Share this post


Link to post
Share on other sites
7 minutes ago, mcheb said:

Вот так работает

// delay 10+ uSec
    for(i=360; i; i--);

... но имеет полное право не работать.

См. волшебное слово волатайл.

Share this post


Link to post
Share on other sites
13 часов назад, Сёха сказал:

Как всё таки включить регулятор??

А такты для АЦП настроили и разрешили?

Share this post


Link to post
Share on other sites
2 минуты назад, ViKo сказал:

А такты для АЦП настроили и разрешили?

Там кроме тактов еще бы и время определенное выжидать.

У F3 такого в ES не нашел, но у некоторых (ака F051) ADEN, к примеру, не может быть установлен сразу после калибровки.

У F3 есть многообещающая:

Software is allowed to set ADEN only when all bits of ADC_CR registers are 0 (ADCAL=0,
JADSTART=0, ADSTART=0, ADSTP=0, ADDIS=0 and ADEN=0) except for bit ADVREGEN
which must be 1 (and the software must have wait for the startup time of the voltage regulator)

Боюсь,

for(i=360; i; i--);

- не очень надежное решение.

Share this post


Link to post
Share on other sites
38 minutes ago, adnega said:

Боюсь,

for(i=360; i; i--);

- не очень надежное решение.

Русским языком написано, что работает. Поэтому и

//    ADC3->CR |= (1<<31);
//    while(ADC3->CR & (1<<31));
//

закомментировано

Share this post


Link to post
Share on other sites
Только что, mcheb сказал:

Русским языком написано, что работает. Поэтому и

//    ADC3->CR |= (1<<31);
//    while(ADC3->CR & (1<<31));
//

закомментировано

Что ж, когда перестанет работать - обращайтесь - поможем ;)

Share this post


Link to post
Share on other sites
2 минуты назад, mcheb сказал:

Русским языком написано, что работает. Поэтому и

Если i объявлено без volatile, то хоть на каком языке - не работает.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this