Сообщение от pasipaka
|
Кста обьяснение многим своим шишкам потом в отдельных разьяснениях СТМ находил.
Но вот такая (по ИАРу) и сегодня для меня загадка:
А я гадал все, почему от ПЛИС инфа не идет и что не так. Уже и в ПЛИСине копался...
От февраля 2012Ю
От такой вопрос:
довелось мне один проект на 32f105 допиливать. Первоначально в 5ом IARе писался и ф-ция работала.
Дописывал в 6ом IARе.
Убил день и полночи. А заработало (когда перепробовав все что можно) след. строки:
#define FLAG_RESET_Set GPIOB-›BSRR |= GPIO_BSRR_BS9
#define FLAG_RESET_Clr GPIOB-›BRR |= GPIO_BRR_BR9
переписал так:
#define FLAG_RESET_Set GPIOB-›BSRR |= GPIO_BSRR_BS9
#define FLAG_RESET_Clr GPIOB-›BSRR |= GPIO_BSRR_BR9
ПОЧЕМУ так????
Реально что там на ноге было посмотреть нельзя, т.к. физически не подобраться.
Чего с решситром GPIOB-›BRR сотворили такого? Да и зачем он, если все через BSRR сделать можно?
З.Ы.
Эти грабли в многим местах. Программный SPI не работал также, пока BRR на BSRR не сменил.
С тех пор о BRR забыл и юзаю только BSRR. Правильно ли...
|
![Дьявольски зол](images/smilies/icon_twisted.gif)
Просто волосы дыбом встают!!!!!
Уважаемый, вместо того, чтобы пол ночи методом тыка что-то делать, а потом ещё и претензии выкатывать, может, хотябы одним глазком на "RM0008 Reference manual" взглянуть? Люди же писали старались.
Но даже если не смотреть его, ну хоть иногда головы надо включать. Пытаться понять смысл операций. Общие принципы работы с переферией.
=======================
1. Операцией GPIOB-›BRR |= GPIO_BRR_BR9 вы читаете регистр GPIOB-›BRR добавляете туда 1 и записываете назад. Если вы откроете указанный мной мануал, то увидите, что регистр BRR, равно как и BSRR предназначен "только для записи". Что вы оттуда читаете - одному богу известно.
2. То что он для записи -
вытекает из всей логики!!!!!! В этот регистр записывается бит в то место куда нужно установить 1. Зачем его читать!!!!!!!! Такой тупизм, что просто ужас!!! Для чтения предназначен регистр ODR! Именно к нему можно обращаться таким образом, каким обращаетесь вы. И с тем же результатом. Правда в мануале предупреждают о неатомарности данной операции.
Note: For atomic bit set/reset, the ODR bits can be individually set and cleared by writing to the GPIOx_BSRR register (x = A .. G).
И предлагают воспользоваться регистром BSRR (или BRR).
То есть если бы вы поняли замысел разработчиков кристала, то они специально оверегают вас от неатомарной операции |= и вводят 2(!!) новых регистра, чтобы облегчить вам работу.
А нашим разработчикам всё по барабану. Они документов просто не читают.
=========
Подытоживая должно быть так
#define FLAG_RESET_Clr GPIOB-›BRR = GPIO_BRR_BR9
Кстати для stm32f4 макросы должны выглядеть несколько по другому
#define FLAG_RESET_Set GPIOB-›BSRH = GPIO_BSRR_BS9
#define FLAG_RESET_Clr GPIOB-›BSRL = GPIO_BSRR_BS9
ну или по вашему
#define FLAG_RESET_Set GPIOB-›ODR |= GPIO_BSRR_BS9
#define FLAG_RESET_Clr GPIOB-›ODR &= ~GPIO_BSRR_BS9
здесь неатомарность!