【问题标题】:Steps to make a LED on or off from a C program using Serial Port?使用串行端口从 C 程序打开或关闭 LED 的步骤?
【发布时间】:2012-11-05 21:26:04
【问题描述】:

我知道有一个类似的帖子: Steps to make a LED blink from a C/C++ program?

但现在我正在开发一个基于 arm 的开发板,它似乎有两个串行端口,我可以用它来打开或关闭 LED。

基本上我认为流程是,将一个引脚串行“1”或打开,LED将打开,“0”使其关闭。

我可以参考一些 C 语言的参考代码吗?

【问题讨论】:

  • 你有什么运气吗?您是否重新登录以查看此内容?

标签: c arm port led


【解决方案1】:

一般来说,该板应该带有一些板支持包 (BSP),它可以让您控制内置 I/O。如果您真的想使用硬件流控制信号,请寻找串行库。

我建议您在板上寻找一些 GPIO(通用 I/O 或数字 I/O),这通常可以让您将其配置为输入或输出。您应该能够通过数字 I/O 线和接地引脚之间的限流电阻连接 LED。如果向后连接,请确保 LED 的方向正确,它会阻挡电流而不是照明。并且一如既往地确保在连接之前使用数字电压表对其进行检查。

即使您没有用于数字 I/O 的 BSP,配置通常也很简单。 在一个寄存器中设置一个位来启用它,在另一个寄存器中设置一个位来选择输入或输出,它们通常会排列在 8 位“端口”中。有些系统允许您配置单独的 I/O 引脚,而其他系统只允许您配置整个端口的输入或输出。然后,您只需将 1 或 0 写入您要控制的写入/输出寄存器中的位。

如今,ARM 芯片通常具有大量内置外围设备,因此大多数板卡只会将 I/O 引出到板上的物理连接器,您可能需要阅读芯片供应商的文档才能找到寄存器内存映射.更好的电路板供应商将提供文档、库 (BSP) 和示例。 Luminary Micro 甚至提供带有内置以太网 MAC 和 PHY 的芯片,只需添加一个连接器和 Magnetics,您就拥有一个单芯片网络服务器。

【讨论】:

    【解决方案2】:

    恐怕这在很大程度上取决于您正在使用的特定基于 arm 的开发板的规格。

    您需要找到特定于该板的文档。

    【讨论】:

      【解决方案3】:

      我以前也做过这种编程。

      需要研究串口连接 http://www.lammertbies.nl/comm/cable/RS-232.html http://www.beyondlogic.org/serial/serial.htm

      输出有+5v,-5v,我现在记不太清楚了。并非每个引脚都需要。

      我以前从未使用过 ARM,但我使用 8 位 PIC 控制器对其进行编程。我想你可以在网上找到很多例子。

      【讨论】:

        【解决方案4】:

        控制 GPIO 的首选替代方法是通过 BSP。因为这个 BSP(板级支持包)为您完成所有工作,将所有外设设置为良好的默认值并允许您调用函数。您选择的 BSP 可能具有将字节写入 8 位 GPIO 端口的功能;您的 LED 将只有一位。在这种情况下,您的 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))
        

        这也是一样的,但只有当你可以梦想位掩码并且你只想切换一些 LED 来调试真正的程序时才有意义......

        替代方案:裸机。 在这种情况下,您需要自己设置所有内容。对于嵌入式系统,您需要了解引脚复用和电源管理(假设内存控制器和 cpu 时钟已经设置好!)

        • 初始化:设置引脚复用,使您想要控制的功能实际映射到封装上。
        • 外围设备的初始化(在这种情况下是 UART 或同一引脚上的 GPIO 功能)

        【讨论】:

          【解决方案5】:

          您不能使用串行端口的 Rx 或 Tx 引脚来执行此操作。为此,您只需要控制串口的 RTS 或 CTS 引脚即可。 只需谷歌“在 VC++ 代码中访问 COM 端口”,然后控制 RTS 和 CTS 状态引脚来打开和关闭任何外部设备。

          【讨论】:

            猜你喜欢
            • 2010-09-17
            • 2015-10-30
            • 2021-03-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多