Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32H743 SPI
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2
MasterElectric
ну скорее всего ошибка в коде и он уходит в стоп режим. Я бы пока малоизучена система тактирования не разгонял бы его. Я имел в виду стабилизатор что в чипе, но раз признаки жизни подает значит живой.
hd44780
Осциллом 3.3 платы посмотрел - чисто. Может иголки какие, хз, моим хилым UT-81B их фиг найдёшь.
hd44780
Вот так нормально работает опросом:

Код
// Чтение/запись байта SPI
uint8_t spi1_sendByte ( uint8_t data_out )
{
    uint8_t data_in = 0;

    // старт передаем неопределенное кол-во байт
    // Disable SPI
    SPI_PORT->CR1 &= ~SPI_CR1_SPE;
    SPI_PORT->CR2 = 0;
    // Enable SPI
    SPI_PORT->CR1 |= SPI_CR1_SPE;
    SPI_PORT->CR1 |= SPI_CR1_CSTART;

    while (!(SPI_PORT->SR & SPI_SR_TXP));
    *((__IO uint8_t *)&SPI_PORT->TXDR) = data_out;

    // Ждать завершения приёма
    while(!(SPI_PORT->SR & SPI_SR_RXP));
    data_in = *(volatile uint8_t *) &(SPI_PORT->RXDR);
    return data_in;
} // SPI_sendByte


Попробую ещё перенести это на другой SPI.
hd44780
Датчик успешно переехал на SPI3 sm.gif .
hd44780
Небольшой оффтоп в теме про SPI:

Покопался ещё на предмет флэша.
Пустышка вида

CODE
char sBuffer[256];

int main(void)
{
float temp = 656.89F;
int i = 78;

sprintf ( sBuffer, "%d; %.02fv", i, temp );
while ( 1 )
{
} // while
} // main


При использовании newlib standard даёт размер кода:

Код
Print size information
   text      data       bss       dec       hex   filename
  17644      1660     10772     30076      757c   STM32H7_ILI9163.elf


Ошибка записи во флэш есть.
Если эту же программу перекомпилить с newlib nano, то получаю:
Код
Print size information
   text      data       bss       dec       hex   filename
   5180       112     10720     16012      3e8c   STM32H7_ILI9163.elf


Ошибки флэша нет, всё гуд. Но в sBuffer я вижу: "78; v", т.е. видно, что sprintf не поддерживает плавающую точку, что меня лично меня категорически не устраивает.

Чтобы отсечь вопрос о "битости" некоторых участков флэша проца приведу следующий пример:
Прошивка размером

Код
Print size information
   text      data       bss       dec       hex   filename
  18480        36     10876     29392      72d0   STM32H7_ILI9163.elf



без sprintf шьётся, отлаживается и работает совершенно нормально.

Стек в обоих случаях одинаковый:

Код
/* 0x2800 == 10K */
_Min_Stack_Size = 0x2800;




Какие соображения, товарищи? И чем можно заменить sprintf? Я нашёл только это - https://github.com/torvalds/linux/blob/master/lib/vsprintf.c , но пока не пытался затащить её в проц.
Увеличение размера прошивки меня совершенно не волнует. Кто-то делал что-либо подобное?

Штуки типа itoa, ltoa я знаю, они нормально работают, но результирующие строки надо дополнительно склеивать, но самое главное, чего-то родственного для плавающей точки я не знаю.
Писать самому?

Что касается периферии - запустил UART - отправка опросом, приём прерыванием в буфер. Перешёл к USB.
hd44780
Всё-таки это косяки в либах атоллика (я про sprintf).

Та же самая пустышка в STM32 SystemWorkbench завелась с полпинка.
Правда пришлось разобраться, как включить в нём поддержку float output в spintf. По умолчанию она отключена, %f полностью игнорится.
nanorobot
Цитата(hd44780 @ Aug 18 2018, 12:00) *
Всё-таки это косяки в либах атоллика (я про sprintf).

Та же самая пустышка в STM32 SystemWorkbench завелась с полпинка.
Правда пришлось разобраться, как включить в нём поддержку float output в spintf. По умолчанию она отключена, %f полностью игнорится.


никогда не использую sprintf() , использую набор минимальных самописных функций, отдельно для числовых данных, отдельно для строк etc...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.