Перейти к содержанию
    

STM32L4 прерывания от UART. Закипел.

В посте 8 я привел настройки uart1. Про 5 и 6 бит там не упоминается. Соответственно без них прерывания на прием и передачу работать не будут. Приведите свой код если Вы утверждаете что эти биты устанавливаются.

Если найду - перешла на ДМА... Прерывание должно разрешаться при старте... что-то там... HAL_UART_Receive_IT

Естественно, после завершения прерывания должны отключаться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот интересно, какая связь между эклипсом и printf()

Прямая. Под Кейлом я знаю как printF прикрутить:

_ARMABI int printf(const char * __restrict /*format*/, ...) __attribute__((__nonnull__(1)));
struct __FILE { int handle;};
FILE __stdout;
int fputc(int ch, FILE *f)

 

А под Эклиспом это не работает.

Изменено пользователем Димон Безпарольный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прямая. Под Кейлом я знаю как printF прикрутить:

_ARMABI int printf(const char * __restrict /*format*/, ...) __attribute__((__nonnull__(1)));
struct __FILE { int handle;};
FILE __stdout;
int fputc(int ch, FILE *f)

 

А под Эклиспом это не работает.

Овладел телепатией !

Под эклипсом используете gcc, а под Keil - armcc !!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Овладел телепатией !

Под эклипсом используете gcc, а под Keil - armcc !!!

Ага. В сознании трудящихся текстовый редактор и компилятор слились воедино. Скоро будет "розовый компутер - для кортексов, серенький - для авр". Ждём притока блондинок в отрасль :cranky:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Овладел телепатией !

Под эклипсом используете gcc, а под Keil - armcc !!!

Хорошо унизили.

 

OK. Под AVR Studio кажется тоже GCC. Но и этот вариант не прокатил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хорошо унизили.

 

OK. Под AVR Studio кажется тоже GCC. Но и этот вариант не прокатил.

Даже в мыслях не было.

Можно gcc под Keil и armcc под эклипсом.

Но тогда бы printf с fputc под эклипсом работал, а под Keil - нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем в Кейле это работает:

 

struct __FILE {int dummy;};
FILE __stdout;
FILE __stdin;
int fputc(int ch, FILE *f)

 

А в Эклипсе я разные варианты пробовал - безуспешно. Но Кейл мне больше нравится и по другим причинам...

Изменено пользователем Димон Безпарольный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чертов Куб. Пытался SPI поднять. Поднял блин. В коде не нашел где конфигурируются пины SPI.

 

Здесь:

  hspi2.Instance = SPI2;
  hspi2.Init.Mode = SPI_MODE_MASTER;
  hspi2.Init.Direction = SPI_DIRECTION_2LINES;
  hspi2.Init.DataSize = SPI_DATASIZE_9BIT;
  hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi2.Init.NSS = SPI_NSS_HARD_OUTPUT;
  hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128;
  hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi2.Init.CRCPolynomial = 7;
  hspi2.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  hspi2.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
  HAL_SPI_Init(&hspi2);

 

нет.

В MX_GPIO_Init тоже нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чертов Куб. Пытался SPI поднять. Поднял блин. В коде не нашел где конфигурируются пины SPI.

 

А так не получится?

   //PB10: SPI2_CLK, PB14: SPI2_MISO, PB15: SPI2_MOSI
  GPIO_InitStructure.Pin = GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15;
  GPIO_InitStructure.Alternate = GPIO_AF5_SPI2;
  GPIO_InitStructure.Mode  = GPIO_MODE_AF_PP;
  GPIO_InitStructure.Speed = GPIO_SPEED_MEDIUM,
  GPIO_InitStructure.Pull  = GPIO_NOPULL, 
  GPIO_Init(GPIOB, &GPIO_InitStructure);

 

PS. Вот, специально куб запустил для эксперимента:

 

void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi){
  GPIO_InitTypeDef GPIO_InitStruct;
  if(hspi->Instance==SPI1)
  {
    /* Peripheral clock enable */
    __SPI1_CLK_ENABLE();
  
  /**SPI1 GPIO Configuration  
  PA5   ------> SPI1_SCK
  PA6   ------> SPI1_MISO
  PA7   ------> SPI1_MOSI 
  */
    GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  }
}

void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi){
  if(hspi->Instance==SPI1)
  {
    /* Peripheral clock disable */
    __SPI1_CLK_DISABLE();
  
  /**SPI1 GPIO Configuration  
  PA5   ------> SPI1_SCK
  PA6   ------> SPI1_MISO
  PA7   ------> SPI1_MOSI 
  */
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);

  }
}

Изменено пользователем Aleksandr Baranov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А так не получится?

   //PB10: SPI2_CLK, PB14: SPI2_MISO, PB15: SPI2_MOSI
  GPIO_InitStructure.Pin = GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15;
  GPIO_InitStructure.Alternate = GPIO_AF5_SPI2;
  GPIO_InitStructure.Mode  = GPIO_MODE_AF_PP;
  GPIO_InitStructure.Speed = GPIO_SPEED_MEDIUM,
  GPIO_InitStructure.Pull  = GPIO_NOPULL, 
  GPIO_Init(GPIOB, &GPIO_InitStructure);

 

PS. Вот, специально куб запустил для эксперимента:

У меня нет функции HAL_SPI_MspDeInit. Только пустой ее вариант со слабым связыванием.

 

Не получается почему - то даже вот так:

 

  GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  

  GPIO_InitStruct.Pin = GPIO_PIN_3;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

 

Выводы остаются почему - то висячими. Я нихрена не понимаю. Но если их назначть как выходные (01), то ими можно повертеть. Только SPI блок ими вертеть не хочет.

Я и сам пробовал - результат тоот же!

 

    RCC->APB1ENR1 |= 1<<14;                    //Тактирование SPI2 стр. 228
    for (i = 0; i < 30000; i++ ){};
    RCC->AHB2ENR |= RCC_AHB2ENR_GPIOBEN;    //Разрешить тактирование GPIOB
    for (i = 0; i < 30000; i++ ){};
    RCC->AHB2ENR |= RCC_AHB2ENR_GPIOCEN;    //Разрешить тактирование GPIOC
    for (i = 0; i < 30000; i++ ){};
    GPIOB->MODER =     (2<<20)|                //PB10 - альтернативная функция SPI2_SCK
                    (2<<24)|                //PB12 - альтернативная функция SPI2_NSS
                    (1<<26);                 //PB13 - Программный CS push pull режим
    GPIOC->MODER =     (2<<6);                    //PC3 - альтернативная функция SPI2_MOSI
    GPIOB->AFR[1] = 5<<8|                    //Альтернативная функция 5 для PB10 стр. 268
                    5<<16;                    //Альтернативная функция 5 для PB12
    GPIOC->AFR[0] = 5<<12;                    //Альтернативная функция 5 для PC3 

//PB10 = SPI2_SCK = AF5
//PB12 = SPI2_NSS = AF5
//PB13 = Soft NSS output push pull.
//PC3 = SPI2_MOSI = AF5

    SPI2->CR1 = 0<<0|    //Bit 0 CPHA: Clock phase
                0<<1|    //Bit1 CPOL: Clock polarity
                1<<2|    //Bit 2 MSTR: Master selection
                7<<3|    //Bits 5:3 BR[2:0]: Baud rate control 000b=2,001b=4,010b=8,011b=16,100b=32,101b=64,110b=128,111b=256
                1<<6|    //Bit 6 SPE: SPI enable
                0<<7|    //Bit 7 LSBFIRST: Frame format 0-MSB First
                0<<8|    //Bit 8 SSI: Internal slave select
                0<<9|    //Bit 9 SSM: Software slave management
                0<<10|    //Bit 10 RXONLY: Receive only mode enabled
                0<<11|    //Bit 11 CRCL: CRC length 
                0<<12|    //Bit 12 CRCNEXT: Transmit CRC next
                0<<13|    //Bit 13 CRCEN: Hardware CRC calculation enable
                1<<14|    //Bit 14 BIDIOE: Output enable in bidirectional mode
                0<<15;    //Bit 15 BIDIMODE: Bidirectional data mode enable
    SPI2->CR2 = 0<<0|    //RXDMAEN: Rx buffer DMA enable
                0<<1|    //Bit 1 TXDMAEN: Tx buffer DMA enable
                1<<2|    //Bit 2 SSOE: SS output enable
                1<<3|    //Bit 3 NSSP: NSS pulse management
                0<<4|    //Bit 4 FRF: Frame format 0: SPI Motorola mode, 1 SPI TI mode
                0<<5|    //Bit 5 ERRIE: Error interrupt enable
                0<<6|    //Bit 6 RXNEIE: RX buffer not empty interrupt enable
                0<<7|    //Bit 7 TXEIE: Tx buffer empty interrupt enable
                8<<8|    //Bits 11:8 DS [3:0]: Data size. 8 - 9бит
                0<<12|    //Bit 12 FRXTH: FIFO reception threshold
                0<<13|    //Bit 13 LDMA_RX: Last DMA transfer for reception
                0<<14;    //Bit 14 LDMA_TX: Last DMA transfer for transmission

Изменено пользователем Димон Безпарольный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не знаю что у вас там за проблемы, но если использовать связку CubeMX с установленными пакетами под нужное семейство (например STM32CubeF0) и System Workbench for STM32, понимая идеологию HAL все можно сделать не вчитываясь в даташит на микроконтроллер.

 

Попробуйте обновить все программы и пакеты, и посмотреть примеры которые идут в пакетах (под каждое семейство свой пакет, вручную скачать с st и открыть архив) для CubeMX.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нормально Куб генерирует всё. Надо птички/галки ставить где надо. И под прерывания генерит.

Один минус чуть больше кода получается, но это можно потом пооптимизировать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может еще вот это мешает.

Некоторые контроллеры имеют функции блокировки изменения конфигурации пинов, для RX например чтобы включить альтернативные функции на ногу, то надо записать определенные битики в определенный регистр, после чего можно переконфигурировать выводы. Для STM32F0 например есть такой регистр "GPIO port configuration lock register". И если вы хотите, после того как Куб сгенерировал код для проекта, в ходе работы поменять функции для пина тогда надо искать как это работает в этом семействе, потому что для F0 написано что если залочить то тогда только до перезагрузки, а Куб может генерирует так что лочит их при инициализации (посмотрел в простом проекте, по умолчанию не лочит).

Для L4 в даташите тоже есть такие строчки:

7.3.6 GPIO locking mechanism

It is possible to freeze the GPIO control registers by applying a specific write sequence to

the GPIOx_LCKR register. The frozen registers are GPIOx_MODER, GPIOx_OTYPER,

GPIOx_OSPEEDR, GPIOx_PUPDR, GPIOx_AFRL and GPIOx_AFRH.

 

В HAL есть такая функция HAL_GPIO_LockPin

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пишу код под Nucleo L476. Кубом. И вручную. Результат тот же. Поднял UART1. UART работает. Но прерываний нет. Ни в коде от Куба ни в моем коде.

Вручную настраивал так:

    USART1->CR1 =    1<<7 |                        //Bit 7 TXEIE: interrupt enable
                    1<<6 |                        //Bit 6 TCIE: Transmission complete interrupt enable
                    1<<5 |                        //Bit 5 RXNEIE: RXNE interrupt enable
                    1<<3 |                        //Bit 3 TE: Transmitter enable
                    1<<2 |                        //Bit 2 RE: Receiver enable
                    1<<0;                         //Bit 0 UE: USART enable
    USART1->CR2 =    1<<11;                         //Bit 11 CLKEN: Clock enable
    USART1->BRR =     0x271;                        //Tx/Rx baud =     f CK / BRR.  Oversampling by 16

А зачем во время инициализации разрешать прерывания TXEIE и TCIE ? Зачем прерывание если нечего передавать?

Когда потребуется что-то передавать, вот тогда и разрешите TXEIE, а когда возникнет желание узнать что все передаваемые данные, до последнего бита ушли и передавать больше нечего, вот тогда во время записи последнего байта в DR и следует разрешить TCIE.

Это если всё руками делать, а если положиться на Куб, то он прерываниями сам рулит.

 

А CLKEN зачем?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для STM32F0 например есть такой регистр "GPIO port configuration lock register". И если вы хотите, после того как Куб сгенерировал код для проекта, в ходе работы поменять функции для пина тогда надо искать как это работает в этом семействе, потому что для F0 написано что если залочить то тогда только до перезагрузки, а Куб может генерирует так что лочит их при инициализации (посмотрел в простом проекте, по умолчанию не лочит).

Для L4 в даташите тоже есть такие строчки:

 

 

В HAL есть такая функция HAL_GPIO_LockPin

Есть такой регистр:

the value of this port bit can no longer be modified until the next MCU reset or peripheral reset.

 

Но я спокойно назначаю эти выводы как выходные и также спокойно ими верчу.

 

Только SPI модуль ими не хочет вертеть. Как только я включаю Alternate Function, все выводы переключаются в третье состояние.

 

А зачем во время инициализации разрешать прерывания TXEIE и TCIE ? Зачем прерывание если нечего передавать?

Когда потребуется что-то передавать, вот тогда и разрешите TXEIE, а когда возникнет желание узнать что все передаваемые данные, до последнего бита ушли и передавать больше нечего, вот тогда во время записи последнего байта в DR и следует разрешить TCIE.

Это если всё руками делать, а если положиться на Куб, то он прерываниями сам рулит.

 

А CLKEN зачем?

CLKEN не нужен. Точно. И с прерываниями Вы правы на все 100. Нужно было срочно сваять кольцевые буфера, printf, плавучку. Не обратил внимание.

 

Нормально Куб генерирует всё. Надо птички/галки ставить где надо. И под прерывания генерит.

Один минус чуть больше кода получается, но это можно потом пооптимизировать.

Вот как раз галочку на прерывание от USART я и поставил. Но прерывания были запрещены. Лажа этот куб. Ручками быстрее получилось.

Изменено пользователем Димон Безпарольный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...