回答

收藏

[评测分享] 【TL7218X开发板】按键控制LED

#板卡评测 #板卡评测 965 人阅读 | 0 人回复 | 2025-02-21

本帖最后由 eefocus_3914144 于 2025-2-21 14:54 编辑

LED的控制,在系统的函数中提供了
static inline void gpio_function_en(gpio_pin_e pin)
这个函数,我们可以输入:GPIO_PC3这样的对GPIO的定义来使能PCGPIO
common.h中有如下定义:
#elif defined(MCU_CORE_TL721X)
    #define LED1 GPIO_PC3
    #define LED2 GPIO_PC2
    #define LED3 GPIO_PC1
    #define LED4 GPIO_PC0
    #define KEY1 GPIO_PD4
    #define KEY2 GPIO_PD6
    #define KEY3 GPIO_PD5
#define KEY4 GPIO_PD7

在系充函数中,提供了gpio_output_en(gpio_pin_e pin)来全能GPIO的为输出模式
如示,我们使用
    gpio_function_en(LED1);
    gpio_function_en(LED2);
    gpio_function_en(LED3);
    gpio_function_en(LED4);
    gpio_output_en(LED1);
    gpio_output_en(LED2);
    gpio_output_en(LED3);
gpio_output_en(LED4);
来开启板载的4LED的输出模出。以此来控制板子上的4LED灯。

同时系统提供了gpio_set_high_level(LED2);来实现对LED进行开启
            gpio_set_low_level(LED3); 来实对LED进行关闭。
使用gpio_toggle(LED1);LED进行翻转。
按键输入:
根据用户手册对按键的描述:
  1. 1. SW3, SW4, SW5 和 SW6 组成 2x2 的按键矩阵。
  2. 2. SW3 两端网络分别是 TL_Key1 和 TL_Key3。
  3. 3. SW4 两端网络分别是 TL_Key1 和 TL_Key3。
  4. 4. SW5 两端网络分别是 TL_Key2 和 TL_Key4。
  5. 5. SW6 两端网络分别是 TL_Key2 和 TL_Key4。
  6. 6. TL_Key1 的来源如下:
  7. ? TL7218X 的 PD4 连接到了 J6 的 PIN 28
  8. ? J6 的 PIN 28 默认和 PIN 27 通过跳帽短接
  9. ? J6 的 PIN 27 连接到 SW3 和 SW4 的一端,网络名称为 TL_Key1
  10. 7. TL_Key2 的来源如下:
  11. ? TL7218X 的 PD6 连接到了 J6 的 PIN 30
  12. ? J6 的 PIN 30 默认和 PIN 29 通过跳帽短接
  13. ? J6 的 PIN 29 连接到 SW5 和 SW6 的一端,网络名称为 TL_Key2
  14. 8. TL_Key3 的来源如下:
  15. ? TL7218X 的 PD5 连接到了 J6 的 PIN 32
  16. ? J6 的 PIN 32 默认和 PIN 31 通过跳帽短接
  17. ? J6 的 PIN 31 连接到 SW3 和 SW5 的一端,网络名称为 TL_Key3
  18. 9. TL_Key4 的来源如下:
  19. ? TL7218X 的 PD7 连接到了 J6 的 PIN 34
  20. ? J6 的 PIN 34 默认和 PIN 33 通过跳帽短接
  21. ? J6 的 PIN 33 连接到 SW4 和 SW6 的一端,网络名称为 TL_Key4
  22. 10. 如果想用 TL7218X 的另外一个 GPIO 控制按键,那么请拔掉对应跳帽,
  23. 然后把 J6 的 PIN27/29/31/33 连接到另一个想用的 GPIO 上。
复制代码

我们需要配置PD4IRQ的输入,然后给PD4配置为低电平,我位按下SW3来产生一个下降沿的触发,来产生中断。
  1. /****GPIO_IRQ POL_FALLING   Press SW2 to connect IRQ_PIN and KEY3 to trigger an interrupt. **/



  2.     /*

  3.     * Button matrix table:

  4.     *           KEY3    KEY4

  5.     *   KEY1    SW2     SW3

  6.     *   KEY2    SW4     SW5

  7.     */

  8.     //1.Initialization signal generation output pin

  9.     gpio_function_en(KEY3); //short press KEY3 to generate an edge signal.

  10.     gpio_output_en(KEY3);

  11.     gpio_input_dis(KEY3);

  12.     //2.Initialize interrupt detection input pin

  13.     gpio_function_en(IRQ_PIN);

  14.     gpio_output_dis(IRQ_PIN);

  15. gpio_input_en(IRQ_PIN);

  16.     //if disable gpio interrupt,choose disable gpio mask , use interface gpio_clr_irq_mask instead of gpio_irq_dis,if use gpio_irq_dis,may generate a false interrupt.

  17.     gpio_set_low_level(KEY3);

  18.     gpio_set_up_down_res(IRQ_PIN, GPIO_PIN_PULLUP_10K);

  19.     gpio_set_irq(IRQ_PIN, INTR_FALLING_EDGE); //When SW2 is pressed, the falling edge triggers the interrupt.

  20.     plic_interrupt_enable(IRQ_GPIO);
复制代码


【中断回调函数】

  1. attribute_ram_code_sec_noinline_ void gpio_irq_handler(void)

  2. {

  3.     gpio_irq_cnt++;

  4.     gpio_clr_irq_status(FLD_GPIO_IRQ_CLR);

  5. }

  6. PLIC_ISR_REGISTER(gpio_irq_handler, IRQ_GPIO)
复制代码


在中断回调函中,我们对gpio_irq_cnt 进行自增。
在主函数中,我们对gpio_irq_cnt 进行判断,来实现动态对LED的控制,实现一个交替闪烁的LED灯。
主函数:
  1. /////////////////////////////////////////////////////////////////////
  2. // main loop flow
  3. /////////////////////////////////////////////////////////////////////
  4. void main_loop(void)
  5. {
  6.    
  7.     gpio_toggle(LED1);
  8.     delay_ms(200);
  9.     if(gpio_irq_cnt%2 == 0){
  10.             gpio_set_high_level(LED2);
  11.             gpio_set_low_level(LED3);
  12.     }else{
  13.             gpio_set_low_level(LED2);
  14.             gpio_set_high_level(LED3);
  15.     }
  16. }
复制代码

【总结】
这次我通过对GPIO_DEMO的学习,学习到了如果对GPIO进行初始化,如何对GPIO进行输出、输入的配置,如果对GPIO进行高、低电平、翻转的输出。以及对中断的配置。同时如何书写中断回调函数以及注册。成功的实现了GPIO的与用户的交互。
【实现效果】

分享到:
回复

使用道具 举报

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

本版积分规则

关闭

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