01.03.2017, 19:20
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Да. Мне в том случае требовалось, чтобы частота дискретизации АЦП была в 4 раза выше частоты дискретизации ЦАП. Это было применительно к аудиосигналу.
Но позже, в результате испытаний выяснил, что и для ЦАП тоже нужна высокая частота дискретизации - так называемый оверсемплинг. Это позволяет улучшить работу фильтра, подавляющего гармоники частоты дискретизации. Поэтому, от RCR отказался.
Не зря же во всех нормальных аудио-ЦАПах как раз и применяется внутренний оверсемплинг в 64 или 128 раз.
UG - это Update Generation, принудительная геренация событития UEV (обновления). То есть, можно записать TIM1-›EGR = TIM_EGR_UG, и таймер начнет считать с 0 (или с ARR, если счет вниз) и будет сгенерировано UEV.
Это можно использовать для программной синхронизации счета таймера с каким-либо программным событием. Например, после приема по UART байта 0x30 нужно отсчитать 10 секунд.
URS в регистре CR1 - это выбор источников, приводящих к генерации прерывания или запроса DMA по событию обновления.
В нормальном режиме (бит не установлен) прерыв.или запрос DMA по UEV возможны от любого источника - переполнение таймнра (цикл счета), программная генерация обновления UG, триггеры запуска. При установленном бите этим источником является только переполнение таймера.
Есть еще один интересный бит в CR1 - UDIS, запрет геренации события обновления. Причем, счетчик считает как и положено, а вот ни прерывания, ни запроса DMA, ни даже загрузки нового значения ARR - не будет.
Последний раз редактировалось NewWriter; 01.03.2017 в 19:41.
|
|
|
|
01.03.2017, 22:20
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Мужики, поделитесь, пожалуйста, рабочим примером (без калокубов) I2C1 на STM32F042. А то что-то туплю.
Инициализирую:
Нажмите, чтобы открыть спойлер
Код:
|
void i2c_setup(){
// GPIO
RCC-›AHBENR |= RCC_AHBENR_GPIOAEN; // clock
GPIOA-›AFR[1] &= ~0xff0; // alternate function F1 for PB10 & PB11
GPIOA-›AFR[1] |= 0x440;
GPIOA-›OTYPER |= GPIO_OTYPER_OT_9 | GPIO_OTYPER_OT_10; // opendrain
GPIOA-›MODER &= ~(GPIO_MODER_MODER9 | GPIO_MODER_MODER10);
GPIOA-›MODER |= GPIO_MODER_MODER9_AF | GPIO_MODER_MODER10_AF; // alternate function
// I2C
RCC-›APB1ENR |= RCC_APB1ENR_I2C1EN; // timing
RCC-›CFGR3 |= RCC_CFGR3_I2C1SW; // use sysclock for timing
// Clock = 6MHz, 0.16(6)us, need 5us (*30)
// PRESC=4 (f/5), SCLDEL=0 (t_SU=5/6us), SDADEL=0 (t_HD=5/6us), SCLL,SCLH=14 (2.(3)us)
I2C1-›TIMINGR = (4‹‹28) | (14‹‹8) | (14); // 0x40000e0e
I2C1-›CR1 = I2C_CR1_PE;// | I2C_CR1_RXIE; // Enable I2C
} |
Пытаюсь писать:
Нажмите, чтобы открыть спойлер
Код:
|
uint8_t htu_write_i2c(uint8_t data){
while(I2C1-›ISR & I2C_ISR_BUSY); // check busy
while(I2C1-›CR2 & I2C_CR2_START); // check start
I2C1-›CR2 = 1‹‹16 | HTU21_ADDR | I2C_CR2_AUTOEND; // 1 byte, autoend
// now start transfer
I2C1-›CR2 |= I2C_CR2_START;
while(!(I2C1-›ISR & I2C_ISR_TXIS)){ // ready to transmit
if(I2C1-›ISR & I2C_ISR_NACKF){
I2C1-›ICR |= I2C_ICR_NACKCF;
return 0;
}
}
I2C1-›TXDR = data; // send data
return 1;
} |
Нагрузки на линии нет, нет и подтягивающих резисторов (хочу для начала проверить, как оно будет себя при обрыве вести). На
Код:
|
while(!(I2C1-›ISR & I2C_ISR_TXIS)){ |
Виснет! Я так понимаю, что раз подтяжки нет, он NACK не получает что ли?
И как в этом случае правильно ожидать подтверждения, чтобы зависона не было?
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
01.03.2017, 22:35
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Читай доки по И2Ц и референс для МК. Рано тебе ещё прогу писать.
|
|
|
|
01.03.2017, 22:50
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Все заработало. Добавил проверку таймаутов:
Нажмите, чтобы открыть спойлер
Код:
|
extern volatile uint32_t Tms; // system counter, milliseconds
uint8_t htu_write_i2c(uint8_t data){
cntr = Tms;
while(I2C1-›ISR & I2C_ISR_BUSY) if(Tms - cntr › 5) return 0; // check busy
cntr = Tms;
while(I2C1-›CR2 & I2C_CR2_START) if(Tms - cntr › 5) return 0; // check start
I2C1-›CR2 = 1‹‹16 | HTU21_ADDR | I2C_CR2_AUTOEND; // 1 byte, autoend
// now start transfer
I2C1-›CR2 |= I2C_CR2_START;
cntr = Tms;
while(!(I2C1-›ISR & I2C_ISR_TXIS)){ // ready to transmit
if(I2C1-›ISR & I2C_ISR_NACKF){
I2C1-›ICR |= I2C_ICR_NACKCF;
return 0;
}
if(Tms - cntr › 5) return 0;
}
I2C1-›TXDR = data; // send data
return 1;
} |
Теперь просто 0 возвращает, если отключить датчик.
Странно, что с лету завелось (думал, с таймингами дольше возиться буду). Разве что ересь какую-то пишет:
Код:
|
Temperature: 264/10 degrC
Humidity: 3/10 % |
Хотя влажность 38%... Сейчас буду разбираться.
Нашел косяк - вместо умножния на 10 зачем-то в вычислялке температуры делил.
Вот код на гитхабе
__________________
Союз Советских Социалистических Округов Северной Америки
Последний раз редактировалось eddy; 01.03.2017 в 22:58.
|
|
|
|
08.03.2017, 04:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Tdts - это такт таймера ?
И включается dead-time при включении CCxE=1 and CCxNE=1 как я понял.
__________________
Глаза боятся,а руки делают.
Последний раз редактировалось CERGEI1982; 08.03.2017 в 04:46.
|
|
|
|
08.03.2017, 23:59
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Господа, запускаю консоль USART на STM32F030CC. Данные приходят и по средствам DMA ложатся в буфер. Требуется вызвать прерывание по совпадению символа (\n) - перенос каретки. Все прерывания работают, кроме этого. Не вызывается никак. Инитиализирую так:
USART3-›CR2 |= ('\n' ‹‹ 24);
USART_ITConfig(USART3, USART_IT_CM, ENABLE);
Может я чего-то не понимаю? DMA работает исправно. Данные входят-выходят, но никак не вызывается конкретно это прерывание.
|
|
|
|
09.03.2017, 03:15
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от Easyrider83
|
USART3-›CR2 |= ('\n' ‹‹ 24);
|
А в этот CR2 отладчиком смотрели, там записывается то, что вы хотели, в нужных позициях? А то так-то без приведения '\n' к uint32 выражение ('\n' ‹‹ 24) вполне себе имеет право быть равно нулю...
|
|
|
|
09.03.2017, 10:26
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
AR_Favorit, да, разумеется, все что можно, проверено.
Сейчас работает по прерыванию Time Out. Но это расходится с логикой консоли. Символы могут вводится и вручную, надо ловить перенос каретки, а не пихать потом задержки между передачами.
|
|
|
|
09.03.2017, 10:56
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Easyrider83, хм, а разве STM32F030 вообще умеет такое? Из RM0360 все упоминания о "CR/LF character recognition", как и вообще о модбасе, выпилены (в описании регистров USARTx_CR2 и USARTx_ISR осталось, но, возможно, просто злокопипаст), в отличие от RM0091, который идет на STM32F031...
Последний раз редактировалось AR_Favorit; 09.03.2017 в 11:00.
|
|
|
|
09.03.2017, 11:14
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Цитата:
|
Bits 31:28 ADD[7:4]: Address of the USART node
This bit-field gives the address of the USART node or a character code to be recognized.
This is used in multiprocessor communication during Mute mode or Stop mode, for wakeup with 7-
bit address mark detection. The MSB of the character sent by the transmitter should be equal to 1.
It may also be used for character detection during normal reception, Mute mode inactive . In this
case, the whole received character (8-bit) is compared to the ADD[7:0] value and CMF flag is set on
match.
This bit field can only be written when reception is disabled (RE = 0) or the USART is disabled
(UE=0)
|
Да вроде как все должен делать.
Последний раз редактировалось Easyrider83; 09.03.2017 в 20:17.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:39.
|
|