stm32 после запуска ADC1 не выставляется EOC
среда IAR. STM32L-DISCOVERY. после запуска одиночного преобразования не выставляется бит EOC. если его вообше не опрашивать (не ожидать его выставления) - ADC работает, а с ожиданием - нет.
Только что выяснил что цикл ожидания проходит успешно, только пошагово его прошагать нельзя, если шагать по программе (F11) на цикле while ((ADC1-›SR & ADC_SR_EOC) != ADC_SR_EOC) программа останавливается навсегда. особенность IAR что ли...
код
int main()
{
//------------------- настройка портов ввода вывода -------------------
//тактирование порта С
RCC-›APB2ENR |= RCC_APB2ENR_IOPCEN; //тактирование порта C, на нем светодиоды и ADC вход
//настрйка портов ввода вывода
GPIOC-›CRH |= GPIO_CRH_MODE8_0; //вывод PC8 порта B настраиваем как выход, светодиод 1
GPIOC-›CRH &= ~GPIO_CRL_CNF0; //режим Push-Pull для вывода PC8 порта C, светодиод 1
GPIOC-›CRH |= GPIO_CRH_MODE9_0; //вывод PC9 порта B настраиваем как выход, светодиод 2
GPIOC-›CRH &= ~GPIO_CRL_CNF1; //режим Push-Pull для вывода PC9 порта C, светодиод 2
GPIOC-›CRH |= GPIO_CRH_MODE10_0; //вывод PC1 порта B настраиваем как выход
GPIOC-›CRH &= ~GPIO_CRL_CNF2; //режим Push-Pull для вывода PC1 порта C
//настройка ADC
GPIOC-›CRL &= ~GPIO_CRL_MODE; //настройка входа ADC - вход
GPIOC-›CRL |= GPIO_CRL_CNF0_0; //без подтяжки
//--------------------------- настройка ADC ---------------------------/
//void mcu_adc_init(void) //настройка ADC
RCC-›CFGR &= ~RCC_CFGR_ADCPRE; //обнуялем биты предделитяля (неизмен)
RCC-›CFGR |= RCC_CFGR_ADCPRE_DIV2; //устанавливаем биты предделителя (неизмен)
RCC-›APB2ENR |= RCC_APB2ENR_ADC1EN; //разрешаем тактирование модуля ADC1
ADC1-›SQR1 &= ~ADC_SQR1_L ; //биты L указывающие колличество в группе regular. 0000 - одно преобразование
ADC1-›SQR3 = ADC_SQR3_SQ1_1 | ADC_SQR3_SQ1_3; //выставляем P0 - входом ADC
ADC1-›CR2 = ADC_CR2_EXTSEL_0 | ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_2 | ADC_CR2_EXTTRIG; //выставляем от чего будет запускаться ADC
ADC1-›CR2 |= ADC_CR2_ADON; //подаем питание на ADC
ADC1-›CR2 |= ADC_CR2_RSTCAL; //производим каллибровку
while ((ADC1-›CR2 & ADC_CR2_RSTCAL) == ADC_CR2_RSTCAL) {}
ADC1-›CR2 |= ADC_CR2_CAL;
while ((ADC1-›CR2 & ADC_CR2_CAL) == ADC_CR2_CAL) {}
//--------------------------- основной цикл ---------------------------/
while(1)
{
ADC1-›CR2 |= ADC_CR2_SWSTART; //запуск преобразования ADC
//while ((ADC1-›SR & ADC_SR_EOC) != ADC_SR_EOC){} ; //ожидание преобразования
/* !!!! с раскоментированной строкой выше не работает !!!
}
}
может кто знает в чем проблема?
__________________
Kvsrk85(Андрей)
Последний раз редактировалось kvark85; 03.07.2013 в 10:57.
|