本帖最后由 eefocus_3914144 于 2025-2-21 14:54 编辑
LED的控制,在系统的函数中提供了 static inline void gpio_function_en(gpio_pin_e pin) 这个函数,我们可以输入:GPIO_PC3这样的对GPIO的定义来使能PC的GPIO。 在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); 来开启板载的4个LED的输出模出。以此来控制板子上的4个LED灯。
同时系统提供了gpio_set_high_level(LED2);来实现对LED进行开启 gpio_set_low_level(LED3); 来实对LED进行关闭。 使用gpio_toggle(LED1);对LED进行翻转。 按键输入: 根据用户手册对按键的描述: - 1. SW3, SW4, SW5 和 SW6 组成 2x2 的按键矩阵。
- 2. SW3 两端网络分别是 TL_Key1 和 TL_Key3。
- 3. SW4 两端网络分别是 TL_Key1 和 TL_Key3。
- 4. SW5 两端网络分别是 TL_Key2 和 TL_Key4。
- 5. SW6 两端网络分别是 TL_Key2 和 TL_Key4。
- 6. TL_Key1 的来源如下:
- ? TL7218X 的 PD4 连接到了 J6 的 PIN 28
- ? J6 的 PIN 28 默认和 PIN 27 通过跳帽短接
- ? J6 的 PIN 27 连接到 SW3 和 SW4 的一端,网络名称为 TL_Key1
- 7. TL_Key2 的来源如下:
- ? TL7218X 的 PD6 连接到了 J6 的 PIN 30
- ? J6 的 PIN 30 默认和 PIN 29 通过跳帽短接
- ? J6 的 PIN 29 连接到 SW5 和 SW6 的一端,网络名称为 TL_Key2
- 8. TL_Key3 的来源如下:
- ? TL7218X 的 PD5 连接到了 J6 的 PIN 32
- ? J6 的 PIN 32 默认和 PIN 31 通过跳帽短接
- ? J6 的 PIN 31 连接到 SW3 和 SW5 的一端,网络名称为 TL_Key3
- 9. TL_Key4 的来源如下:
- ? TL7218X 的 PD7 连接到了 J6 的 PIN 34
- ? J6 的 PIN 34 默认和 PIN 33 通过跳帽短接
- ? J6 的 PIN 33 连接到 SW4 和 SW6 的一端,网络名称为 TL_Key4
- 10. 如果想用 TL7218X 的另外一个 GPIO 控制按键,那么请拔掉对应跳帽,
- 然后把 J6 的 PIN27/29/31/33 连接到另一个想用的 GPIO 上。
复制代码
我们需要配置PD4为IRQ的输入,然后给PD4配置为低电平,我位按下SW3来产生一个下降沿的触发,来产生中断。 - /****GPIO_IRQ POL_FALLING Press SW2 to connect IRQ_PIN and KEY3 to trigger an interrupt. **/
-
- /*
- * Button matrix table:
- * KEY3 KEY4
- * KEY1 SW2 SW3
- * KEY2 SW4 SW5
- */
- //1.Initialization signal generation output pin
- gpio_function_en(KEY3); //short press KEY3 to generate an edge signal.
- gpio_output_en(KEY3);
- gpio_input_dis(KEY3);
- //2.Initialize interrupt detection input pin
- gpio_function_en(IRQ_PIN);
- gpio_output_dis(IRQ_PIN);
- gpio_input_en(IRQ_PIN);
- //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.
- gpio_set_low_level(KEY3);
- gpio_set_up_down_res(IRQ_PIN, GPIO_PIN_PULLUP_10K);
- gpio_set_irq(IRQ_PIN, INTR_FALLING_EDGE); //When SW2 is pressed, the falling edge triggers the interrupt.
- plic_interrupt_enable(IRQ_GPIO);
复制代码
【中断回调函数】
- attribute_ram_code_sec_noinline_ void gpio_irq_handler(void)
- {
- gpio_irq_cnt++;
- gpio_clr_irq_status(FLD_GPIO_IRQ_CLR);
- }
- PLIC_ISR_REGISTER(gpio_irq_handler, IRQ_GPIO)
复制代码
在中断回调函中,我们对gpio_irq_cnt 进行自增。 在主函数中,我们对gpio_irq_cnt 进行判断,来实现动态对LED的控制,实现一个交替闪烁的LED灯。 主函数: - /////////////////////////////////////////////////////////////////////
- // main loop flow
- /////////////////////////////////////////////////////////////////////
- void main_loop(void)
- {
-
- gpio_toggle(LED1);
- delay_ms(200);
- if(gpio_irq_cnt%2 == 0){
- gpio_set_high_level(LED2);
- gpio_set_low_level(LED3);
- }else{
- gpio_set_low_level(LED2);
- gpio_set_high_level(LED3);
- }
- }
复制代码
【总结】 这次我通过对GPIO_DEMO的学习,学习到了如果对GPIO进行初始化,如何对GPIO进行输出、输入的配置,如果对GPIO进行高、低电平、翻转的输出。以及对中断的配置。同时如何书写中断回调函数以及注册。成功的实现了GPIO的与用户的交互。 【实现效果】
|