|
|
  |
STM32L4 прерывания от UART. Закипел. |
|
|
|
May 12 2016, 16:47
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
May 12 2016, 18:13
|

Профессионал
    
Группа: Свой
Сообщений: 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 !!!
|
|
|
|
|
May 12 2016, 18:23
|
Знающий
   
Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247

|
Цитата(x893 @ May 12 2016, 21:13)  Овладел телепатией ! Под эклипсом используете gcc, а под Keil - armcc !!! Хорошо унизили. OK. Под AVR Studio кажется тоже GCC. Но и этот вариант не прокатил.
|
|
|
|
|
May 12 2016, 20:38
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
May 13 2016, 13:02
|
Знающий
   
Группа: Участник
Сообщений: 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 тоже нет.
|
|
|
|
|
May 13 2016, 14:10
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
May 13 2016, 14:57
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
May 14 2016, 08:44
|
Знающий
   
Группа: Свой
Сообщений: 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
|
|
|
|
|
May 14 2016, 09:25
|
Профессионал
    
Группа: Свой
Сообщений: 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.
|
|
|
|
|
May 14 2016, 17:28
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|