Search the Community
Showing results for tags 'stm32f4discovery'.
Found 5 results
-
Плата Sstm32f4discovery. Использую HAL. Стандартная инициализация не вырезана. Тактирование настраивается так: RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_OscInitTypeDef RCC_OscInitStruct; // Enable Power Control clock __PWR_CLK_ENABLE(); // The voltage scaling allows optimizing the power consumption when the // device is clocked below the maximum system frequency, to update the // voltage scaling value regarding system frequency refer to product // datasheet. __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); // Enable HSE Oscillator and activate PLL with HSE as source RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; // This assumes the HSE_VALUE is a multiple of 1MHz. If this is not // your case, you have to recompute these PLL constants. RCC_OscInitStruct.PLL.PLLM = (HSE_VALUE/1000000u); RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 7; HAL_RCC_OscConfig(&RCC_OscInitStruct); // Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 // clocks dividers RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5); То есть тактируемтся от 16 MHz HSI, все делители - 1. Сам код передачи/приёма тоже HAL: #include <stm32f4xx_hal.h> UART_HandleTypeDef comp; uint8_t for_send[] = {0}; uint8_t for_receive[] = {1}; void init_led ( void ) { GPIO_InitTypeDef led; __HAL_RCC_GPIOD_CLK_ENABLE( ); led.Mode = GPIO_MODE_OUTPUT_PP; led.Pin = GPIO_PIN_14 | GPIO_PIN_15; led.Speed = GPIO_SPEED_LOW; led.Pull = GPIO_NOPULL; HAL_GPIO_Init( GPIOD, &led ); } void HAL_UART_MspInit ( UART_HandleTypeDef * huart ) { __HAL_RCC_USART1_CLK_ENABLE( ); __HAL_RCC_GPIOB_CLK_ENABLE( ); GPIO_InitTypeDef gpio; gpio.Mode = GPIO_MODE_AF_PP; gpio.Pin = GPIO_PIN_6 | GPIO_PIN_6; gpio.Pull = GPIO_PULLUP; gpio.Alternate = GPIO_AF7_USART1; gpio.Speed = GPIO_SPEED_MEDIUM; HAL_GPIO_Init( GPIOD, &gpio ); HAL_NVIC_EnableIRQ( USART1_IRQn ); } int main ( void ) { comp.Init.BaudRate = 9600; comp.Init.Mode = UART_MODE_TX_RX; comp.Init.HwFlowCtl = UART_HWCONTROL_NONE; comp.Init.WordLength = UART_WORDLENGTH_8B; comp.Init.OverSampling = UART_OVERSAMPLING_16; comp.Init.Parity = UART_PARITY_NONE; comp.Init.StopBits = UART_STOPBITS_1; comp.Instance = USART1; comp.State = 0; HAL_UART_Init( &comp ); __HAL_USART_ENABLE_IT( &comp, UART_IT_TXE ); __HAL_USART_ENABLE_IT( &comp, UART_IT_RXNE ); init_led( ); HAL_GPIO_WritePin( GPIOD, GPIO_PIN_15, SET ); while ( 1 ) { for( volatile int i = 0; i < 100000; i ++ ) { ; } HAL_GPIO_TogglePin( GPIOD, GPIO_PIN_14 ); } } void USART1_IRQHandler( void ) { if ( __HAL_UART_GET_FLAG( &comp, UART_FLAG_TXE ) ) { __HAL_UART_DISABLE_IT( &comp, UART_IT_TXE ); HAL_UART_Transmit( &comp, for_send, 1, 0 ); __HAL_UART_CLEAR_FLAG( &comp, UART_FLAG_TXE ); } if ( __HAL_UART_GET_FLAG( &comp, UART_FLAG_RXNE)) { __HAL_UART_DISABLE_IT( &comp, UART_FLAG_RXNE ); HAL_UART_Receive( &comp, for_receive, 1, 0 ); HAL_GPIO_WritePin( GPIOD, GPIO_PIN_15, RESET ); __HAL_UART_CLEAR_FLAG( &comp, UART_FLAG_RXNE ); } } Всё просто. Включаем передачу, приём. Передаём, в приёмнике забираем информацию и гасим включенный светодиод. ЗАходит в прерывание по TXE отправляет данные (Должны ли мы увидеть изменение регистра DR в отладчике, просто он остаётся пустой) Отослал, вышел из прерывания, начитает мигать светодиодом( просто как индикатор что схема работает). Но приёма не происходит. Все инициализации сверены с user_manual. По всему коду прошёлся с отладчиком, все биты HAL выставляет правильно. PB6 и PB7 просто перемычкой соединены.
-
Добрый день. Решил сделать часы на газоразрядных индикаторах. Остановился на управлении дешифратором, который преобразует двоичный код порта в десятичный. Использую дешифратор К155ИД1 и отладочную плату STM32F4Discovery. Проблема в следующем: при попытке выставить любое значение порта от 0b0000 до 0b1111 напряжение на выводах микроконтроллера "гуляет" в пределах 0,5 - 1,3 В, адекватно реагирует только нулевой пин. То есть, если отладчик показывает, что GPIOA = 0b0110, то на нулевом выходе логический ноль(0 - 10мВ), а на остальных "болтанка". Пробовал "перенести" программу на другие порты - все то же самое, только на порте Е адекватно работают 0 и 2 пины. Пробовал проводить измерения как с висящими в воздухе выводами, так и подключенными к дешифратору, результат 0. В чем может быть дело? Схему подключения и файлы проекта прикладываю ниже. Простите за внешний вид кода - это рабочая версия. В конце простыни можно увидеть попытки присвоить различные значения порту и проверить, что будет на выходе. Результат остался нулевым. Еще раз повторюсь, отладчик указывает, что в порты выставляется значение как положено, но при измерении получается ****. Nixie_Clock_0v01.rar
-
здравствуйте, подскажите пожалуйста, имеется STM32F4Discovery и вот этот драйвер http://www.pololu.com/product/777, на Discovery настроил порты, задержка, флаги, USART, отправка команд идет через sprintf, когда запускаю просто светодиод мигает, но двигатели не хотят работать, не могу никак разобраться как довести его до ума
-
Привет всем Озаботился тут созданием USB HID устройства на данном проце. Находил с интернете массу примеров HID устройств, эмулирующих джойстики, мыши, клавиатуры, пульты ДУ и прочую дребедень... Но мне не нужны все эти клавиатуры, джойстики и пульты .... Нужно Generic устройство - принять от компа 64 байта, отправить в комп 64 байта. И всё. Такой пример я нашёл только один - http://we.easyelectr...4-discovey.html , как пишет автор, на основе примера от более младших STM32. Этот пример включает/выключает светодиодики платы по команде с компа и шлёт в комп данные, когда нажимают кнопку. Это работает. Но у него размер и входящего и исходящего блока данных - 2 байта вместо доступных 64 (видимо автор память экономит, ему почти 200 кил RAM этого камня мало ) - форменное издевательство короче . Решил я его пример переделать. Поменял VID, PID, чтобы моя прога его увидела, нашёл дескриптор конфигурации, исправил 2 макроса, описывающих размеры конечных точек, прошил. Работоспособность лампочек и кнопки не нарушилась, всё исправно управляется, на кнопку реагирует, но чтение свойств устройства показывает InputReportByteLength=OutputReportByteLength=2, т.е. размер репортов не изменился. Нашёл я HID дескриптор, изменил его. Убрал описания кнопок, лампочек, оставил только описания входного и выходного репортов. Получилось следующее: #define CUSTOMHID_SIZ_REPORT_DESC 32 ........................ __ALIGN_BEGIN static uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] __ALIGN_END = { // Global Usage Page - Vendor-defined 0x06, 0xFF, 0x00, // USAGE_PAGE (0xFF00) // Collection: Application 0x09, 0xFF, // USAGE (vendor defined) 0xA1, 0x01, // COLLECTION (Application) // Input report: Vendor-defined 0x09, 0xFF, // USAGE (vendor defined) 0x95, HID_IN_PACKET, // REPORT_COUNT = 64 - Размер конечной точки 0x75, 8, // REPORT_SIZE = 8 0x15, (unsigned char) -128, // 0x15, 0x25, (unsigned char) 127, // 0x25, 0x81, 0, // Output report: vendor-defined 0x09, 0xFF, // USAGE (vendor defined) 0x95, HID_OUT_PACKET, // REPORT_COUNT = 64 - Размер конечной точки 0x75, 8, // REPORT_SIZE = 8 0x15, (unsigned char) -128, // 0x15 0x25, (unsigned char) 127, // 0x25 0x91, 0, // 0xC0 // End collection }; // CustomHID_ReportDescriptor Устройство опознаётся, винда не ругается, но чтение свойств даёт InputReportByteLength=OutputReportByteLength=65 (!) и все попытки что либо послать в железяку даёт ошибку 87 - Invalid Parameter. Хоть и шлю я ему 2 байта ... На чтении тупо виснет без каких-либо ошибок. Прогу приходится диспетчером задач вырубать. Сильно подозреваю, что западло заключено в этих 65 байтах и сидит оно в HID дескрипторе, но не пойму что именно там не так. Сам по себе HID дескриптор вроде правильный, на древнейшем AT91SAM7S256 2006 года выпуска работает с песнями . Помогите пожалуйста, кто может. Спасибо. ЗЫ. Утилиту HID Descriptor Tool 13-летней давности видел, знаю, но вот никак за эти 13 лет не врублюсь, что там к чему. То ли я идиот, то ли писали её идиоты . К тому же вылетает она с какими-то сбоями типа "Can't read memory at address 0x00000000" .... Можно, конечно, сделать CDC, проэмулировать COM-порт (кстати делал, работает ), это может и лучше с т.з. быстродействия (всё-таки bulk-передачи, а не Control), но не хочется, чтобы железка торчала в списке портов.
-
Суть задачи состоит в следующем: необходимо разработать модуля передачи файлов (например сигнала, записанного с микрофона на плате) из USB-флешки (подключенной к плате STM32F4Discovery) по интерфейсу UART. Если кто-то этим занимался или может что-то подсказать, то буду благодарен за любую толковую информацию.
- 3 replies
-
- STM32F4Discovery
- USB
-
(and 2 more)
Tagged with: