手动控制 Arduino Leonardo 的 Tx/Rx LED

Arduino Leonardo 等使用 mega32u4 的开发板使用的是 MCU 原生的 USB CDC 串口,上面的 Tx/Rx LED 直接连接到 GPIO。通过删除控制 LED 闪烁的代码,这些 GPIO 就可以用作其他用途。

找到硬件包里面的cores/arduino/USBCore.cpp文件,根据下面的 diff 删内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
--- a/USBCore.cpp
+++ b/USBCore.cpp
@@ -23,11 +23,6 @@

#if defined(USBCON)

-/** Pulse generation counters to keep track of the number of milliseconds remaining for each pulse type */
-#define TX_RX_LED_PULSE_MS 100
-volatile u8 TxLEDPulse; /**< Milliseconds remaining for data Tx LED pulse */
-volatile u8 RxLEDPulse; /**< Milliseconds remaining for data Rx LED pulse */
-
//==================================================================
//==================================================================

@@ -122,16 +117,10 @@
{
while (count--)
*data++ = UEDATX;
-
- RXLED1; // light the RX LED
- RxLEDPulse = TX_RX_LED_PULSE_MS;
}

static inline u8 Recv8()
{
- RXLED1; // light the RX LED
- RxLEDPulse = TX_RX_LED_PULSE_MS;
-
return UEDATX;
}

@@ -331,8 +320,6 @@
}
}
}
- TXLED1; // light the TX LED
- TxLEDPulse = TX_RX_LED_PULSE_MS;
return r;
}

@@ -772,12 +759,6 @@
if (udint & (1<<SOFI))
{
USB_Flush(CDC_TX); // Send a tx frame if found
-
- // check whether the one-shot period has elapsed. if so, turn off the LED
- if (TxLEDPulse && !(--TxLEDPulse))
- TXLED0;
- if (RxLEDPulse && !(--RxLEDPulse))
- RXLED0;
}

// the WAKEUPI interrupt is triggered as soon as there are non-idle patterns on the data

之后就可以分别通过 IO 编号 17/30 操作 RX/TX 的亮灭。除此之外,ISP 接口上还有三个可用的 GPIO 14, 15, 16,在缺 GPIO 时也可以用上。

注意:由于没有对 Bootloader 进行修改,在 Bootloader 模式下这些 GPIO 仍然是 LED 的功能。