Перейти к содержанию
    

Доброго дня, есть проект, код на хале отлажен и работает и на gd32f103c8t6 и на stm32f103c8t6, таймеры, шимы, клоки, из используемого. 

Будлоадер взят из https://github.com/Serasidis/STM32_HID_Bootloader и допилен под себя. 
Но на GD завести его я не могу, хоть убей, неизвестное устройство.

В заголовок CMSIS добавил адрес регистра предделителя юсб на ГД и сбросил его
 #define  RCC_CFGR_USBPRE                    ((uint32_t)0x00400000)        /*!< USB Device prescaler */
 #define  RCC_CFGR_USBPREGD                  ((uint32_t)0x00800000)        /*!< USB Device prescaler(23 bit) */

Сравнил регистры по USB прерываниям и прочему- вроде все совпадает. Проверку флеша выкинул вообще, так что остался только функционал подключения к юсб- и толку ноль. НА СТМ работает, на ГД- нет. Код инита клоков предоставляю вам: 
 

Спойлер

 

static void set_sysclock_to_72_mhz(void)
{
    SET_BIT(RCC->CR, RCC_CR_HSEON);
    while (READ_BIT(RCC->CR, RCC_CR_HSERDY) == 0) { ;}


uint32_t *FMC_WSEN;
FMC_WSEN = (uint32_t*)0x400220FC;
FLASH->KEYR = FLASH_KEY1;
FLASH->KEYR = FLASH_KEY2;
*FMC_WSEN = (uint32_t)1;
    /* Enable Prefetch Buffer & set Flash access to 2 wait states */
    SET_BIT(FLASH->ACR, FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY_2);
FLASH->CR |= FLASH_CR_LOCK;

    /* SYSCLK = PCLK2 = HCLK */
    /* PCLK1 = HCLK / 2 */
    /* PLLCLK = HSE /2(PLLXTPRE) * 9 = 72 MHz */
    SET_BIT(RCC->CFGR,
        RCC_CFGR_HPRE_DIV1 | RCC_CFGR_PPRE2_DIV1 | RCC_CFGR_PPRE1_DIV2 |
        RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9 | RCC_CFGR_PLLXTPRE);

/*сброс битов предделителя юсб в 00, что соответствует 1.5 */
    CLEAR_BIT(RCC->CFGR, RCC_CFGR_USBPRE | RCC_CFGR_USBPREGD);
    /* Enable PLL */
    SET_BIT(RCC->CR, RCC_CR_PLLON);

    /* Wait until PLL is ready */
    while (READ_BIT(RCC->CR, RCC_CR_PLLRDY) == 0) {
        ;
    }

    /* Select PLL as system clock source */
    SET_BIT(RCC->CFGR, RCC_CFGR_SW_PLL);

    /* Wait until PLL is used as system clock source */
    while (READ_BIT(RCC->CFGR, RCC_CFGR_SWS_1) == 0) {
        ;
    }
}

 

Используется кварц 16мгц, поэтому PLLXTPRE активен. И вопрос по флешу, для GD32f103c8t6 ставить 0-wait?
Господа, надеюсь на ваши подсказки, свою голову я уже сломал)
(куплены в промэлектронике как потенциальная замена, вроде не подделка на клона)

Изменено пользователем dikabraz

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

55 minutes ago, dikabraz said:

Господа, надеюсь на ваши подсказки, свою голову я уже сломал)

Добрый день! Я, конечно, не в курсе в деталях Вашего проекта, но обычно меня смущает вот это:

56 minutes ago, dikabraz said:

код на хале отлажен и работает и на gd32f103c8t6 и на stm32f103c8t6

GD - это не клоны STM32. Я предлагаю работать с ними как с совершенно новыми/отличными от STM32 микроконтроллерами.

P.S. Вот вчера как раз закончил загрузчик для GD32F450ZKT6. Смотрел только в доку на этот микроконтроллер и примеры для него. Тут можете найти мою тему про "косяк с нумерацией секторов в памяти Flash", как пример того, что необходимо работать с документацией на целевой микроконтроллер. Нет смысла надеяться тащить проекты "один в один" с одного на другой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, haker_fox сказал:

GD - это не клоны STM32. Я предлагаю работать с ними как с совершенно новыми/отличными от STM32 микроконтроллерами.

Безусловно. Критичные струкруры я сравнил и пока все работает согласно задумке, в самом ядре проекта. два мануала курились параллельно)
 

1 час назад, haker_fox сказал:

P.S. Вот вчера как раз закончил загрузчик для GD32F450ZKT6. Смотрел только в доку на этот микроконтроллер и примеры для него. Тут можете найти мою тему про "косяк с нумерацией секторов в памяти Flash", как пример того, что необходимо работать с документацией на целевой микроконтроллер. Нет смысла надеяться тащить проекты "один в один" с одного на другой.

Хм, тогда вопрос: тот же самый ST-link, и на Geephey и на ГД и на СТМ одна прошивка. И, как я подозреваю, одинаковый DFU-лоадер(а в моем случае HID). И юсб работает. 
Искренне заявляю, в USB-стек я ни в зуб ногой, поэтому прошу пинка в сторону различий, ибо другим вариантом я вижу только полное переписывание стека на cmsis от GD, что займет много времени монотонной работы. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, dikabraz said:

поэтому прошу пинка в сторону различий

Я не искал различия) Просто взял USB Device MSC из примеров и адаптировл под свои нужды.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 минуты назад, haker_fox сказал:

Я не искал различия) Просто взял USB Device MSC из примеров и адаптировл под свои нужды.

Не хотел плодить лишних сущностей и обойтись дефайном в крайнем случае) ну ладно, что уж, будем писать)

(Хмм, для начала можно попробовать отрубить оптимизацию)

Изменено пользователем dikabraz

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, dikabraz сказал:

Критичные струкруры я сравнил и пока все работает согласно задумке

Даже идентичность регистров периферии ничего не гарантирует. Если в ПО есть баг, который например пишет что-то в reserved-поля или читает из них (не маскируя), то это может приводить к глюкам на одном и нормальной (вроде как) работе на другом.

Всякие нагугленные в инете примеры кода барахло как правило содержит в себе "перлы", типа операций чтения-модификации-записи write-only IO-регистров или IO-регистров, имеющих разную функциональность по записи и по чтению. И если на STM например такой write-only регистр на чтение возвращал 0, а на GD - нечто отличное от 0, то тут пользователь этого кода и получит граблями по лбу при переезде на GD.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 часов назад, jcxz сказал:

Даже идентичность регистров периферии ничего не гарантирует. Если в ПО есть баг, который например пишет что-то в reserved-поля или читает из них (не маскируя), то это может приводить к глюкам на одном и нормальной (вроде как) работе на другом.

Всякие нагугленные в инете примеры кода барахло как правило содержит в себе "перлы", типа операций чтения-модификации-записи write-only IO-регистров или IO-регистров, имеющих разную функциональность по записи и по чтению. И если на STM например такой write-only регистр на чтение возвращал 0, а на GD - нечто отличное от 0, то тут пользователь этого кода и получит граблями по лбу при переезде на GD.

Кхм, примерно поэтому я люблю hal, как неплохой уровень абстракции бизнес-логики. Он не даёт мне выстрелить себе в ногу, ошибись я в сдвиговой операции, я, в свою очередь, не ограничен халом и в  том же обработчике прерывания могу хоть напрямую в адрес по указателю писать. 

П.с. у меня стоит на плате тайпси, резисторы по 10ом, д+ постоянно подтянут 1.5к к 3.3в.

П.с.2 я просто люблю cubeide, там все удобно для ленивого меня)

Изменено пользователем dikabraz

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 4/14/2023 at 10:38 AM, dikabraz said:
*FMC_WSEN = (uint32_t)1

Как вы вот это делаете? Никак не пишется у меня этот бит. В дебаггере этот бит всегда 0, и если считывать значение этого регистра в любом месте кода, тоже всегда 0. В своём проекте повторяю ваш код, но бит не пишется. Пробовал ставить задержки во все места - не помогло.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Цитата

This bit is set and reset by software. This bit also protected by the FMC_KEYx register. It is necessary to writing 0x45670123 and 0xCDEF89AB to the FMC_KEYx register

А не просто записать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Arlleex said:

А не просто записать.

Я в курсе:

//---Variables---//
uint32_t temp = 0;
  
uint32_t *FMC_WSEN_ADDR = (uint32_t*)0x400220FC;
//---------------//

//fmc_unlock();

FMC_KEY0 = UNLOCK_KEY0;
FMC_KEY0 = UNLOCK_KEY1;
FMC_KEY1 = UNLOCK_KEY0;
FMC_KEY1 = UNLOCK_KEY1;

*FMC_WSEN_ADDR = (uint32_t)1; // ПИШЕМ 1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

temp = RCU_ClockFreq_Get(CK_SYS);

if(temp <= 24000000)
  FMC_WS = WS_WSCNT_0; // Wait state counter: 0 wait state added.
else if ( (temp > 24000000) && (temp <= 48000000))
  FMC_WS = WS_WSCNT_1; // Wait state counter: 1 wait state added.
else // if temp > 48000000
  FMC_WS = WS_WSCNT_2; // Wait state counter: 2 wait state added.

fmc_lock();

temp = FMC_WSEN; // ТУТ ВСЕГДА 0, ХОТЯ ДОЛЖНО БЫТЬ 1!!!!!!!!!!!!!!!!!!!!!!!!!

Но всё равно не пишется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 4/14/2023 at 11:36 AM, haker_fox said:

Добрый день! Я, конечно, не в курсе в деталях Вашего проекта, но обычно меня смущает вот это:

GD - это не клоны STM32. Я предлагаю работать с ними как с совершенно новыми/отличными от STM32 микроконтроллерами.

P.S. Вот вчера как раз закончил загрузчик для GD32F450ZKT6. Смотрел только в доку на этот микроконтроллер и примеры для него. Тут можете найти мою тему про "косяк с нумерацией секторов в памяти Flash", как пример того, что необходимо работать с документацией на целевой микроконтроллер. Нет смысла надеяться тащить проекты "один в один" с одного на другой.

 

еще раз повторюсь, в плане нумерации секторов гд ничем от стма не отличается и гд клон стма на 99%, в случае с ф4

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 hours ago, 0men said:

еще раз повторюсь, в плане нумерации секторов гд ничем от стма не отличается и гд клон стма на 99%, в случае с ф4

А какой смысл отвечать на сообщение полугодичной давности? Я для себя вывод сделал и вывод - однозначный: читать документацию как на иной микроконтроллер, ну может быть очень редко подглядывать в документацию на STM32 в надежде прояснить какие-то уж совсем тёмные моменты в аналогии, если таковая есть. Вот только практика обращений показывает, что люди нередко попадают в этот 1% заблуждений. А по сути - не читают документацию вообще, рассчитывая на то, что GD32 - это клон STM32. Даже bin-файл заливают тот же самый. И в целом: работает, да и ладно.

 

P.S. Раз уж заговорили об этих GD32 снова, то хочу сказать, что за год работы пришёл к выводу, что не смотря на скудную документацию (если сравнивать с эталонами документописания от ST или NXP), эти микроконтроллеры вполне пригодны для полноценной работы. Но пока ни одного ещё прибора мы не выпустили, т.к. эти микроконтроллеры применили для свежих своих разработок. Поэтому сказать что-либо о полноценном их использовании в различных условиях климата, помех и т.д. и т.п. я не могу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/25/2023 at 1:17 PM, LAS9891 said:

Но всё равно не пишется

А зачем его устанавливать? Я нигде в примерах от GD не видел использование этого бита.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, vit496 said:

А зачем его устанавливать? Я нигде в примерах от GD не видел использование этого бита.

И я нигде не видел официального примера или описания настройки регистра FMC_WS. Только эту статью. А вот тут говорят вообще не надо ничего настраивать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 minutes ago, LAS9891 said:

И я нигде не видел официального примера или описания настройки регистра FMC_WS. Только эту статью. А вот тут говорят вообще не надо ничего настраивать.

Я видел статью, пробовал менять, но никаких изменений, как у автора, не заметил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...