19.05.2019, 13:43
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,581
Сказал спасибо: 115
Сказали Спасибо 806 раз(а) в 583 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Что-то после STM32F0 мне F1 совсем плохо дается! Пытаюсь запустить АЦП в связке с ПДП. Сам по себе АЦП работает (т.к. содержимое ADC1-›DR меняется), но ПДП не запускается — в принимающем массиве нули!
Код:
|
static inline void adc_setup(){
GPIOB-›CRL |= CRL(0, CNF_ANALOG|MODE_INPUT);
uint32_t ctr = 0;
// Enable clocking
RCC-›APB2ENR |= RCC_APB2ENR_ADC1EN;
RCC-›CFGR &= ~(RCC_CFGR_ADCPRE);
RCC-›CFGR |= RCC_CFGR_ADCPRE_DIV8; // ADC clock = RCC / 8
// wake up ADC
ADC1-›CR2 |= ADC_CR2_ADON;
// sampling time - 239.5 cycles for channels 8, 16 and 17
ADC1-›SMPR2 = ADC_SMPR2_SMP8;
ADC1-›SMPR1 = ADC_SMPR1_SMP16 | ADC_SMPR1_SMP17;
// we have three conversions in group -› ADC1-›SQR1[L] = 2, order: 8-›16-›17
ADC1-›SQR3 = 8 | (16‹‹5) | (17‹‹10);
ADC1-›SQR1 = ADC_SQR1_L_1;
// calibration
ADC1-›CR2 |= ADC_CR2_RSTCAL;
while((ADC1-›CR2 & ADC_CR2_RSTCAL) && ++ctr ‹ 0xfffff);
ADC1-›CR2 |= ADC_CR2_CAL;
ctr = 0; while((ADC1-›CR2 & ADC_CR2_CAL) && ++ctr ‹ 0xfffff);
// DMA configuration
RCC-›AHBENR |= RCC_AHBENR_DMA1EN;
DMA1_Channel1-›CPAR = (uint32_t) (&(ADC1-›DR));
DMA1_Channel1-›CMAR = (uint32_t)(ADC_array);
DMA1_Channel1-›CNDTR = NUMBER_OF_ADC_CHANNELS * 9;
DMA1_Channel1-›CCR |= DMA_CCR_MINC | DMA_CCR_MSIZE_0 | DMA_CCR_PSIZE_0 | DMA_CCR_CIRC | DMA_CCR_EN;
ADC1-›CR1 |= ADC_CR1_SCAN; // scan mode
// continuous mode & DMA; enable vref & Tsens; start
ADC1-›CR2 |= ADC_CR2_CONT | ADC_CR2_DMA | ADC_CR2_TSVREFE;
// turn ON ADC
ADC1-›CR2 |= ADC_CR2_ADON;
ADC1-›CR2 |= ADC_CR2_SWSTART;
} |
__________________
Смерть бандеровской мразоте!
|
|
|
|
19.05.2019, 14:08
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,581
Сказал спасибо: 115
Сказали Спасибо 806 раз(а) в 583 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Вот же чертова магия! Чуть поменял порядок — и заработало! Ну и где про это в даташите написано?
Код:
|
static inline void adc_setup(){
GPIOB-›CRL |= CRL(0, CNF_ANALOG|MODE_INPUT);
uint32_t ctr = 0;
// Enable clocking
RCC-›APB2ENR |= RCC_APB2ENR_ADC1EN;
RCC-›CFGR &= ~(RCC_CFGR_ADCPRE);
RCC-›CFGR |= RCC_CFGR_ADCPRE_DIV8; // ADC clock = RCC / 8
// sampling time - 239.5 cycles for channels 8, 16 and 17
ADC1-›SMPR2 = ADC_SMPR2_SMP8;
ADC1-›SMPR1 = ADC_SMPR1_SMP16 | ADC_SMPR1_SMP17;
// we have three conversions in group -› ADC1-›SQR1[L] = 2, order: 8-›16-›17
ADC1-›SQR3 = 8 | (16‹‹5) | (17‹‹10);
ADC1-›SQR1 = ADC_SQR1_L_1;
ADC1-›CR1 |= ADC_CR1_SCAN; // scan mode
// DMA configuration
RCC-›AHBENR |= RCC_AHBENR_DMA1EN;
DMA1_Channel1-›CPAR = (uint32_t) (&(ADC1-›DR));
DMA1_Channel1-›CMAR = (uint32_t)(ADC_array);
DMA1_Channel1-›CNDTR = NUMBER_OF_ADC_CHANNELS * 9;
DMA1_Channel1-›CCR |= DMA_CCR_MINC | DMA_CCR_MSIZE_0 | DMA_CCR_PSIZE_0
| DMA_CCR_CIRC | DMA_CCR_PL | DMA_CCR_EN;
// continuous mode & DMA; enable vref & Tsens; wake up ADC
ADC1-›CR2 |= ADC_CR2_DMA | ADC_CR2_TSVREFE | ADC_CR2_CONT | ADC_CR2_ADON;
// | ADC_CR2_EXTTRIG | ADC_CR2_EXTSEL | ADC_CR2_JEXTSEL;
// calibration
ADC1-›CR2 |= ADC_CR2_RSTCAL;
while((ADC1-›CR2 & ADC_CR2_RSTCAL) && ++ctr ‹ 0xfffff);
ADC1-›CR2 |= ADC_CR2_CAL;
ctr = 0; while((ADC1-›CR2 & ADC_CR2_CAL) && ++ctr ‹ 0xfffff);
// turn ON ADC
ADC1-›CR2 |= ADC_CR2_SWSTART;
ADC1-›CR2 |= ADC_CR2_ADON;
} |
__________________
Смерть бандеровской мразоте!
|
|
|
|
19.05.2019, 14:17
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.03.2007
Сообщений: 1,330
Сказал спасибо: 85
Сказали Спасибо 596 раз(а) в 361 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от eddy
|
Ну и где про это в даташите написано?
|
Bit 0 ADON: A/D converter ON / OFF
Conversion starts when this bit holds a value of 1 and a 1 is written to it.
Причем первая запись 1 туда только включит АЦП, а повторная запись даст старт преобразованию.
ADC1-›CR2 |= ADC_CR2_SWSTART, похоже тут лишнее, т.к. не установлены нужные EXTSEL (111b). Видимо оно и отменяло предыдущий старт АЦП.
|
|
|
Сказали "Спасибо" pambaru
|
|
|
19.05.2019, 14:20
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.03.2007
Сообщений: 1,330
Сказал спасибо: 85
Сказали Спасибо 596 раз(а) в 361 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Диаграмма из даташита. Еще выдержать Tstab.
|
|
|
|
19.05.2019, 14:53
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,581
Сказал спасибо: 115
Сказали Спасибо 806 раз(а) в 583 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от pambaru
|
ADC1-›CR2 |= ADC_CR2_SWSTART, похоже тут лишнее
|
Да, без него работает, спасибо.
Сообщение от pambaru
|
Еще выдержать Tstab.
|
DMA же принимает данные, так что, все ОК с этим.
Сейчас у меня другая проблема: шутки ради запихнул float, получил hardfault! Компилятор и тулчейн - с армовского сайта (потому как гентушный какую-то муть собирает, которая не работает - где-то я накосячил, наверное).
UPD: я Makefile нарукожопил, вот и не работало; переделал. Теперь все ОК.
__________________
Смерть бандеровской мразоте!
Последний раз редактировалось eddy; 19.05.2019 в 15:08.
|
|
|
|
20.05.2019, 10:12
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,581
Сказал спасибо: 115
Сказали Спасибо 806 раз(а) в 583 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Меня, похоже, в гугле забанили! Не могу найти, для каких целей в STM32F103 используется прерывание по USB_HP.
__________________
Смерть бандеровской мразоте!
|
|
|
|
20.05.2019, 12:13
|
|
Вид на жительство
Регистрация: 27.11.2007
Сообщений: 428
Сказал спасибо: 19
Сказали Спасибо 39 раз(а) в 30 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от eddy
|
Меня, похоже, в гугле забанили! Не могу найти, для каких целей в STM32F103 используется прерывание по USB_HP.
|
Я так понимаю разница, какое прерывание, от приоритета зависит.
Цитата:
|
USB_HP_CAN_TX USB High Priority
USB_LP_CAN_RX0 USB Low Priority
|
|
|
|
|
20.05.2019, 12:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,581
Сказал спасибо: 115
Сказали Спасибо 806 раз(а) в 583 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
А кто эти приоритеты расставляет и где?
__________________
Смерть бандеровской мразоте!
|
|
|
|
20.05.2019, 13:05
|
|
Вид на жительство
Регистрация: 27.11.2007
Сообщений: 428
Сказал спасибо: 19
Сказали Спасибо 39 раз(а) в 30 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Цитата:
|
– USB low-priority interrupt (Channel 20): Triggered by all USB events (Correct
transfer, USB reset, etc.). The firmware has to check the interrupt source before
serving the interrupt.
– USB high-priority interrupt (Channel 19): Triggered only by a correct transfer event
for isochronous and double-buffer bulk transfer to reach the highest possible
transfer rate.
|
Как я понимаю HP нужно для более быстрой обработки именно правильных событий, для увеличения скорости. А остальное в LP хотя туда передаются и события для HP.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо sat_art за это сообщение:
|
|
|
20.05.2019, 13:06
|
|
Вид на жительство
Регистрация: 27.11.2007
Сообщений: 428
Сказал спасибо: 19
Сказали Спасибо 39 раз(а) в 30 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
И HP конечно, как более высокоприоритетное важнее.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:47.
|
|