|
|
  |
как лучше дописать макрос Аскольда для STM32?, застрял на cpl(); |
|
|
|
Jan 1 2013, 10:28
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
В общем, пока вот что получилось Код #elif defined(STM32L152xx) #define _setL(port,bit) do { port -> BSRRH |= bit; } while(0) // возможно, | лишний символ #define _setH(port,bit) do { port -> BSRRL |= bit; } while(0) #define _clrL(port,bit) do { port -> BSRRL |= bit; } while(0) #define _clrH(port,bit) do { port -> BSRRH |= bit; } while(0) #define _cpl(port,bit,val) do { вот с cpl не знаю. У нас по очереди нужно записывать бит в регистр port -> BSRRH |= bit потом в port -> BSRRL |= bit никакого XOR, как с АВР. по идее, нужно делать проверку if () бита в порте GPIOx_IDR но что-то не хочет компилиться.
|
|
|
|
|
Jan 1 2013, 11:27
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 23-02-09
Из: Одесская обл.
Пользователь №: 45 249

|
Цитата(Метценгерштейн @ Jan 1 2013, 12:28)  вот с cpl не знаю. У нас по очереди нужно записывать бит в регистр port -> BSRRH |= bit потом в port -> BSRRL |= bit
никакого XOR, как с АВР. по идее, нужно делать проверку if () бита в порте GPIOx_IDR
но что-то не хочет компилиться. Я не совсем понял, какая связь между XOR и последовательностью записи в регистры. XOR для STM32F10x я делал так: Код // Инверсия пина #define _inverse_pin_(port,pin) (GPIO##port##->ODR = GPIO##port##->ODR^(1UL<<pin))
|
|
|
|
|
Jan 1 2013, 11:51
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
в макросе Аскольда cpl делается Код do {port ^= (1 << bit); } while(0) т.е. посредством XOR Наверное, не поняли задачу- при включении в коде записи cpl(LED); каждый раз, когда код проходит эту строчку, LED то включается, то выключается. Цитата(toweroff @ Jan 1 2013, 14:46)  обернуть в {} вместе с ; (хотя зачем? почему просто REG->DEF |= value не спасает?) и bit в (1UL<<bit) тоже не помешает и регистры. кто там сбрасывает, кто там выставляет разобраться надо запись бита в регистр BSRRL устанавливает бит. Запись этого же бита в регистр BSRRH сбрасывает его. Вот и весь разбор )
|
|
|
|
|
Jan 1 2013, 18:33
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
вот решение Код #elif defined(STM32L152xx) #define _setL(port,bit) do { port -> BSRRH |= bit; } while(0) // возможно, | лишний символ #define _setH(port,bit) do { port -> BSRRL |= bit; } while(0) #define _clrL(port,bit) do { port -> BSRRL |= bit; } while(0) #define _clrH(port,bit) do { port -> BSRRH |= bit; } while(0) #define _cpl(port,bit,val) { if ((port -> ODR) & bit) _clr##val(port, bit); else _set##val(port, bit); }
|
|
|
|
|
Jan 1 2013, 18:54
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Метценгерштейн @ Jan 1 2013, 20:33)  вот решение Код #elif defined(STM32L152xx) #define _setL(port,bit) do { port -> BSRRH |= bit; } while(0) // возможно, | лишний символ Наверняка лишний. Цитата Bits 15:0 BSy: Port x set bit y (y= 0..15) These bits are write-only and can be accessed in word, half-word or byte mode. A read to these bits returns the value 0x0000 Назначение этих региистров - исключить чтение-модификацию-запись, то есть сделать запись атомарной.
|
|
|
|
|
Jan 11 2013, 02:14
|
Местный
  
Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600

|
Цитата(AHTOXA @ Jan 2 2013, 00:03)  Вот это: Код #define _setmodeHi(mode,port,pin) \ GPIO##port->CRH = (GPIO##port->CRH & (~(0x0F << ((pin-8)<<2)))) | (mode << ((pin-8)<<2))
#define _setmodeLo(mode,port,pin) \ GPIO##port->CRL = (GPIO##port->CRL & (~(0x0F << (pin<<2)))) | (mode << (pin<<2)) будет работать не так, как хотелось бы. Скобки стоят "криво".  UPD. Хотя нет, вроде правильно стоят. Показалось, что сначала исполняется |, а потому уже &.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|