Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: STM32 новичку в ARM что к чему

Чт авг 03, 2023 17:59:14

Потому что:
a) while (!(SPI1->SR & SPI_SR_RXNE)); - ожидает завершения передачи слова.
b) читать принятое надо ПОСЛЕ появления флага готовности, а не ДО.
в) читать надо командой data = *(uint8_t volatile *)&SPI1->DR; а не как у вас.
г) писать нужно также через (uint8_t volatile *) указатель, а не как у вас.

Re: STM32 новичку в ARM что к чему

Чт авг 03, 2023 18:55:09

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 - требует соответствия доступа.
м-да, тяжко когда уровень инглиш не в "свободном чтении".

Re: STM32 новичку в ARM что к чему

Пт авг 04, 2023 03:20:09

Нда... мне читать-то не надо, только быстро передавать, и это... volatile в этом моменте тут не при чём.
a797945 шурудить не буду, сначала правильно делал.
;_)
Что-то мне подсказывает, что на самом деле я не переключаюсь на 8 бит.

Re: STM32 новичку в ARM что к чему

Пт авг 04, 2023 07:26:30

в пакетах, где частая смена линии DC (инит дисплея), ожидание завершения передачи байта, перед сменой сост. линии DC - неизбежность.
в пакетах, где DC менять не надо - в рукопашную не передают , используют DMA.

Re: STM32 новичку в ARM что к чему

Пт авг 04, 2023 11:04:32

в пакетах, где частая смена линии DC (инит дисплея), ожидание завершения передачи байта, перед сменой сост. линии DC - неизбежность.
"неизбежность" это только для тех, кто контроллер не умеет подходящий выбрать. Если выбрать такой, который сможет аппаратно управлять этой линией и создать соответствующую схему, то и ждать ничего не потребуется - можно сразу выплюнуть всю посылку с командой и данными совместно и через DMA. Но без использования головы тут не обойтись, это точно. :dont_know:

Re: STM32 новичку в ARM что к чему

Пт авг 04, 2023 11:49:38

Ха, jcxz бесячий же ты типчик, а родился ты наверное сразу со всеми интерфейсами, периферией и готовой прошивкой?
До DMA ещё не добрался, что до выбора мк - разбираюсь с чем есть, спешить некуда, ошибок ну сами знаете у кого нет.
ps. Нашёл старую тему по дисплею, пойду полистаю.

Re: STM32 новичку в ARM что к чему

Пт авг 04, 2023 19:59:54

В F0 можно проверять флаг BUSY. Означает что передача не окончена. Ждать пока BSY=0 и потом можно дергать DC.

Re: STM32 новичку в ARM что к чему

Пт авг 04, 2023 20:33:21

Для F103 можно скачать работающий пример для дисплея на " Частотомер на GD32F303" соседний форум

Re: STM32 новичку в ARM что к чему

Пт авг 04, 2023 21:18:26

В F0 можно проверять флаг BUSY. Означает что передача не окончена. Ждать пока BSY=0 и потом можно дергать DC.

...Ждать когда BSY=0...

на быстром коде может потребоваться небольшая задержка после записи в DR до проверки BSY, он не сразу вскакивает.

Re: STM32 новичку в ARM что к чему

Пт авг 04, 2023 22:39:47

Да BSY то всё понятно было вопрос вообще изначально не о том был... фиг с ним, работает же. Дойдут руки, анализаторм посмотрю, яснее будет.

Re: STM32 новичку в ARM что к чему

Сб авг 05, 2023 09:20:19

непонятно было, когда Вы вопрос задали не приводя контекст, вот и ответ был - не надо читать - не читайте.
а код привели, стало понятно - вывод байта обрамляется сиг.DC, а как узнать когда можно уже дергать DC? -вот и ждут RXNE, а уже чтобы сбросить флаг - читают DR, можно в никуда.
когда не надо рулить DC - по TXE (движению очереди) грузят DR, но обычно не в ручную - DMA для этого есть.

Re: STM32 новичку в ARM что к чему

Сб авг 05, 2023 10:00:30

Так я сам не сразу понял про DC, а первый раз вышеупомянутую ссылку на хабре прочёл по диагонали, не знаю как у кого, у меня окончательное понимание в железке происходит.

Re: STM32 новичку в ARM что к чему

Сб авг 12, 2023 23:12:10

Добрый вечер! Передаю по USART2 байт с терминала и тут же его возвращаю. Не могу понять, почему возвращается число больше.... Передаю 7 - возвращается 37, передаю 8 - возвращается 38.

СпойлерRCC -> APB1ENR |= RCC_APB1ENR_USART2EN; // Включение тактирования USART2

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;
}
Вложения
1.jpg
(225.46 KiB) Скачиваний: 27

Re: STM32 новичку в ARM что к чему

Сб авг 12, 2023 23:24:02

Я так подозреваю, принимаете число, передаёте символ...

Re: STM32 новичку в ARM что к чему

Сб авг 12, 2023 23:31:09

Я так подозреваю, принимаете число, передаёте символ...

Я проверял внутри условия case - он уже принимает 0x37, а не 7 :(

Re: STM32 новичку в ARM что к чему

Вс авг 13, 2023 00:05:32

0x37, а не 7 :(

Вам же объяснили. 0х37 это ASCII код СИМВОЛА СЕМЬ. Вы передаете не число, а код символа.
Можете передать так любую букву или знак.
Символы чисел отличаются от самих чисел на величину 0х30.

Re: STM32 новичку в ARM что к чему

Вс авг 13, 2023 00:16:12

0x37, а не 7 :(

Вам же объяснили.

Сообразил. Спасибо. Странно, вроде в терминале hex ставлю

Re: STM32 новичку в ARM что к чему

Вс авг 13, 2023 00:21:33

Я терминалом не пользуюсь, но полагаю, что из него всегда передаются ASCII коды ТЕКСТА, включая цифры, а не числа.

Re: STM32 новичку в ARM что к чему

Вс авг 13, 2023 00:30:28

Я терминалом не пользуюсь, но полагаю, что из него всегда передаются ASCII коды ТЕКСТА, включая цифры, а не числа.

Да, проверил. Именно так. Поставил точку напротив ascii и так и отображается как передаю. Получается, ничего преобразовывать не надо (вычитать 30)?
Допустим, надо через усарт передать на spi число 0хС0.

Re: STM32 новичку в ARM что к чему

Пт авг 18, 2023 19:24:21

Всем добра! имеется 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];
}
Ответить