Jump to content

    

asdus

Участник
  • Content Count

    21
  • Joined

  • Last visited

Community Reputation

0 Обычный

About asdus

  • Rank
    Участник
  • Birthday 06/30/1985

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array
  1. Стандартные алюминиевые конденсаторы для SMD монтажа, изначально Panasonic'овские, вроде как.
  2. Обязательно перепишу на DMA, как только, так сразу :) Для истории пишу свой код целиком, на неэффективных прерываниях и очередях :) Как-нибудь при случае замеряю загрузку ЦП. Работает на STM32F100RB (STM32VLDISCOVERY) И не забываем запустить шулдер до использования) хотя у меня работало и до включения, но не протестировано на стабильность. #include <stm32f10x.h> #include <FreeRTOS.h> #include <queue.h> static xQueueHandle MODBUS_RxQueue; static xQueueHandle MODBUS_TxQueue; void MODBUS_Init( void ) { NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; /* Create Rx/Tx Queues */ MODBUS_RxQueue = xQueueCreate( 256, sizeof( uint32_t ) ); MODBUS_TxQueue = xQueueCreate( 256, sizeof( uint32_t ) ); /* Enable GPIOA clock (for USART1 TX=PA9, RX=PA10) */ RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE ); /* Enable AFIO clock (for USART1 TX) */ RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE ); /* Enable UART1 clock */ RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1, ENABLE ); /* Select NVIC Preemption Priority Group 4 (for FreeRTOS) */ NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 ); /* Enable the USART1 Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = configLIBRARY_LOWEST_INTERRUPT_PRIORITY; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init( &NVIC_InitStructure ); /* Configure USART1 GPIO PINs (TX=PA9, RX=PA10) */ /* Configure USART1 Tx as alternate function push-pull */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init( GPIOA, &GPIO_InitStructure ); /* Configure USART1 Rx as input floating */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init( GPIOA, &GPIO_InitStructure ); /* Configure USART1 parameters 115200 8n1 noHW Tx+Rx*/ USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init( USART1, &USART_InitStructure ); USART_ITConfig( USART1, USART_IT_RXNE, ENABLE ); USART_Cmd( USART1, ENABLE ); } uint8_t MODBUS_GetChar( uint8_t *pcRxedChar ) { if( xQueueReceive( MODBUS_RxQueue, pcRxedChar, 0 ) ) { return pdTRUE; } else { return pdFALSE; } } void MODBUS_PutString( const uint8_t * pcString ) { uint8_t *pxNext; pxNext = ( uint8_t * ) pcString; while( *pxNext ) { MODBUS_PutChar( *pxNext ); pxNext++; } } uint8_t MODBUS_PutChar( uint8_t cOutChar ) { uint8_t xReturn; if( xQueueSend( MODBUS_TxQueue, &cOutChar, 10 ) == pdPASS ) { xReturn = pdPASS; USART_ITConfig( USART1, USART_IT_TXE, ENABLE ); } else { xReturn = pdFAIL; } return xReturn; } void USART1_IRQHandler( void ) { portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; uint8_t cChar; if( USART_GetITStatus( USART1, USART_IT_TXE ) == SET ) { if( xQueueReceiveFromISR( MODBUS_TxQueue, &cChar, &xHigherPriorityTaskWoken ) == pdTRUE ) { USART_SendData( USART1, cChar ); } else { USART_ITConfig( USART1, USART_IT_TXE, DISABLE ); } } if( USART_GetITStatus( USART1, USART_IT_RXNE ) == SET ) { cChar = USART_ReceiveData( USART1 ); xQueueSendFromISR( MODBUS_RxQueue, &cChar, &xHigherPriorityTaskWoken ); } portEND_SWITCHING_ISR( xHigherPriorityTaskWoken ); }
  3. Это нормально, обрабатывается ;) Проблема была решена. Действительно, она была в настройке прерываний. Конкретно: порт FreeRTOS под STM32 требует следующей настройки: NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); Почему он не делает это сам - непонятно. После выполнения этой команды все стало работать как должно.
  4. Спасибо за подсказку. В оригинальной программе такого небыло, прибил в тестовой. GetITStatus уже давно сбрасывает соответствующий ITPendingBit. На всякий случай добавил в тестовую прогу. Запустил тесты, ждем-с... Долго ждать не пришлось, ошибка сохранилась. К слову, с передачей, реализованной на тех-же прерываниях и очередях проблем нет, как и с передачей без использования очередей...
  5. Есть проектик, STM32F10*, FreeRTOS 7.1.0 USART реализован на прерываниях и очередях, по примеру из FreeRTOS С приемом все хорошо, а вот при передаче через некоторое время работы "портятся" данные. Свиду - сдвигаются указатели на голову и хвост в очереди. В данный момент пройтись отладчиком возможности нет. Выписал код в минипрогу, ошибка повторяется. Через некоторое, рандомное время, вместо "Hello World!\n" становится, например "rlWorld!\no Wo", потом еще что-нибудь и т.д. #include "stm32f10x.h" #include "FreeRTOS.h" #include "task.h" #include "queue.h" static xQueueHandle USART1_TxQueue; uint8_t USART1_PutChar( uint8_t cOutChar ) { uint8_t xReturn; if( xQueueSend( USART1_TxQueue, &cOutChar, 10 ) == pdPASS ) { xReturn = pdPASS; USART_ITConfig( USART1, USART_IT_TXE, ENABLE ); } else { xReturn = pdFAIL; } return xReturn; } void USART1_PutString( const uint8_t * pcString ) { uint8_t *pxNext; pxNext = ( uint8_t * ) pcString; while( *pxNext ) { USART1_PutChar( *pxNext ); pxNext++; } } void HelloWorldTask(void *pvParameters) { for(;;) { USART1_PutString("Hello World!\n"); vTaskDelay( 1000 ); } } void USART1_IRQHandler( void ) { portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; uint8_t cChar; if( USART_GetITStatus( USART1, USART_IT_TXE ) == SET ) { if( xQueueReceiveFromISR( USART1_TxQueue, &cChar, &xHigherPriorityTaskWoken ) == pdTRUE ) { USART_SendData( USART1, cChar ); } else { USART_ITConfig( USART1, USART_IT_TXE, DISABLE ); } } portEND_SWITCHING_ISR( xHigherPriorityTaskWoken ); } int main(void) { NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; /* Enable USART1 GPIO clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); /* Enable UART1 clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); /* Enable the USART1 Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = configLIBRARY_LOWEST_INTERRUPT_PRIORITY; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* Configure USART1 Tx as alternate function push-pull */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure USART1 Rx as input floating */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure USART1 parameters 115200 8n1 noHW Tx+Rx*/ USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); /* Create TxQueue for USART1 */ USART1_TxQueue = xQueueCreate( 256, ( unsigned portBASE_TYPE ) sizeof( uint8_t ) ); USART1_PutString("Program started!\n"); USART1_PutString("================\n"); xTaskCreate(HelloWorldTask, "HelWor", configMINIMAL_STACK_SIZE, NULL, 2, NULL); vTaskStartScheduler(); for(;;) { } }
  6. Фирма в Санкт-Петербурге, производство, ессно, Китай. Фирма крупная, имеет филиалы в разных странах, устройства тоже достаточно известные :) Не знаю. У меня оно работает на 30 метров по стандартной витой паре, линии RX и TX в парах с землей. Производителем описаны только максимальные длины линий (30м при 0.5мм^2, 50м при 0.8мм^2). Все это неплохо у них работает. Читаю их устройства без проблем, писать в них не получается :(
  7. Ммм... Устройства №1 и №2 фабричные, приведены кусочки схем. Это их штатное соединение. Подключиться могу только к желтым линиям (ну и земле, питанию). Хочу работать с ними своим прибором. протокол отреверсил. Скорость 7800 8n1 (да да, именно такая), заявленная производителем длина линии до 50м (у этой пары устройств). Питание у них общее, с одного БП.
  8. Дефайны STM32F10X_MD_VL и USE_STDPERIPH_DRIVER заданы? И почему-бы не "помигать" используя GPIO_SetBits(GPIOC, GPIO_Pin_8) и GPIO_ResetBits(GPIOC, GPIO_Pin_8)?
  9. А не подскажите как правильно?
  10. Есть два устройства на PICах, общаются друг с другом по длинной линии, вот так: В принципе все понятно. на линии держится уровень ~5V, RXD - TriState, TXD - OpenDrain с внутренней подтяжкой (читал что на PIC-ах есть такой). Блок питания у устройств общий (->общая земля), 5.6V для подтяжки на каждом с регулятора на стабилитроне. Пытаюсь работать с Устройством №2 вместо Устройства №1. ARM, питание 3.3V, так-же стоит регулятор на 5V для всяких нужд. Подключаюсь как на схеме №1, но добавив подтяжку на своем TXD (настроен на OpenDrain, но внутреннюю подтяжки нет). Ножки TXD и RXD - толерантные к 5V. Читаю приходящие данные без проблем, уровни на линии нормальные. Пишу данные. Уровни на линии - бардак. Пробовал разные подтяжки, от 4.7К до 270К - видно что данные в линию пишу, но с уровнями плохо (высокий уровень <5V), фронты заряда конденсатора появляются (при больших сопротивлениях подтяжки), Устройство №2 меня не понимает. Что делаю не так?
  11. Не, не изобретаю велосипедов :) а для фонарега давно нашел для себя драйвер: http://www.taskled.com/maxflex.html
  12. Ищу, но как-то печально... Есть желающие заработать? :)
  13. Разрабатывал, но к аналоговой технике никак отношения не имевших :) А по поводу пожеланий - знаете, это как в вакансиях, пишут что хочется, а берут что получится, выбирая лучшее. Если что - 20В по входу - такого в задачах нет, имелась ввиду какая-либо защита, если воткнут больше, если возможно :) И не обязательно на том-же драйвере, хотя у irf например видел такие... А по поводу сопряжения с МК... дык вариантов много, просто городить огород сильных не хотелось бы. 15-20 Ампер не интересно, я же даже про "защиту" от "выше 3А" писал... Buck-Boost-ы и SEPIC-и смотрел, как-то не нашел подходящих мне. Если взять ту же TI http://focus.ti.com.cn/cn/lit/sg/slvt160/slvt160.pdf то у Buck-Boost-ов выхода всего до 5.5V, а у SEPIC-ов от Vin - на понижение не работают... Правда это все в силу моего разумения, никогда не работавшего с аналоговой техникой :)
  14. 1 случай: стоит 1 li-ion, уже подсевшая, пусть выдает 3.5V, а выдавать нужно скажем 8V 2 случай: стоит 2 li-ion, заряженных, пусть выдают 8V, а выдавать нужно 4V ...
  15. Привет Возникла необходимость в хитропопом DC-DC преобразователе: Вход: 3.0-8.4V (1 или 2 li-ion/pol на выбор, или стационарный БП 7.5V) Выход: 3.3-7.4V (достаточно точный, высокостабильный, регулируемый с МК) Ток: 3A постоянной нагрузки Защита на входе: от переполюсовки легко, от малого напряжения не нужна (li-ion/pol с защитой), от большого напряжения нужна (например больше 12-21V) Защита на выходе: от КЗ и превышения тока, достаточно ограничением тока в 3А Основная проблема: требуется регулирование напряжения в "обе стороны". То есть может быть регулировка 8.4V->3.3V а может 3.0V->7.4V. Задача - подобрать драйвер для всего этого, максимально маленький по размеру (с учетом обвязки) и хорошим КПД, которым не шибко сложно управлять с МК. Пересмотрел уже кучу драйверов разных производителей - подходящего не нашел. Хотя наверняка пропустил. Подскажите, кто знает, что воткнуть. Пасибки ;)