请选择 进入手机版 | 继续访问电脑版
查看: 1018|回复: 4

[原创] 【LPC55S69】rt-thread gpio命令行测试代码添加

[复制链接]
  • TA的每日心情
    奋斗
    2024-2-26 09:09
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    7

    主题

    983

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1989
    最后登录
    2024-4-18
    发表于 2023-2-7 23:27:48 | 显示全部楼层 |阅读模式
    • 背景

    本身想做的事把RTT现有驱动一个一个的测试一轮,顺便把缺少的驱动一个一个的添加上去。由于自己的工作习惯是通过敲命令的方式来测试各个模块,而且RTT也支持msh命令行,因此便决定采用敲命令的方式进行驱动测试。
    查询LPC55sxx代码,发现应用层的驱动测试接口并未添加,因此手动添加测试接口。
    • 项目配置

    修改配置文件“bsp\lpc55sxx\lpc55s69_nxp_evk\applications\SConscript”
    1. import rtconfig
    2. from building import *

    3. cwd = GetCurrentDir()
    4. #src = Glob('main.c')
    5. src = Glob('*.c')
    6. CPPPATH = [cwd]

    7. # add for startup script
    8. if rtconfig.PLATFORM in ['gcc']:
    9.     CPPDEFINES = ['__START=entry']
    10. else:
    11.     CPPDEFINES = []


    12. group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH, CPPDEFINES=CPPDEFINES)

    13. Return('group')
    复制代码

       
    • 代码添加
      • 在“bsp\lpc55sxx\lpc55s69_nxp_evk\applications”目录下添加文件“gpio_test.c”,并添加以下内容:

    1. /*
    2. * Copyright (c) 2006-2023, RT-Thread Development Team
    3. * Copyright (c) 2019-2020, Arm Limited. All rights reserved.
    4. *
    5. * SPDX-License-Identifier: Apache-2.0
    6. *
    7. * Change Logs:
    8. * Date           Author       Notes
    9. * 2023-02-07     Liuxiequan   First Version
    10. *
    11. */

    12. #include <rtdevice.h>
    13. #include "drv_pin.h"

    14. int gpio_mode(int argc, char **argv)
    15. {
    16.     int err = -RT_ERROR;
    17.     int port, pin, level;

    18.     if (argc == 4)
    19.     {
    20.         port = atoi(argv[1]);
    21.         pin = atoi(argv[2]);

    22.         if ((port != -1) && (pin != -1))
    23.         {
    24.             if (strcmp("in", argv[3]) == 0)
    25.             {
    26.                 rt_pin_mode(GET_PINS(port, pin), PIN_MODE_INPUT);
    27.                 rt_kprintf("PIO%d_%d input\n", port, pin);
    28.                 err = RT_EOK;
    29.             }
    30.             else if (strcmp("in_pu", argv[3]) == 0)
    31.             {
    32.                 rt_pin_mode(GET_PINS(port, pin), PIN_MODE_INPUT_PULLUP);
    33.                 rt_kprintf("PIO%d_%d input pull up\n", port, pin);
    34.                 err = RT_EOK;
    35.             }
    36.             else if (strcmp("in_pd", argv[3]) == 0)
    37.             {
    38.                 rt_pin_mode(GET_PINS(port, pin), PIN_MODE_INPUT_PULLDOWN);
    39.                 rt_kprintf("PIO%d_%d input pull down\n", port, pin);
    40.                 err = RT_EOK;
    41.             }
    42.             else if (strcmp("out", argv[3]) == 0)
    43.             {
    44.                 rt_pin_mode(GET_PINS(port, pin), PIN_MODE_OUTPUT);
    45.                 rt_kprintf("PIO%d_%d output\n", port, pin);
    46.                 err = RT_EOK;
    47.             }
    48.             else if (strcmp("out_od", argv[3]) == 0)
    49.             {
    50.                 rt_pin_mode(GET_PINS(port, pin), PIN_MODE_OUTPUT_OD);
    51.                 rt_kprintf("PIO%d_%d output od\n", port, pin);
    52.                 err = RT_EOK;
    53.             }
    54.         }
    55.     }

    56.     if (err)
    57.     {
    58.         rt_kprintf("Param error: Need input gpio_mode port pin [in/in_pu/in_pd/out/out_od]\n");
    59.     }
    60. }
    61. MSH_CMD_EXPORT(gpio_mode, gpio_mode)

    62. int gpio_read(int argc, char **argv)
    63. {
    64.     int err = -RT_ERROR;
    65.     int port, pin, level;

    66.     if (argc == 3)
    67.     {
    68.         port = atoi(argv[1]);
    69.         pin = atoi(argv[2]);

    70.         if ((port != -1) && (pin != -1))
    71.         {
    72.             rt_kprintf("PIO%d_%d: %d\n", port, pin, rt_pin_read(GET_PINS(port, pin)));

    73.             err = RT_EOK;
    74.         }
    75.     }

    76.     if (err)
    77.     {
    78.         rt_kprintf("Param error: Need input gpio_read port pin\n");
    79.     }
    80. }
    81. MSH_CMD_EXPORT(gpio_read, gpio_read)

    82. int gpio_write(int argc, char **argv)
    83. {
    84.     int err = -RT_ERROR;
    85.     int port, pin, level;

    86.     if (argc == 4)
    87.     {
    88.         port = atoi(argv[1]);
    89.         pin = atoi(argv[2]);
    90.         level = atoi(argv[3]);

    91.         if ((port != -1) && (pin != -1) && ((level == 0) || (level == 1)))
    92.         {
    93.             rt_pin_write(GET_PINS(port, pin), level);
    94.             rt_kprintf("PIO%d_%d level : %d\n", port, pin, level);

    95.             err = RT_EOK;
    96.         }
    97.     }

    98.     if (err)
    99.     {
    100.         rt_kprintf("Param error: Need input gpio_write port pin level\n");
    101.     }
    102. }
    103. MSH_CMD_EXPORT(gpio_write, gpio_write)
    复制代码



      • 在“bsp\lpc55sxx\lpc55s69_nxp_evk\”目录下启动env,并运行命令“scons  --target=mdk5”,生成新工程

    1. > scons --target=mdk5
    2. scons: Reading SConscript files ...

    3. scons: warning: No version of Visual Studio compiler found - C/C++ compilers most likely not set correctly
    4. File "E:\Project\RT-Thread\github\rt-thread\bsp\lpc55sxx\lpc55s69_nxp_evk\SConstruct", line 45, in <module>
    5. Keil5 project is generating...
    6. Keil Version: 0.0
    7. Keil-MDK project has generated successfully!
    复制代码


      • 打开工程,编译代码并下载
    • 硬件配置

    通过查看开发板原理图,发现PIO0_0属于悬空状态,适合用作接口测试,因此暂时使用该口做接口测试(论坛一贴图就说超,删掉图片,具体自行查看原理图)

    • 测试效果

    1. \ | /
    2. - RT -     Thread Operating System
    3. / | \     5.0.0 build Feb  7 2023 20:41:22
    4. 2006 - 2022 Copyright by RT-Thread team
    5. [I/I2C] I2C bus [i2c4] registered
    6. using armclang, version: 6180002
    7. msh />sd mount to / failed

    8. msh />
    9. msh />
    10. msh />
    11. msh />gpio_mo
    12. gpio_mode
    13. msh />gpio_mode 0 0 in
    14. msh />gpio_mode 0 0 in
    15. PIO0_0 input
    16. msh />gpio_r
    17. gpio_read
    18. msh />gpio_read 0 0
    19. PIO0_0: 1
    20. msh />gpio_mode 0 0 in_pd
    21. msh />gpio_mode 0 0 in_pd
    22. PIO0_0 input pull down
    23. msh />
    24. msh />
    25. msh />gpio_re
    26. gpio_read
    27. msh />gpio_read 0 0
    28. PIO0_0: 0
    29. msh />gpio_re
    30. gpio_read
    31. msh />gpio_mode 0 0 in_pu
    32. PIO0_0 input pull up
    33. msh />
    34. msh />
    35. msh />gpio_read 0 0
    36. PIO0_0: 1
    37. msh />gpio_mode 0 0 out
    38. PIO0_0 output
    39. msh />gpio_r
    40. gpio_read
    41. msh />gpio_read 0
    42. Param error: Need input gpio_read port pin
    43. msh />gpio_r
    44. gpio_read
    45. msh />gpio_read 0 0
    46. PIO0_0: 1
    47. msh />gpio_out 0 0 0
    48. gpio_out: command not found.
    49. msh />gpio_wri
    50. gpio_write
    51. msh />gpio_write 0 0 0
    52. PIO0_0 level : 0
    53. msh />gpio_re
    54. gpio_read
    55. msh />gpio_read 0
    56. Param error: Need input gpio_read port pin
    57. msh />gpio_re
    58. gpio_read
    59. msh />gpio_read 0 0
    60. PIO0_0: 0
    61. msh />gpio_mode 0 0 out_od
    62. PIO0_0 output od
    63. msh />gpio_re
    64. gpio_read
    65. msh />gpio_read 0 0
    66. PIO0_0: 1
    67. msh />gpio_w
    68. gpio_write
    69. msh />gpio_write 0 0 0
    70. PIO0_0 level : 0
    71. msh />gpio_read 0 0
    72. PIO0_0: 0
    73. msh />
    复制代码

    • 结论

            通过测试PIO0_0,发现该gpio驱动层实现逻辑正常。由于板载其他IO口大部分存在上下拉情况,在测试时读取的值会与悬空态读取的值有差异,发现差异时通过查找原理图,发现与实际效果一致。
           另外,测试发现NXP芯片一个很好的地方,在IO口设置为输出态时,使用gpio_read读回的IO口状态正确,查驱动层和fsl层代码,并未发现特殊处理,怀疑是芯片硬件层面实现了该方面的兼容。
    • 相关资料及代码路径

           LPC55S69-SCH.zip
           oxlm/rt-thread: RT-Thread is an open source IoT operating system. (github.com)


    ~~~~~~~~~~~~
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-2-26 09:09
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    7

    主题

    983

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1989
    最后登录
    2024-4-18
     楼主| 发表于 2023-2-7 23:29:26 | 显示全部楼层
    谁来教教怎么把图加上去?每次贴图都直接说超了,没法弄,最后逼得我只能把图删了
    ~~~~~~~~~~~~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3298

    主题

    6545

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32001
    最后登录
    2024-4-9
    发表于 2023-2-8 08:55:58 | 显示全部楼层
    oxlm 发表于 2023-2-7 23:29
    谁来教教怎么把图加上去?每次贴图都直接说超了,没法弄,最后逼得我只能把图删了 ...

    图片不能复制进去,要点击插入图片,先把图片上传,再插入到你需要的位置
    11.png
    签到签到
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-2-26 09:09
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    7

    主题

    983

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1989
    最后登录
    2024-4-18
     楼主| 发表于 2023-2-8 09:08:53 | 显示全部楼层
    NXP管管 发表于 2023-2-8 08:55
    图片不能复制进去,要点击插入图片,先把图片上传,再插入到你需要的位置

    ...

    试过,一直插不进去,最后放弃了。其实这个功能照理来说应该是后台自动实现的,不知道为啥Discuz公版实现不了。大学论坛也是这种的,直接贴图就行了,后台自动传上去并替换
    ~~~~~~~~~~~~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3298

    主题

    6545

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32001
    最后登录
    2024-4-9
    发表于 2023-2-8 09:11:03 | 显示全部楼层
    oxlm 发表于 2023-2-8 09:08
    试过,一直插不进去,最后放弃了。其实这个功能照理来说应该是后台自动实现的,不知道为啥Discuz公版实现 ...

    markdown复制过来的我看能自动帖,不行你发给我,我来试试
    签到签到
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-19 01:39 , Processed in 0.117611 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表