Как получить значение с 15-го контакта 32-битного порта в ARM? - PullRequest
2 голосов
/ 27 ноября 2009

Я использую микросхему DS1620 для считывания 1-битных последовательных данных, поступающих в одну строку. Мне нужно прочитать эти данные, используя один из портов микроконтроллера ARM (LPC2378). Порты ARM являются 32-битными. Как мне получить это значение в 1-битную переменную?

Редактировать: Другими словами, мне нужна прямая ссылка на вывод порта.

Ответы [ 6 ]

5 голосов
/ 27 ноября 2009

нет 1-битных переменных, но вы можете выделить конкретный бит, например:

uint32_t original_value = whatever();
uint32_t bit15 = (original_value >> 15) & 1; /*bit15 now contains either a 1 or a 0 representing the 15th bit */

Примечание: я не знаю, считали ли вы битовые числа, начинающиеся с 0 или 1, поэтому >> 15 может быть отключен на единицу, но вы поняли.

Другой вариант - использовать битовые поля, но это становится беспорядочным, и IMO не стоит того, чтобы каждый бит в значении был каким-то образом полезен. Если вам нужен только один или два бита, лучше всего использовать сдвиг и маскировку.

В целом, эта статья может быть вам полезна.

3 голосов
/ 30 ноября 2009

Для вашего процессора следует использовать ответ от Evan Teran. Я просто хотел упомянуть о битовой полосе некоторых других процессоров ARM, таких как Cortex-M3. Для некоторого региона ОЗУ / Периферийные устройства все биты отображаются на отдельный адрес для легкого доступа.

См. http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0337e/Behcjiic.html для получения дополнительной информации.

1 голос
/ 30 ноября 2009

Это просто, если вы можете получить доступ к регистру порта напрямую (у меня нет опыта работы с ARM), просто по битам И это с двоичной маской, которая соответствует биту, который вы хотите:

var = (PORT_REGISTER & 0x00008000);

Теперь переменная содержит 0, если 15-й бит равен 0, или 0x00008000, если 15-й бит равен 1.

Кроме того, вы можете сдвинуть его, если хотите иметь «0» или «1»:

var = ((PORT_REGISTER & 0x00008000) >> 15);
0 голосов
/ 20 декабря 2009

Если вы проверяете биты, хорошо иметь в виду порядок оценки оператора C, например,

if( port & 0x80 && whatever() )

может привести к неожиданному поведению, как вы только что написали

if( port & (0x80 && whatever()) )

но, вероятно, мент

if( (port & 0x80) && whatever() )
0 голосов
/ 01 декабря 2009

В LPC2378 (как и в другом семействе микроконтроллеров LPC2xxxx) порты ввода-вывода находятся в системной памяти, поэтому вам необходимо объявить некоторые переменные, например:

#define  DALLAS_PIN (*(volatile unsigned long int *)(0xE0028000)) /* Port 0 data register */
#define  DALLAS_DDR (*(volatile unsigned long int *)(0xE0028008)) /* Port 0 data direction reg */
#define  DALLAS_PIN (1<<15)

Обратите внимание, что 0xE0028000 - это адрес для регистра данных порта 0, а 0xE0028008 - для адреса регистра данных для порта 0. Вам нужно изменить это в соответствии с портом и битом, используемым в вашем приложении. После этого в вашей функции кода код или макросы для записи 1, записи 0 и чтения должны быть примерно такими:

#define  set_dqout()    (DALLAS_DDR&=~DALLAS_PIN)   /* Let the pull-up force one, putting I/O pin in input mode */
#define  reset_dqout()  (DALLAS_DDR|=DALLAS_PIN,DALLAS_PORT&=~DALLAS_PIN) /* force zero putting the I/O in output mode and writing zero on it */
#define  read_dqin()    (DALLAS_DDR&=~DALLAS_PIN,((DALLAS_PORT & DALLAS_PIN)!= 0)) /* put i/o in input mode and test the state of the i/o pin */

Надеюсь, это поможет.

Привет!

0 голосов
/ 01 декабря 2009

Заголовочные файлы, которые поставляются с вашим компилятором, будут содержать объявления для всех регистров микроконтроллера и биты в этих регистрах.

В этой конкретной статье давайте представим, что регистр ввода порта называется PORTA, а для нужного бита для него определена маска с именем PORTA15.

Затем, чтобы прочитать состояние этого вывода:

PinIsSet = (PORTA & PORTA15) == PORTA15;

Или эквивалентно, используя троичный оператор :

PinIsSet = (PORTA & PORTA15) ? 1 : 0;

В качестве общего замечания обратитесь к справочному руководству, чтобы узнать, что делают все регистры и биты. Также посмотрите на некоторые примеры. ( Эта страница на веб-сайте Keil содержит и то, и другое множество примеров в Интернете.)

...