Шаги по включению или выключению светодиода из программы на C с использованием последовательного порта - PullRequest
1 голос
/ 19 июля 2009

Я знал, что есть похожий пост: Шаги, чтобы заставить светодиод мигать из программы на C / C ++?

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

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

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

Ответы [ 5 ]

4 голосов
/ 19 июля 2009

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

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

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

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

2 голосов
/ 19 июля 2009

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

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

0 голосов
/ 05 ноября 2012

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

0 голосов
/ 13 августа 2009

Предпочтительной альтернативой для управления 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 (в этом случае либо UART, либо функция GPIO на том же выводе)
0 голосов
/ 13 августа 2009

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

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

Он имеет + 5В, -5В на выходе, сейчас я не могу ясно вспомнить. Не каждый пин нужен.

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

...