linux 串口 lseek,小识堂 | 重新定向 printf 输出到串口 ,你知多少???

该代码展示了如何在嵌入式系统中初始化并控制LED设备。`main`函数通过`fopen`打开LED设备文件,并利用`fputc`发送控制指令来切换LED的状态。`LED_open`函数根据设备路径初始化GPIO引脚,设置为输出模式,为后续的LED控制做准备。程序使用简单的延时函数实现周期性的LED闪烁效果。
摘要由CSDN通过智能技术生成

1.   int main(void)

2.   {

3.       /* 基本外设初始化 */

4.       SystemInit();

5.

6.       printf('Hello world!\r\n');

7.

8.       FILE *led1, *led2, *leds;

9.

10.      led1 = fopen('LED:/led1', 'w'); // 打开设备

11.      led2 = fopen('LED:/led2', 'w');

12.      leds = fopen('LED:/leds', 'w');

13.

14.      setbuf(led1, 0);                // 禁用缓冲区

15.      setbuf(led2, 0);

16.      setbuf(leds, 0);

17.

18.      // 主循环

19.      for(;;)

20.      {

21.          // 延时(非精确)

22.          Delay(0x00FFFFFF);

23.          fputc(0x00, led1);

24.          fputc(0x01, led2);

25.          fputc(0x18, leds);

26.

27.          // 延时(非精确)

28.          Delay(0x00FFFFFF);

29.          fputc(0x01, led1);

30.          fputc(0x00, led2);

31.          fputc(0x14, leds);

32.

33.          // 延时(非精确)

34.          Delay(0x00FFFFFF);

35.          fputc(0x0C, leds);

36.      }

37.

38.  //  fclose(led);

39.  }

1.   int LED_open(const char *path, unsigned flags, int fno)

2.   {

3.       // 返回的文件描述符 0/1/2 系统保留

4.       // 如果使用会被自动顺延

5.

6.       KickUnlock();

7.

8.       if(!strcmp(path, '/led1'))

9.       {

10.          // 核心板 LED

11.          GPIOPinMuxSet(SOC_DSC_BASE_REGS + SOC_DSC_PIN_CONTROL_0, GPIO26_UARTCTS1, GPIO_NORMAL_ENABLED);

12.          GPIODirModeSet(SOC_GPIO_0_REGS, GPIO26_UARTCTS1, GPIO_DIR_OUTPUT);

13.

14.          return 0x00000011;

15.      }

16.      else if(!strcmp(path, '/led2'))

17.      {

18.          // 核心板 LED

19.          GPIOPinMuxSet(SOC_DSC_BASE_REGS + SOC_DSC_PIN_CONTROL_0, GPIO27_UARTRTS1, GPIO_NORMAL_ENABLED);

20.          GPIODirModeSet(SOC_GPIO_0_REGS, GPIO27_UARTRTS1, GPIO_DIR_OUTPUT);

21.

22.          return 0x00000012;

23.      }

24.      else if(!strcmp(path, '/led3'))

25.      {

26.          // 底板 LED

27.          GPIOPinMuxSet(SOC_DSC_BASE_REGS + SOC_DSC_PIN_CONTROL_0, GPIO19_TIMO1,    GPIO_NORMAL_ENABLED);

28.          GPIODirModeSet(SOC_GPIO_0_REGS, GPIO19_TIMO1,    GPIO_DIR_OUTPUT);

29.

30.          return 0x00000013;

31.      }

32.      else if(!strcmp(path, '/led4'))

33.      {

34.          // 底板 LED

35.          GPIOPinMuxSet(SOC_DSC_BASE_REGS + SOC_DSC_PIN_CONTROL_0, GPIO22_UARTCTS0, GPIO_NORMAL_ENABLED);

36.          GPIODirModeSet(SOC_GPIO_0_REGS, GPIO22_UARTCTS0, GPIO_DIR_OUTPUT);

37.

38.          return 0x00000014;

39.      }

40.      else if(!strcmp(path, '/led5'))

41.      {

42.          // 底板 LED

43.          GPIOPinMuxSet(SOC_DSC_BASE_REGS + SOC_DSC_PIN_CONTROL_0, GPIO23_UARTRTS0, GPIO_NORMAL_ENABLED);

44.          GPIODirModeSet(SOC_GPIO_0_REGS, GPIO23_UARTRTS0, GPIO_DIR_OUTPUT);

45.

46.          return 0x00000015;

47.      }

48.      else if(!strcmp(path, '/leds'))

49.      {

50.          // 核心板 LED

51.          GPIOPinMuxSet(SOC_DSC_BASE_REGS + SOC_DSC_PIN_CONTROL_0, GPIO26_UARTCTS1, GPIO_NORMAL_ENABLED);

52.          GPIOPinMuxSet(SOC_DSC_BASE_REGS + SOC_DSC_PIN_CONTROL_0, GPIO27_UARTRTS1, GPIO_NORMAL_ENABLED);

53.

54.          GPIODirModeSet(SOC_GPIO_0_REGS, GPIO26_UARTCTS1, GPIO_DIR_OUTPUT);

55.          GPIODirModeSet(SOC_GPIO_0_REGS, GPIO27_UARTRTS1, GPIO_DIR_OUTPUT);

56.

57.          // 底板 LED

58.          GPIOPinMuxSet(SOC_DSC_BASE_REGS + SOC_DSC_PIN_CONTROL_0, GPIO19_TIMO1,    GPIO_NORMAL_ENABLED);

59.          GPIOPinMuxSet(SOC_DSC_BASE_REGS + SOC_DSC_PIN_CONTROL_0, GPIO22_UARTCTS0, GPIO_NORMAL_ENABLED);

60.          GPIOPinMuxSet(SOC_DSC_BASE_REGS + SOC_DSC_PIN_CONTROL_0, GPIO23_UARTRTS0, GPIO_NORMAL_ENABLED);

61.

62.          GPIODirModeSet(SOC_GPIO_0_REGS, GPIO19_TIMO1,    GPIO_DIR_OUTPUT);

63.          GPIODirModeSet(SOC_GPIO_0_REGS, GPIO22_UARTCTS0, GPIO_DIR_OUTPUT);

64.          GPIODirModeSet(SOC_GPIO_0_REGS, GPIO23_UARTRTS0, GPIO_DIR_OUTPUT);

65.

66.          return 0x00000020;

67.      }

68.      else

69.      {

70.          return -1;

71.      }

72.  }

73.

74.  int LED_close(int fno)

75.  {

76.

77.      return 0;

78.  }

79.

80.  int LED_read(int fno, char *buffer, unsigned count)

81.  {

82.

83.      return 0;

84.  }

85.

86.  int LED_write(int fno, const char *buffer, unsigned count)

87.  {

88.      switch(fno)

89.      {

90.          case 0x11 : *buffer ? GPIOPinWrite(SOC_GPIO_0_REGS, GPIO26_UARTCTS1, GPIO_PIN_HIGH) : \

91.                              GPIOPinWrite(SOC_GPIO_0_REGS, GPIO26_UARTCTS1, GPIO_PIN_LOW); break;

92.          case 0x12 : *buffer ? GPIOPinWrite(SOC_GPIO_0_REGS, GPIO27_UARTRTS1, GPIO_PIN_HIGH) : \

93.                              GPIOPinWrite(SOC_GPIO_0_REGS, GPIO27_UARTRTS1, GPIO_PIN_LOW); break;

94.

95.          case 0x13 : *buffer ? GPIOPinWrite(SOC_GPIO_0_REGS, GPIO19_TIMO1, GPIO_PIN_HIGH) : \

96.                              GPIOPinWrite(SOC_GPIO_0_REGS, GPIO19_TIMO1, GPIO_PIN_LOW); break;

97.

98.          case 0x14 : *buffer ? GPIOPinWrite(SOC_GPIO_0_REGS, GPIO22_UARTCTS0, GPIO_PIN_HIGH) : \

99.                              GPIOPinWrite(SOC_GPIO_0_REGS, GPIO22_UARTCTS0, GPIO_PIN_LOW); break;

100.

101.        case 0x15 : *buffer ? GPIOPinWrite(SOC_GPIO_0_REGS, GPIO23_UARTRTS0, GPIO_PIN_HIGH) : \

102.                            GPIOPinWrite(SOC_GPIO_0_REGS, GPIO23_UARTRTS0, GPIO_PIN_LOW); break;

103.

104.        case 0x20 : GPIOPinWrite(SOC_GPIO_0_REGS, GPIO26_UARTCTS1, (*buffer >> 0) & 0x01);

105.                   GPIOPinWrite(SOC_GPIO_0_REGS, GPIO27_UARTRTS1, (*buffer >> 1) & 0x01);

106.                   GPIOPinWrite(SOC_GPIO_0_REGS, GPIO19_TIMO1,    (*buffer >> 2) & 0x01);

107.                   GPIOPinWrite(SOC_GPIO_0_REGS, GPIO22_UARTCTS0, (*buffer >> 3) & 0x01);

108.                   GPIOPinWrite(SOC_GPIO_0_REGS, GPIO23_UARTRTS0, (*buffer >> 4) & 0x01); break;

109.    }

110.

111.    return 0;

112.}

113.

114.off_t LED_lseek(int fno, off_t offset, int origin)

115.{

116.

117.    return 0;

118.}

119.

120.int LED_unlink(const char *path)

121.{

122.

123.    return 0;

124.}

125.

126.int LED_rename(const char *old_name, const char *new_name)

127.{

128.

129.    return 0;

130.}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值