Ой, а про них я и не подумал, каюсь. Завтра же проверю, на сколько один от другого отстаёт. Именно разность в Watch поставлю. Просто сами значения в дебагере отстоят друг от друга на достаточно большие значения. Не знаю, стоит ли ему верить.
Где-то здесь уже говорили, что при большой скорости обновления значений в памяти, дебаггер жутко врёт. Лучше снимите пару периодов в память, затем остановите DMA и смотрите через дебаггер снятые значения.
Подскажите, а как можно замутить MAC (Multiply-Accumulate) на той же F4? В CMSIS есть функции вроде arm_mult_f32, но они пробегают по массивам, а не складывают всё в одну переменную. Т.е. есть A[i]=B[i]*C[i], а надо A+=B[i]*C[i]. Куда копать?
UPD: в кортексе M4 как таковом есть инструкции UMLAL, SMLAL, как раз для сложения с накоплением. Как бы заставить кейл их использовать? Или проще писать ассемблерную вставку?
UPD2: вроде разобрался. Нужно просто типы данных подобрать, компилятор додумается использовать одну инструкцию.
Приобрел плату STM32 VL. Начал разбираться: помигал светодиодами, поопрашивал кнопки, запустил дисплей от NOKIA3310. В общем наигравшись решил перейти к более углубленному изучению. Первой строчкой попавшей в поле зрения оказалась
Код:
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
После изучения различных примеров и описаний было установлено назначение данной строки, НО в этих самых предметах ни слова не было сказано почему надо тактировать выходы именно от APB2ENR. Дальнейшие поиски тоже ни к чему не привели. Вот мне и хотелось бы узнать назначение всех регистров RCC, а их там целых 10 штук:
#if defined (STM32F10X_HD) || defined (STM32F10X_XL) #define RCC_APB2ENR_IOPFEN ((uint32_t)0x00000080) /*!< I/O port F clock enable */ #define RCC_APB2ENR_IOPGEN ((uint32_t)0x00000100) /*!< I/O port G clock enable */ #define RCC_APB2ENR_TIM8EN ((uint32_t)0x00002000) /*!< TIM8 Timer clock enable */ #define RCC_APB2ENR_ADC3EN ((uint32_t)0x00008000) /*!< DMA1 clock enable */ #endif
#if defined (STM32F10X_HD_VL) #define RCC_APB2ENR_IOPFEN ((uint32_t)0x00000080) /*!< I/O port F clock enable */ #define RCC_APB2ENR_IOPGEN ((uint32_t)0x00000100) /*!< I/O port G clock enable */ #endif
Приобрел плату STM32 VL. Начал разбираться: помигал светодиодами, поопрашивал кнопки, запустил дисплей от NOKIA3310. В общем наигравшись решил перейти к более углубленному изучению. Первой строчкой попавшей в поле зрения оказалась
Код:
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
После изучения различных примеров и описаний было установлено назначение данной строки, НО в этих самых предметах ни слова не было сказано почему надо тактировать выходы именно от APB2ENR. Дальнейшие поиски тоже ни к чему не привели. Вот мне и хотелось бы узнать назначение всех регистров RCC, а их там целых 10 штук: ...
В Reference Manual написано какая периферия к какой шине тактирования подключена. Вы посмотрите бегло этот документ и поймете. Регистры RCC преимущественно для настройки частот тактирования разных шин и выбор источника тактирования для МК (внутренний или внешний кварц).
КАШАК писал(а):
почему надо тактировать выходы именно от APB2ENR. ...
Потому что IOPBEN намертво прикреплен к шине APB2, и тактировать его можно только от нее. Вы не сможете затактировать этот модуль от другой шины, короче.
Сравнить название обработчика с тем что прописано в стартапе. У меня бывало тоже не работали примеры скопипастенные с разных мест из за различий в названиях функций.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения