Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32 SWSTART
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Stepan_L
Привет всем.Люди добрые, что то не получается установить SWSTART.Все остальные например TSVREFE, нормально "поднимаются",а этот что-то ?????
IAR 5.41 STM32F100 вот код

void ADC_init(void)
{
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // такты на АЦП
ADC1->CR2 |= ADC_CR2_ADON; // питание на АЦП
ADC1->CR2 |= ADC_CR2_TSVREFE; // питание на темп. сенсор и датчик напр.
ADC1->CR2 |= ADC_CR2_EXTSEL; // запуск преобразования по установки бита swstart
ADC1->CR2 |= ADC_CR2_EXTTRIG; // включаем запуск от внешнего события (у нас это свтарт)
ADC1->SMPR1 |= ADC_SMPR1_SMP16; // ставлю макс. кол-во цыклов (239.5) на преобразование для 16 канала где теп. сенсор
ADC1->SQR3 = ADC_SQR3_SQ1_4; // выбираем 16 канал для 1 преобразования (0b10000)
}

в main
ADC1->CR2 |= 0x00400000;//ADC_CR2_SWSTART; // запуск преобразования
SWSTART как был,так и сидит в 0.

Сергей Борщ
QUOTE (Stepan_L @ Jan 23 2012, 10:26) *
SWSTART как был,так и сидит в 0.
Невнимательно читаете документацию:
QUOTE
This bit is set by software to start conversion and cleared by hardware as soon as conversion starts.

Stepan_L
Даааааааааа......ну тогда почему преобразование не завершается ????
maksimp
Так вроде работает. Только здесь был канал 2 и время выборки меньше:
Код
s32 i;

RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;

ADC1->SMPR2=ADC_SMPR2_SMP2_0*2; // 2 = время выборки 13.5 циклов такт частоты АЦП, Rвых <= 11.4 Ком
ADC1->SQR1=ADC_SQR1_L_0*(1-1); // 1 = кол-во каналов
ADC1->SQR3=ADC_SQR3_SQ1_0*2; // 2 = канал номер 2

ADC1->CR1=0;
ADC1->CR2=ADC_CR2_EXTSEL_0*7 | // 7 = программный старт АЦП с помощью ADC_CR2_SWSTART
           ADC_CR2_EXTTRIG; // разрешить запуск, в том числе программный запуск

ADC1->CR2 |= ADC_CR2_ADON; // включить

ADC1->CR2 |= ADC_CR2_RSTCAL; // сбросить калибровку
i=0;
while(i<10000 && (ADC1->CR2 & ADC_CR2_RSTCAL)) i++; // дождаться пока сбросится

ADC1->CR2 |= ADC_CR2_CAL; // калибровка
i=0;
while(i<10000 && (ADC1->CR2 & ADC_CR2_CAL)) i++; // дождаться

потом
Код
  ADC1->SR = ~ADC_SR_EOC;
  ADC1->CR2 |= ADC_CR2_EXTTRIG|ADC_CR2_SWSTART; // начать преобразование

  i=0;
  while((!(ADC1->SR & ADC_SR_EOC)) && i<1000) i++; // конец преобразования - сбрасывается при чтении ADC_DR

  acp_d = ADC1->DR; // результат АЦП

Stepan_L
спасибо,стал работать,у меня канал 17,термодатчик, сейчас разберусь какая разница между вашим и моим кодом. Может быть все в ADC_CR2_CAL???
maksimp
Цитата(Stepan_L @ Jan 23 2012, 14:36) *
спасибо,стал работать,у меня канал 17,термодатчик, сейчас разберусь какая разница между вашим и моим кодом. Может быть все в ADC_CR2_CAL???

У меня долго не работало, самая неочевидная оказалась эта строчка:
Код
ADC1->SR = ~ADC_SR_EOC;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.