Микроконтроллеры STM32 - тонкости работы, отладочные платы

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 153
Зарегистрирован: Чт дек 05, 2019 16:28:11
Откуда: Самара

Сообщение TEPEM »

Я взял рабочий пример и он не работает. Взял несколько разных от всех 1 эффект. Тут что то кардинальное
Реклама
Родился
Сообщения: 12
Зарегистрирован: Пт янв 07, 2022 14:15:04

Сообщение Странник 05 »

Всем привет ! Проблема такая . Есть отладочная плата stm32mini на борту контроллер stm32f405 , так он определяется ST-link ом . Также есть программа к этому контроллеру . Но после программирования рабочей прошивкой контроллер не работает. Этой же прошивкой прошиваю рабочее устройство на таком же контроллере и все в порядке все работает . Порты которые использует контроллер на отладочной плате все свободны , прошивал как ST-link ом так и через UART все прошивается но не работает . В чем может быть причина куда копать ? Может на этой плате стоит какая нибудь защита ? Прошивка есть но компилированная исходника нет .
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7121
Зарегистрирован: Сб янв 28, 2006 22:47:24

Сообщение Asmodey »

В любой непонятной ситуации давите reset.
Астролябия-сама меряет, было бы что мерять!!!
Родился
Сообщения: 12
Зарегистрирован: Пт янв 07, 2022 14:15:04

Сообщение Странник 05 »

Тут как бы , дело не в reset . А в самом stm32f405 mini . Контроллер прошивается но не работает .
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 7121
Зарегистрирован: Сб янв 28, 2006 22:47:24

Сообщение Asmodey »

Тогда отожмите ресет.
Астролябия-сама меряет, было бы что мерять!!!
Реклама
Родился
Сообщения: 12
Зарегистрирован: Пт янв 07, 2022 14:15:04

Сообщение Странник 05 »

Нету тут такого , )))
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7121
Зарегистрирован: Сб янв 28, 2006 22:47:24

Сообщение Asmodey »

[uquote="Странник 05",url="/forum/viewtopic.php?p=4440665#p4440665"]Нету тут такого , )))[/uquote]
Это у вас нету, а на рабочей плате, возможно, очень даже есть. А может там еще прерывания откуда-то приходят или уровни какие-то без которых прога в МК не шевелится.
Астролябия-сама меряет, было бы что мерять!!!
Родился
Сообщения: 12
Зарегистрирован: Пт янв 07, 2022 14:15:04

Сообщение Странник 05 »

На плате есть все и кнопка reset тоже , кроме двух программаторов . Они идут отдельно SWD UART. Простые програмки тестил тоже . Используемые выводы подключал тоже все работает . Контроллер жив . Куплен на али .

Добавлено after 28 minutes 40 seconds:
Re: Микроконтроллеры STM32 - тонкости работы, отладочные платы
Тут единственный вариант, попробовать на другой макетной плате с stm32f405 возможно будет работать и с f407 но не уверен ... . Но у меня их только две . Одна отладочная другая прототип . На последней все исправно работает на "отладочной " нет . Вот сбственно она https://aliexpress.ru/item/100500399797 ... 1682QvGQkL
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Может, ножки BOOT куда-то подтянуты?
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Сообщение a797945 »

к мысли, озвученной Asmodey, можно проверить все ножки, задействованные в прошивке - хоть на какой, есть ли какая активность: переключилась на выход или включились ли подтягивающий резисторы.
Родился
Сообщения: 1
Зарегистрирован: Пн дек 04, 2023 11:51:31

Сообщение ПастРом »

Здравствуйте, у меня проблема при попытке загрузить прошивку на отладочную плату STM32F407. Плата имеет все необходимое для работы, включая кнопку сброса, но при подключении программатора и попытке загрузки прошивки программатор не видит контроллер. Я что-то не знаю, что делать?
Здесь увлекательные игры https://altsarepta.ru/
Вымогатель припоя
Сообщения: 550
Зарегистрирован: Вт фев 09, 2010 17:52:26

Сообщение codenamehawk »

ПастРом писал(а):Я что-то не знаю, что делать?
Очевидно что не знаете.
Контроллер должен быть виден при подключении программатора, если его не видно то что вы пытаетесь шить?
cubeprog.png
(94.3 КБ) 204 скачивания
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 153
Зарегистрирован: Чт дек 05, 2019 16:28:11
Откуда: Самара

Сообщение TEPEM »

Здравствуйте ребята!!!! Я очень скучал по вам!)))
Есть три неприятные функции в хале, которые я пытаюсь заменить cmsis. Помогите пожалуйста.

Код: Выделить всё

HAL_SPI_Transmit(&hspi1,&dt,1,1000);//отправим данные в шину
HAL_SPI_Receive(&hspi1,pBuf,bytes,1000);//отправим данные в буфер
HAL_SPI_TransmitReceive(&hspi1,&addr,&dt,1,1000);
Я их пытаюсь заменить вот так

Код: Выделить всё

uint16_t w25_send_receive_data(uint16_t data)
{
    while(!(SPI1->SR & SPI_SR_TXE));
    SPI1->DR = data;
    while(!(SPI1->SR & SPI_SR_RXNE));
    return SPI1->DR;
}
void SPI1_Send (uint8_t *dt, uint16_t cnt)
{  
  for(int i=0; i < cnt; i++ )
  { w25_send_receive_data(dt[i]); }//
}
void SPI1_Recv (uint8_t *dt, uint16_t cnt)
{
 for(int i=0; i < cnt; i++ )
  { dt[i] = w25_send_receive_data(0x00); }//
}
Ну и собственно -

Код: Выделить всё

HAL_SPI_Transmit(&hspi1,&dt,1,1000);//отправим данные в шину
меняю на 
SPI1_Send (&dt, 1);
Тут еще ладно, но вот дальше я имею большие сомнения
HAL_SPI_Receive(&hspi1,pBuf,bytes,1000);//отправим данные в буфе
Меняю на 
SPI1_Recv (pBuf,bytes);
А тут вообще жесть
HAL_SPI_TransmitReceive(&hspi1,&addr,&dt,1,1000);
пытаюсь поменять на 
    SPI1_Send (&addr, 1); и 
    SPI1_Recv (&dt, 1);
И чувствую что не прав я в этом к сожалению
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Правильные сомнения. Чип не указан, есть ли fifo не указано, запись 8/16/32 в DR скорее всего имеет значение. Перед чтением я бы dr и fifo чистил.

Чем hal-овские функции не устраивают? Почему не подсмотреть как там сделано? Что в RM написано про отправку и приём прочитано?
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 153
Зарегистрирован: Чт дек 05, 2019 16:28:11
Откуда: Самара

Сообщение TEPEM »

[img][img]https://e.radikal.host/2024/01/06/PEfVii0hcy4.jpg[/img][/img]Вот у меня NRF24L01 и f411
Что с MOSI такое?
Это не хвост, это антенна
Сообщения: 1379
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Сообщение tonyk »

TEPEM писал(а):Есть три неприятные функции в хале, которые я пытаюсь заменить cmsis.
Если я правильно понял, ТС используется SPI для работы с W25Qxxx. Вот простейший вариант реализации доступа к этой микросхеме. Работает на STM32F4.
Спойлер

Код: Выделить всё

#define W25Q_GUARD  ( 40'000'000 )

////////////////////////////////////////////////////////////////////////////////

uint8
W25Q::SPI_exchange( uint8 _aByte )
{
    uint8
        tmp8;
    int32
        guard = W25Q_GUARD;

    while( ( spi -> SR & SPI_SR_RXNE ) && ( guard > 0 ) )
    {
        tmp8 = spi -> DR;
        guard--;
    };

    if( guard <= 0 )
    {
        theMemoryIsBad = true;

        #ifdef DEBUG
            log_printf
            (
                MsgCat::ERR,
                "FTP : W25Q : Memory is bad. Line %d.\n", __LINE__
            );
        #endif

        return( 0 );
    }

    *( volatile uint8 *)&( spi -> DR) = _aByte;

    guard = W25Q_GUARD;

    while( ( !( spi -> SR & SPI_SR_RXNE ) ) && ( guard > 0 ) )
    {
        guard--;
    }

    if( guard <= 0 )
    {
        theMemoryIsBad = true;

        #ifdef DEBUG
            log_printf
            (
                MsgCat::ERR,
                "FTP : W25Q : Memory is bad. Line %d.\n", __LINE__
            );
        #endif

        return( 0 );
    }

    tmp8 = *( volatile uint8*)&( spi -> DR );

    return( tmp8 );
}

////////////////////////////////////////////////////////////////////////////////

uint8
W25Q::SPI_readByte( void )
{
    if( theMemoryIsBad == true )
    {
        return( 0 );
    }

    return( SPI_exchange( 0 ) );
}

////////////////////////////////////////////////////////////////////////////////

uint16
W25Q::SPI_readBytes( uint8* _buff, uint16 _n )
{
    if( theMemoryIsBad == true )
    {
        return( 0 );
    }

    if( ( _buff == 0 ) || ( _n == 0 ) )
    {
        return( 0 );
    }

    uint16
        i = _n;

    while( i )
    {
        *_buff = SPI_readByte();
        _buff++;
        i--;

        if( isFault() )
        {
            return( 0 );
        }
    }

    return( _n );
}

////////////////////////////////////////////////////////////////////////////////

void
W25Q::SPI_writeByte( uint8 _aByte )
{
    if( theMemoryIsBad == true )
    {
        return;
    }

    SPI_exchange( _aByte );
}

////////////////////////////////////////////////////////////////////////////////

uint16
W25Q::SPI_writeBytes( uint8* _buff, uint16 _n )
{
    if( theMemoryIsBad == true )
    {
        return( 0 );
    }

    if( ( _buff == 0 ) || ( _n == 0 ) )
    {
        return( 0 );
    }

    uint16
        i = _n;

    while( i )
    {
         SPI_writeByte( *_buff );
        _buff++;
        i--;

        if( isFault() )
        {
            return( 0 );
        }
    }

    return( _n );
}

////////////////////////////////////////////////////////////////////////////////

bool
W25Q::isFault( void )
{
    return( theMemoryIsBad );
}

////////////////////////////////////////////////////////////////////////////////
На всякий случай настройка SPI под эту микруху.
Спойлер

Код: Выделить всё

...
    spi -> CR1 =
        ( 0  << SPI_CR1_BIDIMODE_Pos )  | // 15
        ( 0  << SPI_CR1_BIDIOE_Pos )    | // 14
        ( 0  << SPI_CR1_CRCEN_Pos )     | // 13
        ( 0  << SPI_CR1_CRCNEXT_Pos )   | // 12
        ( 0  << SPI_CR1_DFF_Pos )       | // 11
        ( 0  << SPI_CR1_RXONLY_Pos )    | // 10 Fullduplex
        ( 1  << SPI_CR1_SSM_Pos )       | //  9  Software slave management disabled
        ( 1  << SPI_CR1_SSI_Pos )       | //  8
        ( 0  << SPI_CR1_LSBFIRST_Pos )  | //  7 MSB передается первым
        ( 0  << SPI_CR1_SPE_Pos )       | //  6 Пока _не_ включаем SPI!
        ( br << SPI_CR1_BR_Pos )        | //  5..3 делитель шины для тактирования SPI;
        ( 1  << SPI_CR1_MSTR_Pos )      | //  2 Master
        ( 0  << SPI_CR1_CPOL_Pos )      | //  1 полярность тактового сигнала
        ( 0  << SPI_CR1_CPHA_Pos );       //  0 Фаза тактового сигнала

    spi -> CR2 = \
        ( 0 << SPI_CR2_TXEIE_Pos )      | // Tx buffer empty interrupt enable
        ( 0 << SPI_CR2_RXNEIE_Pos )     | // RX buffer not empty interrupt enable

        // This bit controls the generation of an interrupt when an error
        // condition occurs )(CRCERR, OVR, MODF in SPI mode, FRE in TI mode and
        // UDR, OVR, and FRE in I2S mode).
        ( 0 << SPI_CR2_ERRIE_Pos )      |
        ( 0 << SPI_CR2_FRF_Pos )        | // 0/1 - Motorola/TO mode
        ( 0 << SPI_CR2_SSOE_Pos )       | // SS output enable
        ( 0 << SPI_CR2_TXDMAEN_Pos )    | // Tx buffer DMA enable
        ( 0 << SPI_CR2_RXDMAEN_Pos );     // Rx buffer DMA enable

        spi -> CR1 |= ( 1  << SPI_CR1_SPE_Pos );
...
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 153
Зарегистрирован: Чт дек 05, 2019 16:28:11
Откуда: Самара

Сообщение TEPEM »

Не, она у меня на борту и отлично работает уже второй год. Я радиомодуль прикручиваю. И вот осцилограмма странная
Встал на лапы
Сообщения: 82
Зарегистрирован: Вт фев 15, 2022 21:28:35

Сообщение danone78 »

_
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Стандартный путь пойти на сайт производителя и посмотреть схему чем не устраивает?

Обычные линейные стабилизаторы это. А в каком месте маркировка не английском там? :)
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 153
Зарегистрирован: Чт дек 05, 2019 16:28:11
Откуда: Самара

Сообщение TEPEM »

Владислав! Вся надежда на Вас как обычно) И снова здравствуйте)
TIM2_CH2 дает шим на hcpl3120 та на транзистор и тот на двигатель.
Вот такой код

Код: Выделить всё

 GPIOB->MODER |=  GPIO_MODER_MODER3_1;      
       GPIOB->PUPDR |=   GPIO_PUPDR_PUPD3_1;
       GPIOB->AFR[0] |= 0x00001000;//PB3 AF1 - TIM2_CH2  
        
        TIM2->CR1       |= TIM_CR1_ARPE; // buffer the ARR register (not esp useful in this example)                
        TIM2->PSC       = 96000000/1000000-1; // scale to 1us
        const int freq  = 800; // Hz
        TIM2->ARR       = 1000000/freq; // convert freq to counts. Auto Reload Register
        TIM2->CCR2      = TIM2->ARR/10; // Duty cycle 50% on Compare/Capture Register 2
        TIM2->CCMR1     |= TIM_CCMR1_OC2PE // Enable preload for channel 2
                        | (0b110 << TIM_CCMR1_OC2M_Pos); // PWM mode 1                   
        TIM2->CCER      |= TIM_CCER_CC2E; // Enable Capture Compare for channel 2
        TIM2->EGR       |= TIM_EGR_UG;
Кнопочка там делает TIM2->CR1 |= TIM_CR1_CEN; и все работает.
Но есть одно огромное НО. Запуск при подаче питания на плату, с порта вылетает +3в. ИБП не расчитан на прямое включение, оффает сразу от такого подката. Да и фиг бы с ним. Но и движку крутится не надо без кнопки. Ни какие танцы с бубном вокруг подтяжки порта не чего не дают. Более того только выключение 2го канала таймера избавляет от этого плевка в начале, но стоит его включиить и шим начинается с этого плевка. Я уже хз что делать хоть дополнительный ключ ставить в схему управления драйвером. Выручайте пж
Ответить

Вернуться в «ARM»