Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Keil + LPC
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Пал
Уважаемые. кто как обращается к битовым полям регистров перефирии LPC-шников в Keil-е. Нужно сделать так, чтобы эти регистры по прежнему читались как регистры(целиком) и давали доступ к своим битовым полям. Заставить работать Иаровскую конструкцию PINSEL1_bit.P0_28=1 в Кейле не получается.
richie
Цитата(Пал @ Dec 11 2008, 15:31) *
Уважаемые. кто как обращается к битовым полям регистров перефирии LPC-шников в Keil-е. Нужно сделать так, чтобы эти регистры по прежнему читались как регистры(целиком) и давали доступ к своим битовым полям. Заставить работать Иаровскую конструкцию PINSEL1_bit.P0_28=1 в Кейле не получается.

А я, наоборот, пока въезжал в иаровкую идеалгию (на которую забил в итоге) при портировании под
него своих текстов, оставил определения битовых операций и везде их использую. Одинаково
транслируется и под кейл, и под иар, и под гну и т.д.

Сделай опеределения:
#define BIT( i ) ( 1 << ( i ) )
#define CLR_BIT( val, b ) ( ( val ) &= ~BIT( b ) )
#define SET_BIT( val, b ) ( ( val ) |= BIT( b ) )
#define CHK_BIT( val, b ) ( ( ( val ) & BIT( b ) ) == BIT( b ) )

Это типа универсальные определения битовых операций. И используй их.

Для твоего случая:
SET_BIT( PINSEL1, 28 );
Пал
Цитата(richie @ Dec 11 2008, 19:14) *
А я, наоборот, пока въезжал в иаровкую идеалгию (на которую забил в итоге) при портировании под
него своих текстов, оставил определения битовых операций и везде их использую. Одинаково
транслируется и под кейл, и под иар, и под гну и т.д.

Сделай опеределения:
#define BIT( i ) ( 1 << ( i ) )
#define CLR_BIT( val, b ) ( ( val ) &= ~BIT( b ) )
#define SET_BIT( val, b ) ( ( val ) |= BIT( b ) )
#define CHK_BIT( val, b ) ( ( ( val ) & BIT( b ) ) == BIT( b ) )

Это типа универсальные определения битовых операций. И используй их.

Для твоего случая:
SET_BIT( PINSEL1, 28 );


Вы меня не поняли. Я про битовые поля Мне нужно обратиться к битам 5-16 регистра ADDR, в которых содержится результат преобразования АЦП. Но прочитать такое поле - полбеды, сдвинул замаскировал и готово. а если модифицировать? Руки сломаешь.
abcdefg
Цитата(Пал @ Dec 11 2008, 17:58) *
Но прочитать такое поле - полбеды, сдвинул замаскировал и готово. а если модифицировать? Руки сломаешь.


гы, все на cortex'ы! smile.gif
Пал
Цитата(abcdefg @ Dec 11 2008, 21:02) *
гы, все на cortex'ы! smile.gif


Я не в теме, чем там лучче?
defunct
из списка фич кортекса:
...
- Unaligned data access, enabling data to be efficiently packed into memory
- Atomic bit manipulation (bit-banging) delivers maximum memory utilization and sreamlined peripheral control
...
richie
Цитата(Пал @ Dec 11 2008, 17:58) *
Вы меня не поняли. Я про битовые поля Мне нужно обратиться к битам 5-16 регистра ADDR, в которых содержится результат преобразования АЦП. Но прочитать такое поле - полбеды, сдвинул замаскировал и готово. а если модифицировать? Руки сломаешь.

Ну, руки ломать не надо - это главный инструмент программиста. smile.gif
Но вот голову один раз можно и поломать.
Когда мне нужно работать с битами, то я обычно создаю необходимые макросы, которые работают по
битовым маскам.
Создай макросы типа:
#define GET_REG( reg, mask ) ( (reg) & (mask) )
#define SET_REG( reg, val ) ( (reg) |= (val) )
#define CHK_REG( reg, mask ) ( (reg) & (mask) == (mask) )

#if ( CPU_TYPE == LPC23xx )
#define ADC_DATA_REG AD0DR0
#define ADC_DATA_SHFT 5
#define ADC_DATA_MSK 0x3FF
#define ADC_DONE BIT( 31 )
#define ADC_DONE_STATE 1
#elif (CPU_TYPE == ??? )
....
#endif //CPU_TYPE

#define ADC_GET_DATA() ( GET_REG( ADC_DATA_REG, (ADC_DATA_MSK << ADC_DATA_SHFT) ) >> ADC_DATA_SHFT )
#define ADC_IS_DONE() ( GET_BIT( ADC_DATA_REG, ADC_DONE ) == ADC_DONE_STATE )

На 100% правильность реализации не претендую, вариантов реализации много, кому как нравится.
Но думаю идея понятна.
MaxEngee
А что битовые поля уже использовать не модно?

struct my_str{
unsigned z :4;
unsigned a :1;
unsigned b :1;
} stat;

stat.z=5;
stat.a=stat.b=1;

Правда если речь идет о служебных регистрах, которые в иклюде определенны не как битовые поля,то придется либо пользоваться макросами либо научиться пользоваться сдвигами, и, или, и считать биты
Faradey
Цитата(MaxEngee @ Dec 12 2008, 09:33) *
А что битовые поля уже использовать не модно?

struct my_str{
unsigned z :4;
unsigned a :1;
unsigned b :1;
} stat;

stat.z=5;
stat.a=stat.b=1;

Правда если речь идет о служебных регистрах, которые в иклюде определенны не как битовые поля,то придется либо пользоваться макросами либо научиться пользоваться сдвигами, и, или, и считать биты


Если речь идет о регистрах, то не стоит забывать про "__packed" или "__attribute__((packed))" (если пользуете ключик "--gnu").

http://www.keil.com/support/man/docs/armcc...he.htm#babcgedf

http://www.keil.com/support/man/docs/armcc...cc_cjadhedh.htm
abcdefg
Цитата(Пал @ Dec 11 2008, 18:46) *
Я не в теме, чем там лучче?


кроме побитового доступа к некоторым сегментам памяти (bit-band),
есть команды работы непосредственно с битами - BFC (bit field clear), BFI (bit field insert) и UBFX (bit field extract)
triod647
Цитата(Пал @ Dec 11 2008, 17:58) *
Вы меня не поняли. Я про битовые поля Мне нужно обратиться к битам 5-16 регистра ADDR, в которых содержится результат преобразования АЦП. Но прочитать такое поле - полбеды, сдвинул замаскировал и готово. а если модифицировать? Руки сломаешь.


В случае с GPIO (у меня на 16 - 23 висел дисплей) я модифицировал и читал IOPIN , отлично получалось хотя он ReadOnly.
Пал
Цитата(richie @ Dec 12 2008, 13:19) *
Ну, руки ломать не надо - это главный инструмент программиста. smile.gif
Но вот голову один раз можно и поломать.
Когда мне нужно работать с битами, то я обычно создаю необходимые макросы, которые работают по
битовым маскам.
Создай макросы типа:
#define GET_REG( reg, mask ) ( (reg) & (mask) )
#define SET_REG( reg, val ) ( (reg) |= (val) )
#define CHK_REG( reg, mask ) ( (reg) & (mask) == (mask) )

#if ( CPU_TYPE == LPC23xx )
#define ADC_DATA_REG AD0DR0
#define ADC_DATA_SHFT 5
#define ADC_DATA_MSK 0x3FF
#define ADC_DONE BIT( 31 )
#define ADC_DONE_STATE 1
#elif (CPU_TYPE == ??? )
....
#endif //CPU_TYPE

#define ADC_GET_DATA() ( GET_REG( ADC_DATA_REG, (ADC_DATA_MSK << ADC_DATA_SHFT) ) >> ADC_DATA_SHFT )
#define ADC_IS_DONE() ( GET_BIT( ADC_DATA_REG, ADC_DONE ) == ADC_DONE_STATE )

На 100% правильность реализации не претендую, вариантов реализации много, кому как нравится.
Но думаю идея понятна.



Спасибо, похоже то что мне нужно, попробую разобраться
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.