Создание собственной системы стабилизации

SergDoc
Probelzaelo:

главное не шевелить все это безобразие после пайки.

ага особенно на коптере 😃 а вы размер себе представляете 4Х4мм по шесть лап с каждой стороны, там всё к чему припаятся это 0.05 мм хвостик и то если достану…

Probelzaelo
SergDoc:

ага особенно на коптере

ну если петля из провода наружу торчать не будет то подержится.

SergDoc:

всё к чему припаятся это 0.05 мм хвостик и то если достану…

Придется “выточить шильце” из проводка 0.1, либо оставить затею, чем все возможно и закончится. ))))
на самом деле из реальных вариантов как выше было сказано расковырять корпус, но лучше не иголкой, а гравером с тонким камнем мелким “напылением” слегка подточить корпус, если он не керамический, если керамический, то нужно будет совсем альмас, однако, чтоб Гюльчитай личико приоткыло. может что и получится. если не получится - все равно выбрасывать ))

SergDoc:

пинцетом выгрызло 13-ю лапу

Какое число не счастливое - 13 , а оно туда ест!

кстати а соседние 14,15,16 если они ни куда не включены(как сказано в даташите) и просто висят, то это очень удобная “держалка” для проводничка, правда у держалки длина 0.4мм, корпус нужно пилить вдоль этих нескольких ног сразу до появления “металла” и класть на них поперек жилку из провода, чтоб она и 13 захватила, лишнее срезать нафиг, а как и куда потом объединять площадки 13,14,15 уже решать проще. сильно надеюсь они там не на земле…

SergDoc

Мир не без добрых людей, сегодня закажу новую 😃
Пока есть чем заняться, ещё не разобрался с Uart+DMA, SPI - драйвер вроде осилил, да ещё драйвер самой MPU надо делать, придумывать как его присобачить, потом USB, работы ещё уйма, чем занять два лишних светодиода? а ещё SPI Flash и i2c eeprom, думаю пока датчик приедет ещё ПО готово не будет, есть сомнения по i2c…

SergDoc

Плату-то можно сделать будет и намного меньше, при том, что китайцы научились 4-х слойки делать, чувствую тема никогда не кончится 😃 предлагаю, пока естественно чисто теоретически, новый проект, но уже на “крутых” датчиках, кто что предложит? (аналоговые через АЦП-SPI) Настроение у меня сегодня хорошее 😃

Sir_Alex

Поделитесь плиз секретом, где затариваться детальками для мелкосерийного производства? Ну там 50 штучек того, 50 того… На ebay в принципе есть поставщики, но мало ли где то есть еще дешевле.

Сергей, ты заказывал в РБ, ну скажем 50 микрух, были ли проблемы с таможней?

SergDoc
Sir_Alex:

ну скажем 50 микрух, были ли проблемы с таможней?

не я так много не беру, одну две, а вот платок 10 и ничего… пропы тоже пачками, три четыре упаковки по 6 шт.

mahowik
Sir_Alex:

Поделитесь плиз секретом, где затариваться детальками для мелкосерийного производства? Ну там 50 штучек того, 50 того…

www.digikey.com рулит… дистрибьюторы по всему миру… даж РБ вроде www.digikey.by
ценник пожалуй самый низкий, а ассортимент товара огромный… есть если не все, то почти все… не знаю только что с доставкой в РБ… в канаду 7$…

как пример www.digikey.com/scripts/dksearch/dksus.dll?vendor=…
www.digikey.com/scripts/DkSearch/dksus.dll?WT.z_ci…

SergDoc

В РБ нифига не пошлют, ибо ню-ню… мы вне закона 😃 доставка от 44 а потом скажут - мы не можем выслать данный товар, потому что бла, бла, бла… да потом ещё месяц спрашивать каждый день будут, а зачем вы хотели купить это?

mahowik

херова ((
могу STM32F4DISCOVERY по себестоимости передать с кем (с налогами и доставкой чета около 23$), если кто будет ехать из знакомых… не пользованая по сути… себе по надобности новую закажу…

SergDoc

есть дырка, но к сожалению, уже в долги залез, так что накоплю - куплю себе проц нормальный…

Gapey

ИМХО , если не использовать DMP , то закладывать в разработку MPU-6000 было несовсем правильное решение ибо недешево и вечные проблемы с доставабельностью … может есть смысл сделать еще один вариант верхней платы на чемнибуди более даставабельном ??? LSM330 или L3g4200 + bma180 ???

PS: интересно что быстрее станет доступно LSM333 или MPU-9250 …
PPS: посылку собрал …

SergDoc

чёт не догоняю я этот uart dma, uart1 dma1, а какой Stream ? тфу-ты из AutoQuad-а выдернуть же можно…

Gapey:

LSM330

чёта я лсм-ки наелся, хотяяя - жду безветрия попробую, должно уже нормально полететь…

блин уже башка трещит, stream а потом chanel ещё, куда чего писать?

Sir_Alex
mahowik:

www.digikey.com рулит… дистрибьюторы по всему миру… даж РБ вроде www.digikey.by ценник пожалуй самый низкий, а ассортимент товара огромный… есть если не все, то почти все… не знаю только что с доставкой в РБ… в канаду 7$…

Не не, доставка у них от 100$ в Беларусь. А по ценнику, посмотри и биплатно пришлют 😃

SergDoc
Sir_Alex:

А по ценнику, посмотри и биплатно пришлют

только картинка зачётная не vgt а vet 😃 а в vet только вий и аероквад лезут, у остальных проектов флеха занята под 400кb и выше…

SergDoc

ну вот, переделанный uart Билла Несбита, под f4 ихний почему-то не нашел, так что переделывал старый, который спёр Таймкоп


#include "board.h"

/*
    DMA UART routines idea lifted from AutoQuad
    Copyright © 2011  Bill Nesbitt
*/
#define UART_BUFFER_SIZE    256

// Receive buffer, circular DMA
volatile uint8_t rxBuffer[UART_BUFFER_SIZE];
uint32_t rxDMAPos = 0;
volatile uint8_t txBuffer[UART_BUFFER_SIZE];
uint32_t txBufferTail = 0;
uint32_t txBufferHead = 0;

static void uartTxDMA(void)
{
	DMA1_Stream4->M0AR = (uint32_t)&txBuffer[txBufferTail];
    if (txBufferHead > txBufferTail) {
    	DMA1_Stream4->NDTR = txBufferHead - txBufferTail;
        txBufferTail = txBufferHead;
    } else {
    	DMA1_Stream4->NDTR = UART_BUFFER_SIZE - txBufferTail;
        txBufferTail = 0;
    }

    DMA_Cmd(DMA1_Stream4, ENABLE);
}

void DMA1_Channel4_IRQHandler(void)
{
    DMA_ClearITPendingBit(DMA1_Stream4, DMA_IT_TCIF4);
    DMA_Cmd(DMA1_Stream4, DISABLE);

    if (txBufferHead != txBufferTail)
        uartTxDMA();
}

void uartInit(uint32_t speed)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    DMA_InitTypeDef DMA_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    // USART1_TX    PA9
    // USART1_RX    PA10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // DMA TX Interrupt
    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    USART_InitStructure.USART_BaudRate = speed;
    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);

    // Receive DMA into a circular buffer
    DMA_DeInit(DMA1_Stream5);
    DMA_InitStructure.DMA_Channel = DMA_Channel_5;
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
    DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;
    DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)rxBuffer;
    DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    DMA_InitStructure.DMA_BufferSize = UART_BUFFER_SIZE;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
    DMA_Init(DMA1_Stream5, &DMA_InitStructure);

    DMA_Cmd(DMA1_Stream5, ENABLE);
    USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
    rxDMAPos = DMA_GetCurrDataCounter(DMA1_Stream5);

    // Transmit DMA
    DMA_DeInit(DMA1_Stream5);
    DMA_InitStructure.DMA_Channel = DMA_Channel_5;
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
    DMA_Init(DMA1_Stream5, &DMA_InitStructure);
    DMA_ITConfig(DMA1_Stream5, DMA_IT_TC, ENABLE);
    DMA1_Stream5->NDTR = 0;
    USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);

    USART_Cmd(USART1, ENABLE);
}

uint16_t uartAvailable(void)
{
    return (DMA_GetCurrDataCounter(DMA1_Stream5) != rxDMAPos) ? true : false;
}

bool uartTransmitEmpty(void)
{
    return (txBufferTail == txBufferHead);
}

uint8_t uartRead(void)
{
    uint8_t ch;

    ch = rxBuffer[UART_BUFFER_SIZE - rxDMAPos];
    // go back around the buffer
    if (--rxDMAPos == 0)
        rxDMAPos = UART_BUFFER_SIZE;

    return ch;
}

uint8_t uartReadPoll(void)
{
    while (!uartAvailable()); // wait for some bytes
    return uartRead();
}

void uartWrite(uint8_t ch)
{
    txBuffer[txBufferHead] = ch;
    txBufferHead = (txBufferHead + 1) % UART_BUFFER_SIZE;

    // if DMA wasn't enabled, fire it up
    if (!(DMA1_Stream4->CR & 1))
        uartTxDMA();
}

void uartPrint(char *str)
{
    while (*str)
        uartWrite(*(str++));
}

/* -------------------------- UART2  ----------------------------- */
uartReceiveCallbackPtr uart2Callback = NULL;
#define UART2_BUFFER_SIZE    128

volatile uint8_t tx2Buffer[UART2_BUFFER_SIZE];
uint32_t tx2BufferTail = 0;
uint32_t tx2BufferHead = 0;
bool uart2RxOnly = false;

static void uart2Open(uint32_t speed)
{
    USART_InitTypeDef USART_InitStructure;

    USART_StructInit(&USART_InitStructure);
    USART_InitStructure.USART_BaudRate = speed;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | (uart2RxOnly ? 0 : USART_Mode_Tx);
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_Init(USART2, &USART_InitStructure);
    USART_Cmd(USART2, ENABLE);
}

void uart2Init(uint32_t speed, uartReceiveCallbackPtr func, bool rxOnly)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

    uart2RxOnly = rxOnly;

    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    // USART2_TX    PD5
    // USART2_RX    PD6
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    if (!rxOnly)
        GPIO_Init(GPIOD, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

    uart2Open(speed);
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
    if (!rxOnly)
        USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
    uart2Callback = func;
}

void uart2ChangeBaud(uint32_t speed)
{
    uart2Open(speed);
}

void uart2Write(uint8_t ch)
{
    if (uart2RxOnly)
        return;

    tx2Buffer[tx2BufferHead] = ch;
    tx2BufferHead = (tx2BufferHead + 1) % UART2_BUFFER_SIZE;

    USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
}

bool uart2TransmitEmpty(void)
{
    return tx2BufferTail == tx2BufferHead;
}

void USART2_IRQHandler(void)
{
    uint16_t SR = USART2->SR;

    if (SR & USART_IT_RXNE) {
        if (uart2Callback)
            uart2Callback(USART_ReceiveData(USART2));
    }
    if (SR & USART_FLAG_TXE) {
        if (tx2BufferTail != tx2BufferHead) {
            USART2->DR = tx2Buffer[tx2BufferTail];
            tx2BufferTail = (tx2BufferTail + 1) % UART2_BUFFER_SIZE;
        } else {
            USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
        }
    }
}

/* -------------------------- UART3  ----------------------------- */
uartReceiveCallbackPtr uart3Callback = NULL;
#define UART3_BUFFER_SIZE    128

volatile uint8_t tx3Buffer[UART3_BUFFER_SIZE];
uint32_t tx3BufferTail = 0;
uint32_t tx3BufferHead = 0;
bool uart3RxOnly = false;

static void uart3Open(uint32_t speed)
{
    USART_InitTypeDef USART_InitStructure;

    USART_StructInit(&USART_InitStructure);
    USART_InitStructure.USART_BaudRate = speed;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | (uart3RxOnly ? 0 : USART_Mode_Tx);
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_Init(USART3, &USART_InitStructure);
    USART_Cmd(USART3, ENABLE);
}

void uart3Init(uint32_t speed, uartReceiveCallbackPtr func, bool rxOnly)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);

    uart3RxOnly = rxOnly;

    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    // USART2_TX    PD8
    // USART2_RX    PD9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    if (!rxOnly)
        GPIO_Init(GPIOD, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

    uart3Open(speed);
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
    if (!rxOnly)
        USART_ITConfig(USART3, USART_IT_TXE, ENABLE);
    uart3Callback = func;
}

void uart3ChangeBaud(uint32_t speed)
{
    uart3Open(speed);
}

void uart3Write(uint8_t ch)
{
    if (uart3RxOnly)
        return;

    tx3Buffer[tx3BufferHead] = ch;
    tx3BufferHead = (tx3BufferHead + 1) % UART3_BUFFER_SIZE;

    USART_ITConfig(USART3, USART_IT_TXE, ENABLE);
}

bool uart3TransmitEmpty(void)
{
    return tx3BufferTail == tx3BufferHead;
}

void USART3_IRQHandler(void)
{
    uint16_t SR = USART3->SR;

    if (SR & USART_IT_RXNE) {
        if (uart3Callback)
            uart3Callback(USART_ReceiveData(USART3));
    }
    if (SR & USART_FLAG_TXE) {
        if (tx3BufferTail != tx3BufferHead) {
            USART3->DR = tx3Buffer[tx3BufferTail];
            tx3BufferTail = (tx3BufferTail + 1) % UART3_BUFFER_SIZE;
        } else {
            USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
        }
    }
}

проект компилится, но далеко не факт что я что-то не намудрил 😃
только вот под телеметрию, тоже с DMA надо? если да то - ну его нафиг 😃

DVE

Вышел новый Кролик 😃
www.aliexpress.com/item/…/820519824.html
Параметры они не пишут но примерно наверно можно прикинуть что там

  • 32 digits 72 MHZ CPU
  • Gyroscope: ±2000dps,16 digits resolution ratio, responding time:1000HZ
  • Accelerometer: -8G,14 digits resolution ratio, responding time:800Hz
  • Digital Compass:± 1 deg

Мне что-то думается что туда с минимальными переделками зальется версия от timecop, или я ошибаюсь? 😃
Даже подумалось не купить ли одного кролика на опыты…

rual
DVE:

Параметры они не пишут но примерно наверно можно прикинуть что там - 32 digits 72 MHZ CPU - Gyroscope: ±2000dps,16 digits resolution ratio, responding time:1000HZ - Accelerometer: -8G,14 digits resolution ratio, responding time:800Hz - Digital Compass:± 1 deg

“Кролики это не только ценный мех…” Что там за проц? Какая шина к датчикам? В целом схематехнику не плохо бы было посмотреть… Если там СТМ то можно залить что угодно, вопрос только в количестве памяти и функционале ШИМ-входов\выходов.

SergDoc:

только вот под телеметрию, тоже с DMA надо? если да то - ну его нафиг

ПДП по уарт не использовал, но в самом деле нет никого волшебства, должно работать. Главное правильно распределить каналы, чтоб не получилось что 2 разных устройства используют один канал.

Вот у меня так :

/*******************************************************************************
* Function Name  :  USART_Config_Default.
* Description    :  configure the USART1 with default values.
* Input          :  None.
* Return         :  None.
*******************************************************************************/
void USART1_Config(uint32_t rate)
{
  GPIO_InitTypeDef GPIO_InitStructure;
 USART_InitTypeDef USART_InitStructure;
 /* подадим такт на порт */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
  /* настройка выводов порта */
  GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4|GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  /* Соединим выводы портов с AF7 */
 GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_7);
 GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_7);

  /* обнуляем указатели буферов */
  USART1_TX_src_ptr = USART1_TX_dst_ptr = 0;
  USART1_RX_src_ptr = USART1_RX_dst_ptr = 0;
  /* настройка УПСИ */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  USART_InitStructure.USART_BaudRate = rate;
  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);
  /* Enable the USART Receive interrupt */
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
  USART_Cmd(USART1, ENABLE);
  NVIC_EnableIRQ(USART1_IRQn);
  NVIC_SetPriority(USART1_IRQn, 15);
}
/*************** передача байта в УСПСИ *************************/
uint8_t USART1_TX_buff[256]; /* буфер для передачи УСПИСИ */
uint8_t USART1_TX_src_ptr; /* указатель на буфер для передачи УСПИСИ */
uint8_t USART1_TX_dst_ptr; /* указатель на буфер для передачи УСПИСИ */
void USART1_Transmite(uint8_t data)
{
 USART1_TX_buff[USART1_TX_src_ptr++] = data;
 USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
}
/**************** приём байта из УСПСИ ****************************/
uint8_t USART1_RX_buff[256]; /* буфер для приема УСПИСИ */
uint8_t USART1_RX_src_ptr; /* указатель на буфер для приема УСПИСИ */
uint8_t USART1_RX_dst_ptr; /* указатель на буфер для приема УСПИСИ */
uint8_t USART1_Recieve()
{
 if(USART1_RX_dst_ptr == USART1_RX_src_ptr)
  return 0;
 else
  return USART1_RX_buff[USART1_RX_dst_ptr++];
}
/**************** получение кол-ва принятых байт УСПСИ ****************************/
uint8_t USART1_Available(void)
{
  return (USART1_RX_dst_ptr != USART1_RX_src_ptr) ;
}

обработчик

/*******************************************************************************
* Function Name  : EVAL_COM1_IRQHandler
* Description    : This function handles EVAL_COM1 global interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void USART1_IRQHandler(void)
{
  /* ïðè¸ì */
  if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET)
  {
    USART1_RX_buff[USART1_RX_src_ptr++] = USART_ReceiveData(USART1);
  }
  /* ïåðåäà÷à */
  if (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == SET)
  {
   if (USART1_TX_dst_ptr == USART1_TX_src_ptr)
  USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
 else  USART_SendData(USART1, USART1_TX_buff[USART1_TX_dst_ptr++]);
  }
  if (USART_GetFlagStatus(USART1, USART_FLAG_TC) == SET)
    USART_ClearFlag(USART1, USART_FLAG_TC);
  /* If overrun condition occurs, clear the ORE flag and recover communication */
  if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)
 {
    (void)USART_ReceiveData(USART1);
  USART_ClearFlag(USART1, USART_FLAG_ORE);
 }

}

обложки

extern void USART_Transmite(uint8_t data);
extern uint8_t  USART_Recieve(void);
uint8_t USART_Available(void);

struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;
FILE __stdin;
int  fputc(int ch, FILE* f)
{
 //ITM_SendChar(ch);
 USB_PutChar(ch);
 USART1_Transmite(ch);
 return ch;
}

int fgetc(FILE *f)
{
//  if (ITM_CheckChar()){
//   return ITM_ReceiveChar();
//  }

 if (USB_Available()) {
  return USB_GetChar();
 }
 if (USART1_Available()){
  return USART1_Recieve();
 }
 return EOF;
}

то что про УСБ закомметируй

oleg70

Вот что у меня осталось от DiscoveryF3 после небольшой работы с ЛУТом:

SergDoc
DVE:

Вышел новый Кролик

переделывать нужно будет, но не критично…

вчера, сегодня и наверно и завтра сижу с детьми, пасха, жена в костёле пропадает, да и готовить на стол надо, так что не подходил не к чему…
а, вот, нормально, что загрузчик требует выбрать сколько флеши в проце, на 103-м сам определял?

SergDoc
rual:

Соединим выводы портов с AF7

так можно только цифирку писать - AF из таблицы? а я писал везде uartX, timerX…

SergDoc

блин, решил поморгать светодиодиками, а работают только 2 из четырёх - обидно…