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

Как я накололся с stm32f10x.h

Cоздаю свои SystemInit функции (как и все остальные, по мере понимания). Очередная - не работает! Процессор вылетает неизвестно куда, в фаулты, даже до обработчика HardFault не добирается! В Кейле, в отладчике, на реальной плате вижу.

Хотя предыдущая функция (в том же файле была, повезло) - работает. Ищу отличия - не нахожу! Смотрю в отладчике - все биты RCC одинаковые.

Там с десяток выражений, что только не сравниваю, заменяю, комментирую - везде одинаково. Добрался до латентности. В нерабочей:

/* Задать использовать буфер предвыборки Flash, 2 цикла ожидания */
    FLASH->ACR = 
    FLASH_ACR_LATENCY_0 * 2 |  // LATENCY[2:0] bits (Latency)
    FLASH_ACR_HLFCYA    * 0 |      // Flash Half Cycle Access Enable
    FLASH_ACR_PRFTBE    * 1;      // Prefetch Buffer Enable

В рабочей:

/* Задать использовать буфер предвыборки Flash и 2 цикла ожидания
   (half cycle access can only be used with a low-frequency clock of less than 8 MHz 
   that can be obtained with the use of HSI or HSE but not of PLL) */
  FLASH->ACR = FLASH_ACR_PRFTBE
             | FLASH_ACR_LATENCY_1;    // 2 WS

Смотрю в stm32f10x.h. А там биты заданы так:

#define  FLASH_ACR_LATENCY                   ((uint8_t)0x03)               /*!< LATENCY[2:0] bits (Latency) */
#define  FLASH_ACR_LATENCY_0                 ((uint8_t)0x00)               /*!< Bit 0 */
#define  FLASH_ACR_LATENCY_1                 ((uint8_t)0x01)               /*!< Bit 0 */
#define  FLASH_ACR_LATENCY_2                 ((uint8_t)0x02)

То есть, не так, как везде, описываются именно биты, как, например:

#define  RCC_CFGR_PLLMULL_0                  ((uint32_t)0x00040000)

а состояния латентности.

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

    FLASH->ACR = 
    FLASH_ACR_LATENCY_2 |    // LATENCY[2:0] bits (Latency)
    FLASH_ACR_HLFCYA    * 0 |    // Flash Half Cycle Access Enable
    FLASH_ACR_PRFTBE    * 1;    // Prefetch Buffer Enable

все заработало.

Что интересно, и вторая функция была с неправильной установкой латентности = 1, но, тем не менее каким-то чудом работала. На 72 MHz, STM32F103.

Уже чешутся руки взяться за правку stm32f10x.h, но боюсь запутаться между проектами.

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


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

Так здесь же уже не отдельные биты, а целое битовое поле (из двух битов). Маска поля -- FLASH_ACR_LATENCY, а остальные три константы -- это его возможные значения для разных случаев жизни (латентностей). ИМХО, тут Вы зря ожидали каких-то "битов", поскольку их тут быть и не должно. Для интереса посмотрите какие-нибудь другие константы, касающиеся полей, а не отдельных битов.

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


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

Так здесь же уже не отдельные биты, а целое битовое поле (из двух битов). Маска поля -- FLASH_ACR_LATENCY, а остальные три константы -- это его возможные значения для разных случаев жизни (латентностей). ИМХО, тут Вы зря ожидали каких-то "битов", поскольку их тут быть и не должно. Для интереса посмотрите какие-нибудь другие константы, касающиеся полей, а не отдельных битов.

Найдите подобное еще где-либо в stm32f10x.h.

Именно потому, что в большинстве случаев xxx_0, xxx_1 и т.д. описывает биты, так и воспринял эти константы, уже автоматически.

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


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

Пишу так:

2 * (FLASH_ACR_LATENCY & ~FLASH_ACR_LATENCY)

Видимо, все же не так. :rolleyes: Сколько на ноль ни умножай...

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


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

А зачем все это?

Я сразу беру main() и поехал.

Вроде ж все по дефоулту уже придумано

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


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

А зачем все это?

Я сразу беру main() и поехал.

Вроде ж все по дефоулту уже придумано

В библиотеку не хожу. Не хочу пользоваться. У меня - просто, понятно...

Еще прикол - биты USB_CNTR_FRES и т.д. - описаны, а самой структуры USB в stm32f10x.h - нет! :w00t:

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


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

В библиотеку не хожу. Не хочу пользоваться. У меня - просто, понятно...

 

А что так сразу? Если инициализация в библиотеке есть и она корректно работает, зачем изобретать велосипед?

 

Я понимаю еще либы по USB - там пожалуй реально лучше с нуля писать...

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


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

Видимо, все же не так. :rolleyes: Сколько на ноль ни умножай...
Да, действительно. Опечатался.

2 * (FLASH_ACR_LATENCY & -FLASH_ACR_LATENCY)

 

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


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

А что так сразу? Если инициализация в библиотеке есть и она корректно работает, зачем изобретать велосипед?
Потому что инициализацию и самому несложно написать.

 

Я понимаю еще либы по USB - там пожалуй реально лучше с нуля писать...
Странная логика - всё с ног на голову. Если USB-библиотека работает, то зачем с нуля писать? Разве что подредактировать немного под нужлы проекта самую малость.

 

 

 

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


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

Еще хотите ужасов? - В stm32f10x.h напрочь отсутствуют биты DAC_CR_DMAUDRIE2, DAC_CR_DMAUDRIE1.

Интересно, кто занимается коррекцией этих заголовков?

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


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

Если USB-библиотека работает, то зачем с нуля писать?

 

В том-то и дело - не со всеми флешками работает - попробуй разберись, почему? :laughing:

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


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

Плетясь в хвосте у библиописателей, всегда ограничиваешься эффективностью этих библиописателей. Там, что, мастера высшего пилотажа работают? Похоже, нет.

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


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

Мелкий аргумент. CppCheck только что выдала замечание о библиотечной system32f2xx.c:

Кратко: Suspicious use of ; at the end of 'while' statement.

Сообщение: Suspicious use of ; at the end of 'while' statement.

Гляжу, вижу:

    /* Wait till the main PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);
    {
    }

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


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

Мелкий аргумент. CppCheck только что выдала замечание о библиотечной system32f2xx.c:

Кратко: Suspicious use of ; at the end of 'while' statement.

Сообщение: Suspicious use of ; at the end of 'while' statement.

Гляжу, вижу:

    /* Wait till the main PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);
    {
    }

 

Видать "Всемогущие гуру" хотели еще что-нить в скобочках...вписать :biggrin:

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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