Микроконтроллеры STM32 - тонкости работы, отладочные платы
Я взял рабочий пример и он не работает. Взял несколько разных от всех 1 эффект. Тут что то кардинальное
- Реклама
- Сообщения: 12
- Зарегистрирован: Пт янв 07, 2022 14:15:04
Всем привет ! Проблема такая . Есть отладочная плата stm32mini на борту контроллер stm32f405 , так он определяется ST-link ом . Также есть программа к этому контроллеру . Но после программирования рабочей прошивкой контроллер не работает. Этой же прошивкой прошиваю рабочее устройство на таком же контроллере и все в порядке все работает . Порты которые использует контроллер на отладочной плате все свободны , прошивал как ST-link ом так и через UART все прошивается но не работает . В чем может быть причина куда копать ? Может на этой плате стоит какая нибудь защита ? Прошивка есть но компилированная исходника нет .
- Сообщения: 7121
- Зарегистрирован: Сб янв 28, 2006 22:47:24
В любой непонятной ситуации давите reset.
Астролябия-сама меряет, было бы что мерять!!!
- Сообщения: 12
- Зарегистрирован: Пт янв 07, 2022 14:15:04
Тут как бы , дело не в reset . А в самом stm32f405 mini . Контроллер прошивается но не работает .
- Сообщения: 7121
- Зарегистрирован: Сб янв 28, 2006 22:47:24
Тогда отожмите ресет.
Астролябия-сама меряет, было бы что мерять!!!
- Реклама
- Сообщения: 12
- Зарегистрирован: Пт янв 07, 2022 14:15:04
- Сообщения: 7121
- Зарегистрирован: Сб янв 28, 2006 22:47:24
[uquote="Странник 05",url="/forum/viewtopic.php?p=4440665#p4440665"]Нету тут такого , )))[/uquote]
Это у вас нету, а на рабочей плате, возможно, очень даже есть. А может там еще прерывания откуда-то приходят или уровни какие-то без которых прога в МК не шевелится.
Это у вас нету, а на рабочей плате, возможно, очень даже есть. А может там еще прерывания откуда-то приходят или уровни какие-то без которых прога в МК не шевелится.
Астролябия-сама меряет, было бы что мерять!!!
- Сообщения: 12
- Зарегистрирован: Пт янв 07, 2022 14:15:04
На плате есть все и кнопка reset тоже , кроме двух программаторов . Они идут отдельно SWD UART. Простые програмки тестил тоже . Используемые выводы подключал тоже все работает . Контроллер жив . Куплен на али .
Добавлено after 28 minutes 40 seconds:
Re: Микроконтроллеры STM32 - тонкости работы, отладочные платы
Тут единственный вариант, попробовать на другой макетной плате с stm32f405 возможно будет работать и с f407 но не уверен ... . Но у меня их только две . Одна отладочная другая прототип . На последней все исправно работает на "отладочной " нет . Вот сбственно она https://aliexpress.ru/item/100500399797 ... 1682QvGQkL
Добавлено after 28 minutes 40 seconds:
Re: Микроконтроллеры STM32 - тонкости работы, отладочные платы
Тут единственный вариант, попробовать на другой макетной плате с stm32f405 возможно будет работать и с f407 но не уверен ... . Но у меня их только две . Одна отладочная другая прототип . На последней все исправно работает на "отладочной " нет . Вот сбственно она https://aliexpress.ru/item/100500399797 ... 1682QvGQkL
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
к мысли, озвученной Asmodey, можно проверить все ножки, задействованные в прошивке - хоть на какой, есть ли какая активность: переключилась на выход или включились ли подтягивающий резисторы.
- Сообщения: 1
- Зарегистрирован: Пн дек 04, 2023 11:51:31
Здравствуйте, у меня проблема при попытке загрузить прошивку на отладочную плату STM32F407. Плата имеет все необходимое для работы, включая кнопку сброса, но при подключении программатора и попытке загрузки прошивки программатор не видит контроллер. Я что-то не знаю, что делать?
Здесь увлекательные игры https://altsarepta.ru/
- Сообщения: 550
- Зарегистрирован: Вт фев 09, 2010 17:52:26
Очевидно что не знаете.ПастРом писал(а):Я что-то не знаю, что делать?
Контроллер должен быть виден при подключении программатора, если его не видно то что вы пытаетесь шить?
Здравствуйте ребята!!!! Я очень скучал по вам!)))
Есть три неприятные функции в хале, которые я пытаюсь заменить cmsis. Помогите пожалуйста.
Я их пытаюсь заменить вот так
Ну и собственно -
И чувствую что не прав я в этом к сожалению
Есть три неприятные функции в хале, которые я пытаюсь заменить 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
Правильные сомнения. Чип не указан, есть ли fifo не указано, запись 8/16/32 в DR скорее всего имеет значение. Перед чтением я бы dr и fifo чистил.
Чем hal-овские функции не устраивают? Почему не подсмотреть как там сделано? Что в RM написано про отправку и приём прочитано?
Чем hal-овские функции не устраивают? Почему не подсмотреть как там сделано? Что в RM написано про отправку и приём прочитано?
[img][img]https://e.radikal.host/2024/01/06/PEfVii0hcy4.jpg[/img][/img]Вот у меня NRF24L01 и f411
Что с MOSI такое?
Что с MOSI такое?
- Сообщения: 1379
- Зарегистрирован: Вт ноя 19, 2019 06:10:18
Если я правильно понял, ТС используется SPI для работы с W25Qxxx. Вот простейший вариант реализации доступа к этой микросхеме. Работает на STM32F4.TEPEM писал(а):Есть три неприятные функции в хале, которые я пытаюсь заменить cmsis.
Спойлер
Код: Выделить всё
#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 -> 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 );
...
Не, она у меня на борту и отлично работает уже второй год. Я радиомодуль прикручиваю. И вот осцилограмма странная
- Сообщения: 82
- Зарегистрирован: Вт фев 15, 2022 21:28:35
Владислав! Вся надежда на Вас как обычно) И снова здравствуйте)
TIM2_CH2 дает шим на hcpl3120 та на транзистор и тот на двигатель.
Вот такой код
Кнопочка там делает TIM2->CR1 |= TIM_CR1_CEN; и все работает.
Но есть одно огромное НО. Запуск при подаче питания на плату, с порта вылетает +3в. ИБП не расчитан на прямое включение, оффает сразу от такого подката. Да и фиг бы с ним. Но и движку крутится не надо без кнопки. Ни какие танцы с бубном вокруг подтяжки порта не чего не дают. Более того только выключение 2го канала таймера избавляет от этого плевка в начале, но стоит его включиить и шим начинается с этого плевка. Я уже хз что делать хоть дополнительный ключ ставить в схему управления драйвером. Выручайте пж
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;
Но есть одно огромное НО. Запуск при подаче питания на плату, с порта вылетает +3в. ИБП не расчитан на прямое включение, оффает сразу от такого подката. Да и фиг бы с ним. Но и движку крутится не надо без кнопки. Ни какие танцы с бубном вокруг подтяжки порта не чего не дают. Более того только выключение 2го канала таймера избавляет от этого плевка в начале, но стоит его включиить и шим начинается с этого плевка. Я уже хз что делать хоть дополнительный ключ ставить в схему управления драйвером. Выручайте пж


