STM32 новичку в ARM что к чему
Re: STM32 новичку в ARM что к чему
Потому что:
a) while (!(SPI1->SR & SPI_SR_RXNE)); - ожидает завершения передачи слова.
b) читать принятое надо ПОСЛЕ появления флага готовности, а не ДО.
в) читать надо командой data = *(uint8_t volatile *)&SPI1->DR; а не как у вас.
г) писать нужно также через (uint8_t volatile *) указатель, а не как у вас.
a) while (!(SPI1->SR & SPI_SR_RXNE)); - ожидает завершения передачи слова.
b) читать принятое надо ПОСЛЕ появления флага готовности, а не ДО.
в) читать надо командой data = *(uint8_t volatile *)&SPI1->DR; а не как у вас.
г) писать нужно также через (uint8_t volatile *) указатель, а не как у вас.
Re: STM32 новичку в ARM что к чему
zenon,
1- SPI у F1 и F0 разный, в первом нет FIF0 очереди, источники для подглядывания надо выбирать соответствующие;
2- флаги TXE, RXNE можно сказать здесь относятся к очереди, а не процессу передачи - что приводит к тому, что Вы шурудите линеей DC прям во время передачи уходящего байта.
в оригинале :
while (!(SPI1->SR & SPI_SR_RXNE)); - дождаться ухода/прихода (здесь это одно и то же) байта
data = *(uint8_t *)&SPI1->DR; - прочитать DR чтоб снялся флаг RXNE (чтение SR потом DR - снимает флаг)
VladislavS,
спасибо. про доступ при записи на глаза не попалось, а про чтение нашел в RM - требует соответствия доступа.
м-да, тяжко когда уровень инглиш не в "свободном чтении".
1- SPI у F1 и F0 разный, в первом нет FIF0 очереди, источники для подглядывания надо выбирать соответствующие;
2- флаги TXE, RXNE можно сказать здесь относятся к очереди, а не процессу передачи - что приводит к тому, что Вы шурудите линеей DC прям во время передачи уходящего байта.
в оригинале :
while (!(SPI1->SR & SPI_SR_RXNE)); - дождаться ухода/прихода (здесь это одно и то же) байта
data = *(uint8_t *)&SPI1->DR; - прочитать DR чтоб снялся флаг RXNE (чтение SR потом DR - снимает флаг)
VladislavS,
спасибо. про доступ при записи на глаза не попалось, а про чтение нашел в RM - требует соответствия доступа.
м-да, тяжко когда уровень инглиш не в "свободном чтении".
- zenon
- Сверлит текстолит когтями
- Сообщения: 1274
- Зарегистрирован: Вт окт 23, 2007 10:01:42
- Откуда: Волгоград
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Нда... мне читать-то не надо, только быстро передавать, и это... volatile в этом моменте тут не при чём.
a797945 шурудить не буду, сначала правильно делал.
;_)
Что-то мне подсказывает, что на самом деле я не переключаюсь на 8 бит.
a797945 шурудить не буду, сначала правильно делал.
;_)
Что-то мне подсказывает, что на самом деле я не переключаюсь на 8 бит.
Re: STM32 новичку в ARM что к чему
в пакетах, где частая смена линии DC (инит дисплея), ожидание завершения передачи байта, перед сменой сост. линии DC - неизбежность.
в пакетах, где DC менять не надо - в рукопашную не передают , используют DMA.
в пакетах, где DC менять не надо - в рукопашную не передают , используют DMA.
Re: STM32 новичку в ARM что к чему
[uquote="a797945",url="/forum/viewtopic.php?p=4456874#p4456874"]в пакетах, где частая смена линии DC (инит дисплея), ожидание завершения передачи байта, перед сменой сост. линии DC - неизбежность.[/uquote]"неизбежность" это только для тех, кто контроллер не умеет подходящий выбрать. Если выбрать такой, который сможет аппаратно управлять этой линией и создать соответствующую схему, то и ждать ничего не потребуется - можно сразу выплюнуть всю посылку с командой и данными совместно и через DMA. Но без использования головы тут не обойтись, это точно. 
- zenon
- Сверлит текстолит когтями
- Сообщения: 1274
- Зарегистрирован: Вт окт 23, 2007 10:01:42
- Откуда: Волгоград
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Ха, jcxz бесячий же ты типчик, а родился ты наверное сразу со всеми интерфейсами, периферией и готовой прошивкой?
До DMA ещё не добрался, что до выбора мк - разбираюсь с чем есть, спешить некуда, ошибок ну сами знаете у кого нет.
ps. Нашёл старую тему по дисплею, пойду полистаю.
До DMA ещё не добрался, что до выбора мк - разбираюсь с чем есть, спешить некуда, ошибок ну сами знаете у кого нет.
ps. Нашёл старую тему по дисплею, пойду полистаю.
Re: STM32 новичку в ARM что к чему
В F0 можно проверять флаг BUSY. Означает что передача не окончена. Ждать пока BSY=0 и потом можно дергать DC.
-
Игорь2111
- Встал на лапы
- Сообщения: 108
- Зарегистрирован: Вс май 15, 2022 23:04:19
- Откуда: Белгородская обл.
Re: STM32 новичку в ARM что к чему
Для F103 можно скачать работающий пример для дисплея на " Частотомер на GD32F303" соседний форум
Re: STM32 новичку в ARM что к чему
[uquote="Sergi",url="/forum/viewtopic.php?p=4457173#p4457173"]В F0 можно проверять флаг BUSY. Означает что передача не окончена. Ждать пока BSY=0 и потом можно дергать DC.[/uquote]
...Ждать когда BSY=0...
на быстром коде может потребоваться небольшая задержка после записи в DR до проверки BSY, он не сразу вскакивает.
...Ждать когда BSY=0...
на быстром коде может потребоваться небольшая задержка после записи в DR до проверки BSY, он не сразу вскакивает.
- zenon
- Сверлит текстолит когтями
- Сообщения: 1274
- Зарегистрирован: Вт окт 23, 2007 10:01:42
- Откуда: Волгоград
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Да BSY то всё понятно было вопрос вообще изначально не о том был... фиг с ним, работает же. Дойдут руки, анализаторм посмотрю, яснее будет.
Re: STM32 новичку в ARM что к чему
непонятно было, когда Вы вопрос задали не приводя контекст, вот и ответ был - не надо читать - не читайте.
а код привели, стало понятно - вывод байта обрамляется сиг.DC, а как узнать когда можно уже дергать DC? -вот и ждут RXNE, а уже чтобы сбросить флаг - читают DR, можно в никуда.
когда не надо рулить DC - по TXE (движению очереди) грузят DR, но обычно не в ручную - DMA для этого есть.
а код привели, стало понятно - вывод байта обрамляется сиг.DC, а как узнать когда можно уже дергать DC? -вот и ждут RXNE, а уже чтобы сбросить флаг - читают DR, можно в никуда.
когда не надо рулить DC - по TXE (движению очереди) грузят DR, но обычно не в ручную - DMA для этого есть.
- zenon
- Сверлит текстолит когтями
- Сообщения: 1274
- Зарегистрирован: Вт окт 23, 2007 10:01:42
- Откуда: Волгоград
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Так я сам не сразу понял про DC, а первый раз вышеупомянутую ссылку на хабре прочёл по диагонали, не знаю как у кого, у меня окончательное понимание в железке происходит.
Re: STM32 новичку в ARM что к чему
Добрый вечер! Передаю по USART2 байт с терминала и тут же его возвращаю. Не могу понять, почему возвращается число больше.... Передаю 7 - возвращается 37, передаю 8 - возвращается 38.
GPIOA -> MODER |= GPIO_MODER_MODE2_1; // Альтернативная функция для РА2 (USART2- TX)
GPIOA -> AFR[0] |= GPIO_AFRL_AFSEL2_0 | GPIO_AFRL_AFSEL2_1 | GPIO_AFRL_AFSEL2_2; // Альтернативная функция для РА2 - AF7
GPIOA -> MODER |= GPIO_MODER_MODE3_1; // Альтернативная функция для РА3 (USART2- RX)
GPIOA -> AFR[0] |= GPIO_AFRL_AFSEL3_0 | GPIO_AFRL_AFSEL3_1 | GPIO_AFRL_AFSEL3_2; // Альтернативная функция для РА3 - AF7
// APB1_CLK = 42 MHz
// 42'000'000/115200/16 = 22.79 Mantissa = 22(0x16), Fraction = 0.79*16 = 12(0xC)
USART2 -> BRR |= 0x16C;
USART2 -> CR1 |= USART_CR1_RXNEIE | USART_CR1_TE | USART_CR1_RE; // Включение передатчика и приемника, прерываний
USART2 -> CR1 &= ~(USART_CR1_PCE | USART_CR1_M); // 8 бит, без контроля четности
USART2 -> CR2 &= ~USART_CR2_STOP; // один стоповый бит
NVIC_EnableIRQ(USART2_IRQn);
USART2 -> CR1 |= USART_CR1_UE; // включение USART2
// // Прием символа по USART2 - принимаем с терминала и передаем на радиомодуль
void USART2_IRQHandler(void) { // Прием символа по USART2
if (USART2 -> SR & USART_SR_RXNE) {
uint8_t RXc = ((USART2 -> DR) & 0xFF); // Считываем значение регистра DR
switch (RXc) {
case 0x37:
LED_on;
break;
default:
LED_off;
break;
}
USART2_Send_symbol(RXc);
}
NVIC_ClearPendingIRQ(USART2_IRQn);
}
// Передача символа USART
void USART2_Send_symbol(uint8_t data)
{
while(!(USART2->SR & USART_SR_TC)); // Флаг окончания передачи (1 - передача завершена)
USART2->DR = data;
}
Спойлер
RCC -> APB1ENR |= RCC_APB1ENR_USART2EN; // Включение тактирования USART2GPIOA -> MODER |= GPIO_MODER_MODE2_1; // Альтернативная функция для РА2 (USART2- TX)
GPIOA -> AFR[0] |= GPIO_AFRL_AFSEL2_0 | GPIO_AFRL_AFSEL2_1 | GPIO_AFRL_AFSEL2_2; // Альтернативная функция для РА2 - AF7
GPIOA -> MODER |= GPIO_MODER_MODE3_1; // Альтернативная функция для РА3 (USART2- RX)
GPIOA -> AFR[0] |= GPIO_AFRL_AFSEL3_0 | GPIO_AFRL_AFSEL3_1 | GPIO_AFRL_AFSEL3_2; // Альтернативная функция для РА3 - AF7
// APB1_CLK = 42 MHz
// 42'000'000/115200/16 = 22.79 Mantissa = 22(0x16), Fraction = 0.79*16 = 12(0xC)
USART2 -> BRR |= 0x16C;
USART2 -> CR1 |= USART_CR1_RXNEIE | USART_CR1_TE | USART_CR1_RE; // Включение передатчика и приемника, прерываний
USART2 -> CR1 &= ~(USART_CR1_PCE | USART_CR1_M); // 8 бит, без контроля четности
USART2 -> CR2 &= ~USART_CR2_STOP; // один стоповый бит
NVIC_EnableIRQ(USART2_IRQn);
USART2 -> CR1 |= USART_CR1_UE; // включение USART2
// // Прием символа по USART2 - принимаем с терминала и передаем на радиомодуль
void USART2_IRQHandler(void) { // Прием символа по USART2
if (USART2 -> SR & USART_SR_RXNE) {
uint8_t RXc = ((USART2 -> DR) & 0xFF); // Считываем значение регистра DR
switch (RXc) {
case 0x37:
LED_on;
break;
default:
LED_off;
break;
}
USART2_Send_symbol(RXc);
}
NVIC_ClearPendingIRQ(USART2_IRQn);
}
// Передача символа USART
void USART2_Send_symbol(uint8_t data)
{
while(!(USART2->SR & USART_SR_TC)); // Флаг окончания передачи (1 - передача завершена)
USART2->DR = data;
}
- Вложения
-
- 1.jpg
- (225.46 КБ) 76 скачиваний
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Я так подозреваю, принимаете число, передаёте символ...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: STM32 новичку в ARM что к чему
[uquote="ARV",url="/forum/viewtopic.php?p=4461381#p4461381"]Я так подозреваю, принимаете число, передаёте символ...[/uquote]
Я проверял внутри условия case - он уже принимает 0x37, а не 7
Я проверял внутри условия case - он уже принимает 0x37, а не 7
- КРАМ
- Друг Кота
- Сообщения: 25121
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: STM32 новичку в ARM что к чему
[uquote="Димаn",url="/forum/viewtopic.php?p=4461385#p4461385"]0x37, а не 7
[/uquote]
Вам же объяснили. 0х37 это ASCII код СИМВОЛА СЕМЬ. Вы передаете не число, а код символа.
Можете передать так любую букву или знак.
Символы чисел отличаются от самих чисел на величину 0х30.
Вам же объяснили. 0х37 это ASCII код СИМВОЛА СЕМЬ. Вы передаете не число, а код символа.
Можете передать так любую букву или знак.
Символы чисел отличаются от самих чисел на величину 0х30.
Re: STM32 новичку в ARM что к чему
[uquote="КРАМ",url="/forum/viewtopic.php?p=4461408#p4461408"][uquote="Димаn",url="/forum/viewtopic.php?p=4461385#p4461385"]0x37, а не 7
[/uquote]
Вам же объяснили.[/uquote]
Сообразил. Спасибо. Странно, вроде в терминале hex ставлю
Вам же объяснили.[/uquote]
Сообразил. Спасибо. Странно, вроде в терминале hex ставлю
- КРАМ
- Друг Кота
- Сообщения: 25121
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: STM32 новичку в ARM что к чему
Я терминалом не пользуюсь, но полагаю, что из него всегда передаются ASCII коды ТЕКСТА, включая цифры, а не числа.
Re: STM32 новичку в ARM что к чему
[uquote="КРАМ",url="/forum/viewtopic.php?p=4461414#p4461414"]Я терминалом не пользуюсь, но полагаю, что из него всегда передаются ASCII коды ТЕКСТА, включая цифры, а не числа.[/uquote]
Да, проверил. Именно так. Поставил точку напротив ascii и так и отображается как передаю. Получается, ничего преобразовывать не надо (вычитать 30)?
Допустим, надо через усарт передать на spi число 0хС0.
Да, проверил. Именно так. Поставил точку напротив ascii и так и отображается как передаю. Получается, ничего преобразовывать не надо (вычитать 30)?
Допустим, надо через усарт передать на spi число 0хС0.
- do-vitas
- Потрогал лапой паяльник
- Сообщения: 363
- Зарегистрирован: Вс мар 03, 2019 08:18:34
- Откуда: Волгоград
Re: STM32 новичку в ARM что к чему
Всем добра! имеется stm32f030т6 пытаюсь снять ацп с двух каналов. один работает хорошо. он снимает все работает но иногда их меняет местами как поборот?
inet:
RCC->APB2ENR |= RCC_APB2ENR_ADCEN;
RCC->APB2ENR |= RCC_APB2ENR_ADCEN;
GPIOA->MODER |= GPIO_MODER_MODER5_0 ;
GPIOA->MODER |= GPIO_MODER_MODER5_1 ;
GPIOA->MODER |= GPIO_MODER_MODER2_0 ;
GPIOA->MODER |= GPIO_MODER_MODER2_1 ;
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; /* (1) */
RCC->CR2 |= RCC_CR2_HSI14ON; /* (2) */
while ((RCC->CR2 & RCC_CR2_HSI14RDY) == 0) /* (3) */
{
}
CalibrateADC();
ADC1->CFGR1 |= ADC_CFGR1_CONT | ADC_CFGR1_SCANDIR; /* (2) */
ADC1->CHSELR |= ADC_CHSELR_CHSEL2;
ADC1->CHSELR |= ADC_CHSELR_CHSEL5;
EnableADC();
ADC->CCR |= ADC_CCR_VREFEN; /* (6) */
в main:
ADC1->CR |= ADC_CR_ADSTART; /* start the ADC conversion */
while ((ADC1->ISR & ADC_ISR_EOC) == 0) /* wait end of conversion */
{
/* For robust implementation, add here time-out management */
}
if ((ADC1->ISR & ADC_ISR_EOC) != 0) /* checks EOC has triggered the IT */
{
ADC_array[CurrentChannel] = ADC1->DR; /* reads data and clears EOC flag */
CurrentChannel++; /* increments the index on ADC_array */
}
if ((ADC1->ISR & ADC_ISR_EOSEQ) != 0) /* checks EOSEQ has triggered the IT */
{
ADC1->ISR |= ADC_ISR_EOSEQ; /* clears the pending bit */
CurrentChannel = 0; /* reinitialize the CurrentChannel */
out_adc = ADC_array[0];in_adc = ADC_array[1];
}
inet:
RCC->APB2ENR |= RCC_APB2ENR_ADCEN;
RCC->APB2ENR |= RCC_APB2ENR_ADCEN;
GPIOA->MODER |= GPIO_MODER_MODER5_0 ;
GPIOA->MODER |= GPIO_MODER_MODER5_1 ;
GPIOA->MODER |= GPIO_MODER_MODER2_0 ;
GPIOA->MODER |= GPIO_MODER_MODER2_1 ;
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; /* (1) */
RCC->CR2 |= RCC_CR2_HSI14ON; /* (2) */
while ((RCC->CR2 & RCC_CR2_HSI14RDY) == 0) /* (3) */
{
}
CalibrateADC();
ADC1->CFGR1 |= ADC_CFGR1_CONT | ADC_CFGR1_SCANDIR; /* (2) */
ADC1->CHSELR |= ADC_CHSELR_CHSEL2;
ADC1->CHSELR |= ADC_CHSELR_CHSEL5;
EnableADC();
ADC->CCR |= ADC_CCR_VREFEN; /* (6) */
в main:
ADC1->CR |= ADC_CR_ADSTART; /* start the ADC conversion */
while ((ADC1->ISR & ADC_ISR_EOC) == 0) /* wait end of conversion */
{
/* For robust implementation, add here time-out management */
}
if ((ADC1->ISR & ADC_ISR_EOC) != 0) /* checks EOC has triggered the IT */
{
ADC_array[CurrentChannel] = ADC1->DR; /* reads data and clears EOC flag */
CurrentChannel++; /* increments the index on ADC_array */
}
if ((ADC1->ISR & ADC_ISR_EOSEQ) != 0) /* checks EOSEQ has triggered the IT */
{
ADC1->ISR |= ADC_ISR_EOSEQ; /* clears the pending bit */
CurrentChannel = 0; /* reinitialize the CurrentChannel */
out_adc = ADC_array[0];in_adc = ADC_array[1];
}