реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Как я накололся с stm32f10x.h, врагу не пожелаю
ViKo
сообщение Feb 9 2014, 09:29
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



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, но боюсь запутаться между проектами.
Go to the top of the page
 
+Quote Post
SII
сообщение Feb 9 2014, 11:21
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414



Так здесь же уже не отдельные биты, а целое битовое поле (из двух битов). Маска поля -- FLASH_ACR_LATENCY, а остальные три константы -- это его возможные значения для разных случаев жизни (латентностей). ИМХО, тут Вы зря ожидали каких-то "битов", поскольку их тут быть и не должно. Для интереса посмотрите какие-нибудь другие константы, касающиеся полей, а не отдельных битов.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 9 2014, 11:43
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



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

Найдите подобное еще где-либо в stm32f10x.h.
Именно потому, что в большинстве случаев xxx_0, xxx_1 и т.д. описывает биты, так и воспринял эти константы, уже автоматически.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 9 2014, 12:28
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Пишу так:
Код
2 * (FLASH_ACR_LATENCY & ~FLASH_ACR_LATENCY)



--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 9 2014, 12:47
Сообщение #5


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Сергей Борщ @ Feb 9 2014, 15:28) *
Пишу так:
Код
2 * (FLASH_ACR_LATENCY & ~FLASH_ACR_LATENCY)

Видимо, все же не так. rolleyes.gif Сколько на ноль ни умножай...
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Feb 9 2014, 14:13
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



А зачем все это?
Я сразу беру main() и поехал.
Вроде ж все по дефоулту уже придумано


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 9 2014, 14:57
Сообщение #7


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(A. Fig Lee @ Feb 9 2014, 17:13) *
А зачем все это?
Я сразу беру main() и поехал.
Вроде ж все по дефоулту уже придумано

В библиотеку не хожу. Не хочу пользоваться. У меня - просто, понятно...
Еще прикол - биты USB_CNTR_FRES и т.д. - описаны, а самой структуры USB в stm32f10x.h - нет! w00t.gif
Go to the top of the page
 
+Quote Post
mantech
сообщение Feb 9 2014, 16:09
Сообщение #8


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(ViKo @ Feb 9 2014, 18:57) *
В библиотеку не хожу. Не хочу пользоваться. У меня - просто, понятно...


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

Я понимаю еще либы по USB - там пожалуй реально лучше с нуля писать...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 9 2014, 17:59
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(ViKo @ Feb 9 2014, 14:47) *
Видимо, все же не так. rolleyes.gif Сколько на ноль ни умножай...
Да, действительно. Опечатался.
Код
2 * (FLASH_ACR_LATENCY & -FLASH_ACR_LATENCY)



--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 9 2014, 19:15
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(mantech @ Feb 9 2014, 19:09) *
А что так сразу? Если инициализация в библиотеке есть и она корректно работает, зачем изобретать велосипед?
Потому что инициализацию и самому несложно написать.

Цитата(mantech @ Feb 9 2014, 19:09) *
Я понимаю еще либы по USB - там пожалуй реально лучше с нуля писать...
Странная логика - всё с ног на голову. Если USB-библиотека работает, то зачем с нуля писать? Разве что подредактировать немного под нужлы проекта самую малость.


Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 10 2014, 09:52
Сообщение #11


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Еще хотите ужасов? - В stm32f10x.h напрочь отсутствуют биты DAC_CR_DMAUDRIE2, DAC_CR_DMAUDRIE1.
Интересно, кто занимается коррекцией этих заголовков?
Go to the top of the page
 
+Quote Post
mantech
сообщение Feb 10 2014, 12:43
Сообщение #12


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(_Артём_ @ Feb 9 2014, 23:15) *
Если USB-библиотека работает, то зачем с нуля писать?


В том-то и дело - не со всеми флешками работает - попробуй разберись, почему? laughing.gif
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 10 2014, 12:49
Сообщение #13


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Плетясь в хвосте у библиописателей, всегда ограничиваешься эффективностью этих библиописателей. Там, что, мастера высшего пилотажа работают? Похоже, нет.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 12 2014, 10:03
Сообщение #14


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Мелкий аргумент. 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);
    {
    }
Go to the top of the page
 
+Quote Post
mantech
сообщение Feb 12 2014, 11:16
Сообщение #15


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(ViKo @ Feb 12 2014, 14:03) *
Мелкий аргумент. 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.gif
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th August 2025 - 22:24
Рейтинг@Mail.ru


Страница сгенерированна за 0.01513 секунд с 7
ELECTRONIX ©2004-2016