реклама на сайте
подробности

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> STM32L4 прерывания от UART. Закипел.
Tanya
сообщение May 12 2016, 16:09
Сообщение #16


Гуру
******

Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883



Цитата(Димон Безпарольный @ May 12 2016, 17:41) *
В посте 8 я привел настройки uart1. Про 5 и 6 бит там не упоминается. Соответственно без них прерывания на прием и передачу работать не будут. Приведите свой код если Вы утверждаете что эти биты устанавливаются.

Если найду - перешла на ДМА... Прерывание должно разрешаться при старте... что-то там... HAL_UART_Receive_IT
Естественно, после завершения прерывания должны отключаться.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение May 12 2016, 16:47
Сообщение #17


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Цитата(MrYuran @ May 12 2016, 18:48) *
Вот интересно, какая связь между эклипсом и printf()

Прямая. Под Кейлом я знаю как printF прикрутить:
Код
_ARMABI int printf(const char * __restrict /*format*/, ...) __attribute__((__nonnull__(1)));
struct __FILE { int handle;};
FILE __stdout;
int fputc(int ch, FILE *f)


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

Сообщение отредактировал Димон Безпарольный - May 12 2016, 16:48
Go to the top of the page
 
+Quote Post
x893
сообщение May 12 2016, 18:13
Сообщение #18


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Цитата(Димон Безпарольный @ May 12 2016, 19:47) *
Прямая. Под Кейлом я знаю как 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 !!!
Go to the top of the page
 
+Quote Post
scifi
сообщение May 12 2016, 18:20
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(x893 @ May 12 2016, 21:13) *
Овладел телепатией !
Под эклипсом используете gcc, а под Keil - armcc !!!

Ага. В сознании трудящихся текстовый редактор и компилятор слились воедино. Скоро будет "розовый компутер - для кортексов, серенький - для авр". Ждём притока блондинок в отрасль cranky.gif
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение May 12 2016, 18:23
Сообщение #20


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Цитата(x893 @ May 12 2016, 21:13) *
Овладел телепатией !
Под эклипсом используете gcc, а под Keil - armcc !!!

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

OK. Под AVR Studio кажется тоже GCC. Но и этот вариант не прокатил.
Go to the top of the page
 
+Quote Post
x893
сообщение May 12 2016, 19:51
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Цитата(Димон Безпарольный @ May 12 2016, 21:23) *
Хорошо унизили.

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

Даже в мыслях не было.
Можно gcc под Keil и armcc под эклипсом.
Но тогда бы printf с fputc под эклипсом работал, а под Keil - нет.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение May 12 2016, 20:38
Сообщение #22


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



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

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


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

Сообщение отредактировал Димон Безпарольный - May 12 2016, 20:41
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение May 13 2016, 13:02
Сообщение #23


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Чертов Куб. Пытался 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 тоже нет.
Go to the top of the page
 
+Quote Post
Aleksandr Barano...
сообщение May 13 2016, 14:10
Сообщение #24


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118



Цитата(Димон Безпарольный @ May 13 2016, 09:02) *
Чертов Куб. Пытался 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 - May 13 2016, 14:16


--------------------
ASB
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение May 13 2016, 14:57
Сообщение #25


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Цитата(Aleksandr Baranov @ May 13 2016, 17:10) *
А так не получится?
Код
   //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


Сообщение отредактировал Димон Безпарольный - May 13 2016, 15:29
Go to the top of the page
 
+Quote Post
Lagman
сообщение May 14 2016, 07:59
Сообщение #26


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



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

Попробуйте обновить все программы и пакеты, и посмотреть примеры которые идут в пакетах (под каждое семейство свой пакет, вручную скачать с st и открыть архив) для CubeMX.
Go to the top of the page
 
+Quote Post
x893
сообщение May 14 2016, 08:12
Сообщение #27


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Нормально Куб генерирует всё. Надо птички/галки ставить где надо. И под прерывания генерит.
Один минус чуть больше кода получается, но это можно потом пооптимизировать.
Go to the top of the page
 
+Quote Post
Lagman
сообщение May 14 2016, 08:44
Сообщение #28


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



Может еще вот это мешает.
Некоторые контроллеры имеют функции блокировки изменения конфигурации пинов, для 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
Go to the top of the page
 
+Quote Post
SSerge
сообщение May 14 2016, 09:25
Сообщение #29


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(Димон Безпарольный @ May 11 2016, 15:05) *
Пишу код под 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 зачем?


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение May 14 2016, 17:28
Сообщение #30


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Цитата(Lagman @ May 14 2016, 11:44) *
Для 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, все выводы переключаются в третье состояние.

Цитата(SSerge @ May 14 2016, 12:25) *
А зачем во время инициализации разрешать прерывания TXEIE и TCIE ? Зачем прерывание если нечего передавать?
Когда потребуется что-то передавать, вот тогда и разрешите TXEIE, а когда возникнет желание узнать что все передаваемые данные, до последнего бита ушли и передавать больше нечего, вот тогда во время записи последнего байта в DR и следует разрешить TCIE.
Это если всё руками делать, а если положиться на Куб, то он прерываниями сам рулит.

А CLKEN зачем?

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

Цитата(x893 @ May 14 2016, 11:12) *
Нормально Куб генерирует всё. Надо птички/галки ставить где надо. И под прерывания генерит.
Один минус чуть больше кода получается, но это можно потом пооптимизировать.

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

Сообщение отредактировал Димон Безпарольный - May 14 2016, 17:33
Go to the top of the page
 
+Quote Post

4 страниц V  < 1 2 3 4 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th June 2025 - 21:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01507 секунд с 7
ELECTRONIX ©2004-2016