Tanya 4 12 мая, 2016 Опубликовано 12 мая, 2016 · Жалоба В посте 8 я привел настройки uart1. Про 5 и 6 бит там не упоминается. Соответственно без них прерывания на прием и передачу работать не будут. Приведите свой код если Вы утверждаете что эти биты устанавливаются. Если найду - перешла на ДМА... Прерывание должно разрешаться при старте... что-то там... HAL_UART_Receive_IT Естественно, после завершения прерывания должны отключаться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 12 мая, 2016 Опубликовано 12 мая, 2016 (изменено) · Жалоба Вот интересно, какая связь между эклипсом и printf() Прямая. Под Кейлом я знаю как printF прикрутить: _ARMABI int printf(const char * __restrict /*format*/, ...) __attribute__((__nonnull__(1))); struct __FILE { int handle;}; FILE __stdout; int fputc(int ch, FILE *f) А под Эклиспом это не работает. Изменено 12 мая, 2016 пользователем Димон Безпарольный Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 12 мая, 2016 Опубликовано 12 мая, 2016 · Жалоба Прямая. Под Кейлом я знаю как 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 !!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 12 мая, 2016 Опубликовано 12 мая, 2016 · Жалоба Овладел телепатией ! Под эклипсом используете gcc, а под Keil - armcc !!! Ага. В сознании трудящихся текстовый редактор и компилятор слились воедино. Скоро будет "розовый компутер - для кортексов, серенький - для авр". Ждём притока блондинок в отрасль :cranky: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 12 мая, 2016 Опубликовано 12 мая, 2016 · Жалоба Овладел телепатией ! Под эклипсом используете gcc, а под Keil - armcc !!! Хорошо унизили. OK. Под AVR Studio кажется тоже GCC. Но и этот вариант не прокатил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 12 мая, 2016 Опубликовано 12 мая, 2016 · Жалоба Хорошо унизили. OK. Под AVR Studio кажется тоже GCC. Но и этот вариант не прокатил. Даже в мыслях не было. Можно gcc под Keil и armcc под эклипсом. Но тогда бы printf с fputc под эклипсом работал, а под Keil - нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 12 мая, 2016 Опубликовано 12 мая, 2016 (изменено) · Жалоба В общем в Кейле это работает: struct __FILE {int dummy;}; FILE __stdout; FILE __stdin; int fputc(int ch, FILE *f) А в Эклипсе я разные варианты пробовал - безуспешно. Но Кейл мне больше нравится и по другим причинам... Изменено 12 мая, 2016 пользователем Димон Безпарольный Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 13 мая, 2016 Опубликовано 13 мая, 2016 · Жалоба Чертов Куб. Пытался 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 тоже нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aleksandr Baranov 1 13 мая, 2016 Опубликовано 13 мая, 2016 (изменено) · Жалоба Чертов Куб. Пытался 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); } } Изменено 13 мая, 2016 пользователем Aleksandr Baranov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 13 мая, 2016 Опубликовано 13 мая, 2016 (изменено) · Жалоба А так не получится? //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 Изменено 13 мая, 2016 пользователем Димон Безпарольный Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lagman 1 14 мая, 2016 Опубликовано 14 мая, 2016 · Жалоба Не знаю что у вас там за проблемы, но если использовать связку CubeMX с установленными пакетами под нужное семейство (например STM32CubeF0) и System Workbench for STM32, понимая идеологию HAL все можно сделать не вчитываясь в даташит на микроконтроллер. Попробуйте обновить все программы и пакеты, и посмотреть примеры которые идут в пакетах (под каждое семейство свой пакет, вручную скачать с st и открыть архив) для CubeMX. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 14 мая, 2016 Опубликовано 14 мая, 2016 · Жалоба Нормально Куб генерирует всё. Надо птички/галки ставить где надо. И под прерывания генерит. Один минус чуть больше кода получается, но это можно потом пооптимизировать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lagman 1 14 мая, 2016 Опубликовано 14 мая, 2016 · Жалоба Может еще вот это мешает. Некоторые контроллеры имеют функции блокировки изменения конфигурации пинов, для 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 4 14 мая, 2016 Опубликовано 14 мая, 2016 · Жалоба Пишу код под 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 зачем? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 14 мая, 2016 Опубликовано 14 мая, 2016 (изменено) · Жалоба Для 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 я и поставил. Но прерывания были запрещены. Лажа этот куб. Ручками быстрее получилось. Изменено 14 мая, 2016 пользователем Димон Безпарольный Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться