2009-07-19 6 views
1

Я знал, что есть подобная запись: Steps to make a LED blink from a C/C++ program?Шаги для включения или выключения светодиода из программы C с использованием последовательного порта?

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

В принципе, я думаю, что поток, сделайте один вывод в серийном «1» или включенном, а светодиод будет включен и «0», чтобы отключить его.

Есть ли код ссылки на языке C, на который я могу ссылаться?

+0

Вам повезло с этим? Вы вошли в систему, чтобы проверить это? – NoMoreZealots

ответ

2

Это, я боюсь, будет сильно зависеть от спецификаций конкретной платы разработки на основе рук, которую вы используете.

Необходимо найти документацию, относящуюся к этой плате.

4

Вообще говоря, плата должна поставляться с некоторым пакетом поддержки плат (BSP), который позволяет вам управлять встроенным вводом-выводом. Посмотрите на последовательную библиотеку, если вы действительно хотите использовать сигналы управления аппаратным потоком.

Я бы порекомендовал искать какой-либо GPIO (ввод/вывод общего назначения или цифровой ввод-вывод) на плате, что обычно позволяет вам настроить его как вход или выход. Вы должны подключить светодиод через резистор ограничения тока между цифровой линией ввода-вывода и заземляющим контактом. Убедитесь, что светодиод правильно ориентирован, если вы подключаете его назад, он блокирует ток, а не светится. И как всегда убедитесь, что вы проверите его с помощью цифрового измерителя напряжения перед его подключением.

Даже если у вас нет BSP для цифрового ввода-вывода, конфигурация обычно довольно проста. Установите бит в регистр, чтобы включить его, установите бит в другом регистре, чтобы выбрать вход или выход, они обычно будут расположены в 8-битных «портах». Некоторые системы позволяют настраивать индивидуальные контакты ввода-вывода, а другие позволяют настраивать весь порт для ввода или вывода. Затем вы просто пишете 1 или 0 бит, который вы хотите контролировать в регистре записи/вывода.

ARM-чипы, как правило, сегодня имеют значительное количество встроенных периферийных устройств, поэтому большинство плат будет просто выводить вывод ввода-вывода на физические разъемы на плате, и вам, возможно, потребуется прочитать документацию чип-вендера, чтобы найти память регистров карта. Лучшие брокеры платят документацию, библиотеку (BSP) и примеры. Luminary Micro даже поставляет чипы со встроенными MAC-адресами Ethernet и PHY, просто добавляет разъем и Magnetics, и у вас есть 1 чип-сервер.

0

Раньше я раньше занимался этим программированием.

Вы должны изучить соединения через последовательный порт http://www.lammertbies.nl/comm/cable/RS-232.html http://www.beyondlogic.org/serial/serial.htm

имеет + 5v, -5v на выходе, я не помню, теперь ясно. Не каждый штырь нужен.

Я никогда не использовал ARM раньше, но я использую 8-разрядный контроллер PIC для его программирования. Наверное, вы можете найти много примеров онлайн.

0

Предпочтительная альтернатива для управления GPIO осуществляется через BSP. Поскольку этот пакет поддержки BSP (плата поддержки платформ) выполняет всю работу для вас при настройке всех периферийных устройств на хорошие значения по умолчанию и позволяет вам вызвать функцию. Возможно, ваш BSP-выбор будет иметь функцию записи байта в 8-битный порт GPIO; ваш светодиод будет иметь только один бит. В этом случае ваш C-код может выглядеть так: (по крайней мере: он будет работать так же, как в наборах Luminary Micro).(Пример кода; требуется немного дополнительной работы, чтобы он скомпилировался, особенно на вашем комплекте).

/* each LED is addressed by an address (byte) and a bit-within-this-byte */ 
struct { 
    address, // address of IO register for LED port 
    bit  // bit of LED 
} LEDConfigPair; 

struct LEDConfigPair LEDConfig[NUMBER_OF_LEDS] = { 
    {GPIO_PORTB_BASE,0}, // LED_0 is at port B0 
    {GPIO_PORTB_BASE,1}  // LED_1 is at port B1 
} ; 



/* function LED_init configures the GPIOs where LEDs are connected as output */ 
led_init(void) 
{ 
    U32 i; 
    for(i=0;i<NUMBER_OF_LEDS;i++) 
    { 
     GPIODirModeSet(LEDConfig[i][0], LEDConfig[i][1], GPIO_DIR_MODE_OUT); 
    } 
} 


/* my LED function 
    set_led_state makes use of the BSP of Luminary Micro to access a GPIO function 

    Implementation: this BSP requires setting 8 port wide IO, so the function will calculate a mask (

*/ 
set_led_state(U8 led,bool state) 
{ 
    U8 andmask; 
    U8 setmask; 

    andmask = ~(1 << LEDConfig[led].bit);// a bitmask with all 1's except bit of LED 

    if (true == state) 
    { 
     setmask = (1 << LEDConfig[led].bit); // set bit for LED 
    } else 
    { 
     setmask = 0; 
    } 
    GPIOPinWrite(LEDConfig[led].address, andmask, setmask); 
} 

Конечно, все это изложено; это может быть сделано в течение одной линии, как это:

#DEFINE SETLEDSTATE(led,state) GPIOPinWrite(LEDConfig[led].address, ~(1<<LEDConfig[led].bit),(state<<LEDConfig[led].bit)) 

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

Альтернатива: голый металл. В этом случае вам нужно настроить все для себя. Для встраиваемых систем, вы должны быть осведомлены о контактном мультиплексирование и управления питанием (предполагая, что контроллер памяти и центрального процессора часы уже установлены!)

  • инициализации: набор пин мультиплексирование таким образом, что функция, которую вы хотите контроль фактически отображается на упаковке.
  • инициализация pheripheral (в данном случае либо УАППЫ, или функция GPIO на тот же штырь)
0

Вы не можете сделать это с помощью Rx или Tx штыряма последовательного порта. Для этого вам просто нужно управлять контактами RTS или CTS последовательного порта. Просто google для доступа к COM-порту в коде VC++, а затем управляйте контактами состояния RTS и CTS, чтобы включить и выключить любое внешнее устройство.