查看: 4865|回复: 3

[原创] 【LPC54114双核任务四】+逐步完善RTT--添加Key驱动

[复制链接]
  • TA的每日心情
    开心
    2025-1-21 08:52
  • 签到天数: 861 天

    连续签到: 1 天

    [LV.10]以坛为家III

    75

    主题

    2523

    帖子

    24

    金牌会员

    Rank: 6Rank: 6

    积分
    5867
    最后登录
    2025-1-22
    发表于 2017-8-4 12:31:57 | 显示全部楼层 |阅读模式
    本帖最后由 leo121_3006061 于 2017-8-4 12:37 编辑

    上一篇修改了led驱动,万利的板子带有四个按钮,本次实验,把四个key的驱动添加上来,依葫芦画瓢,创建两个文件,drv_key.c,drv_key.h,代码比较简单,如下drv_key.c
    1. #include <rtthread.h>
    2. #include "board.h"

    3. #define KEY_NUM 4

    4. const uint8_t  KEY_GPIO_PORT[KEY_NUM] = { 1,  1,  1,  1 };
    5. const uint8_t  KEY_GPIO_PIN [KEY_NUM] = { 8,  9, 10, 11 };

    6. struct key_ctrl
    7. {
    8.         uint32_t num;
    9.         uint32_t port;
    10. };

    11. struct lpc_key
    12. {
    13.         /* inherit from rt_device */
    14.         struct rt_device parent;
    15.         struct key_ctrl ctrl[KEY_NUM];
    16. };

    17. static struct lpc_key key;

    18. static rt_err_t rt_key_init(rt_device_t dev)
    19. {
    20.         
    21.         for(int i=0;i<KEY_NUM;i++)
    22.         {
    23.                 Chip_IOCON_PinMuxSet(LPC_IOCON, KEY_GPIO_PORT[i], KEY_GPIO_PIN [i], (IOCON_FUNC0 | IOCON_MODE_PULLUP | IOCON_DIGITAL_EN));
    24.                 Chip_GPIO_SetPinDIRInput(LPC_GPIO, KEY_GPIO_PORT[i], KEY_GPIO_PIN [i]);//方向是输入
    25.                 Chip_GPIO_SetPinState(LPC_GPIO, KEY_GPIO_PORT[i], KEY_GPIO_PIN [i],  false);
    26.                 key.ctrl[i].num = KEY_GPIO_PIN [i];
    27.                 key.ctrl[i].port = KEY_GPIO_PORT[i];
    28.                
    29.         }
    30.         return RT_EOK;
    31. }






    32. int rt_key_hw_init(void)
    33. {
    34.     key.parent.type         = RT_Device_Class_Char;
    35.     key.parent.rx_indicate  = RT_NULL;
    36.     key.parent.tx_complete  = RT_NULL;
    37.     key.parent.init         = rt_key_init;
    38.     key.parent.open         = RT_NULL;//rt_key_on;
    39.     key.parent.close        = RT_NULL;//rt_key_off;
    40.     key.parent.read         = RT_NULL;//rt_key_read;
    41.     key.parent.write        = RT_NULL;   //rt_key_write;
    42.     key.parent.control      = RT_NULL;//rt_key_control;
    43.     key.parent.user_data    = RT_NULL;

    44.     /* register a character device */
    45.     rt_device_register(&key.parent, "key", RT_DEVICE_FLAG_RDWR);
    46.     /* init key device */
    47.     rt_key_init(&key.parent);
    48.     return 0;
    49. }



    50. bool key_switch(rt_uint32_t pb_key)
    51. {
    52.                
    53.         return Chip_GPIO_GetPinState(LPC_GPIO,key.ctrl[pb_key].port, key.ctrl[pb_key].num);//获取key的状态
    54. }


    复制代码


    drv_key.h

    1. #ifndef _DRV_KEY_H_
    2. #define _DRV_KEY_H_

    3. #include "stdint.h"



    4. int rt_key_hw_init(void);
    5. uint8_t key_switch(rt_uint32_t Set_key);//此处定义bool类型会报错


    6. #endif
    复制代码
    为了验证驱动是否正确,修改demo_thread.c,在thread1里添加代码,如下
    1. static void thread1_entry(void* parameter)                                       
    2. {
    3.     while(1)
    4.     {
    5.                         Led_Control(7,1);
    6.                         rt_thread_delay(RT_TICK_PER_SECOND);
    7.                         Led_Control(7,0);
    8.                         rt_thread_delay(RT_TICK_PER_SECOND);
    9.                         if(key_switch(0)==0) //测试key
    10.                         {
    11.                                 Led_Control(5,1);
    12.                                 rt_kprintf("PB2 is on,led5 is ligth on" );
    13.                         
    14.                         }
    15.                         else
    16.                         {
    17.                                 Led_Control(5,0);
    18.                         }
    19.                                 
    20.     }
    21. }
    复制代码
    1. int demo_init(void)
    2. {
    3.         rt_thread_t  thread1 = RT_NULL;
    4.         rt_thread_t  thread2 = RT_NULL;
    5.        
    6.        
    7.         rt_led_hw_init();
    8.         rt_key_hw_init();//初始化加载驱动
    9.        
    10.   thread1 = rt_thread_create("t1",thread1_entry, RT_NULL,512,10,5);                             
    11.   if (thread1 != RT_NULL)                 
    12.                         rt_thread_startup(thread1);

    13.         thread2 = rt_thread_create("t2",thread2_entry, RT_NULL,512,10,5);        
    14.         if (thread2 != RT_NULL)                 
    15.                         rt_thread_startup(thread2);

    16.         return 0;
    17.        
    18. }
    复制代码


    编译下载后,打开串口助手,当按下PB2的时候,led5(LD6)绿色灯亮,串口助手也有输出提示,至此key的驱动初步添加完毕,后续可以自己定义这四个按键的功能(播放,录音等)

    1. f7:0000        f8:0019finsh>>PB2 is on,led5 is ligth onPB2 is on,led5 is ligth on//只截取了结尾输出部分
    复制代码
    后续看时间安排,可以把温度,滑变电阻(控制音量大小)都添加上来


    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情

    2021-1-28 20:09
  • 签到天数: 317 天

    连续签到: 1 天

    [LV.8]以坛为家I

    61

    主题

    1582

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    9404
    最后登录
    2022-5-12
    发表于 2017-8-4 12:40:51 | 显示全部楼层
    操作系统的话,就不要用扫描了,按键一定要用中断处理,线程多的话,实时性跟不上,扫面不到的,中断优先级高于线程
    好好
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-1-21 08:52
  • 签到天数: 861 天

    连续签到: 1 天

    [LV.10]以坛为家III

    75

    主题

    2523

    帖子

    24

    金牌会员

    Rank: 6Rank: 6

    积分
    5867
    最后登录
    2025-1-22
     楼主| 发表于 2017-8-4 12:49:00 | 显示全部楼层
    小马哥-1650185 发表于 2017-8-4 12:40
    操作系统的话,就不要用扫描了,按键一定要用中断处理,线程多的话,实时性跟不上,扫面不到的,中断优先级 ...

    嗯嗯,有道理,回头改一下代码,改成中断方式,谢谢!
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-1-14 20:09
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    5

    主题

    84

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    303
    最后登录
    2021-4-10
    发表于 2017-8-5 07:22:23 | 显示全部楼层
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-8-31 06:41 , Processed in 0.086418 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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