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

 
 
 
Reply to this topicStart new topic
> как лучше дописать макрос Аскольда для STM32?, застрял на cpl();
Метценгерштейн
сообщение Jan 1 2013, 10:28
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 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

но что-то не хочет компилиться.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jan 1 2013, 10:46
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



обернуть в {} вместе с ; (хотя зачем? почему просто REG->DEF |= value не спасает?)
и bit в (1UL<<bit) тоже не помешает
и регистры. кто там сбрасывает, кто там выставляет разобраться надо
Go to the top of the page
 
+Quote Post
Ivan Panov
сообщение Jan 1 2013, 11:27
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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))
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 1 2013, 11:51
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 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 сбрасывает его.
Вот и весь разбор )
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jan 1 2013, 11:55
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



ну и с Новым годом
разобрались - и хорошо
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 1 2013, 18:33
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 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); }
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jan 1 2013, 18:54
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 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

Назначение этих региистров - исключить чтение-модификацию-запись, то есть сделать запись атомарной.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 1 2013, 19:39
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



другими словами, записав только один бит, я другие не затру?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 1 2013, 20:03
Сообщение #9


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Не затрёте.
На всякий случай вот вам пара ссылок: Вот вариант макросов Волкова. А вот - вариант для плюсов (этот поновее).


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Tahoe
сообщение Jan 11 2013, 02:14
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 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))
будет работать не так, как хотелось бы. Скобки стоят "криво". wink.gif

UPD.
Хотя нет, вроде правильно стоят. Показалось, что сначала исполняется |, а потому уже &.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 11 2013, 05:46
Сообщение #11


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Уф, сейчас глянул - и тоже показалось, что неправильно. Я аж испугалсяsm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 28th July 2025 - 03:48
Рейтинг@Mail.ru


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