/* * Copyright (c) 2006-2021, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2024-05-06 lijian the first version */ #include IO_t IO; //输入端口列表 rt_base_t input_pins[] = { GET_PIN(C, 2), GET_PIN(C, 3), GET_PIN(C, 4), GET_PIN(A, 5), GET_PIN(A, 6), GET_PIN(A, 7), GET_PIN(A, 8), GET_PIN(C, 9), }; //输出端口列表 rt_base_t output_pins[] = { GET_PIN(B, 12), GET_PIN(B, 13), GET_PIN(B, 14), GET_PIN(B, 15), GET_PIN(C, 6), GET_PIN(C, 7), GET_PIN(C, 8), GET_PIN(A, 11), }; /** * 端口中断回调函数 * @param args */ void gpio_irq_callback(void *args) { rt_base_t pin = (rt_base_t)(uintptr_t)args; // 获取触发中断的引脚号 rt_kprintf("pin: %#x", pin); switch (pin) { case IN1: IO.IO_Data[0].Temp_Count++; //rt_kprintf("pin1:%d\n", IO.IO_Data[0].Temp_Count); break; case IN2: IO.IO_Data[1].Temp_Count++; //rt_kprintf("pin2:%d\n", IO.IO_Data[1].Temp_Count); break; case IN3: IO.IO_Data[2].Temp_Count++; //rt_kprintf("pin3:%d\n", IO.IO_Data[2].Temp_Count); break; case IN4: IO.IO_Data[3].Temp_Count++; //rt_kprintf("pin4:%d\n", IO.IO_Data[3].Temp_Count); break; case IN5: IO.IO_Data[4].Temp_Count++; //rt_kprintf("pin5:%d\n", IO.IO_Data[4].Temp_Count); break; case IN6: IO.IO_Data[5].Temp_Count++; //rt_kprintf("pin6:%d\n", IO.IO_Data[5].Temp_Count); break; case IN7: IO.IO_Data[6].Temp_Count++; //rt_kprintf("pin7:%d\n", IO.IO_Data[6].Temp_Count); break; case IN8: IO.IO_Data[7].Temp_Count++; //rt_kprintf("pin8:%d\n", IO.IO_Data[7].Temp_Count); break; default: break; } } //配置输入引脚 void configure_inpin(rt_base_t pin) { // 设置引脚模式为上拉输入 rt_pin_mode(pin, PIN_MODE_INPUT_PULLUP); rt_kprintf(" pin: %d %#x\r\n", pin, pin); /* 绑定中断,下降沿模式,回调函数名为 */ rt_pin_attach_irq(pin, PIN_IRQ_MODE_FALLING, gpio_irq_callback, (void *)(uintptr_t)pin); /* 使能中断 */ rt_pin_irq_enable(pin, PIN_IRQ_ENABLE); } /** * 输入引脚初始化 */ void gpio_input_init(void) { rt_kprintf(" pin list:\r\n"); for (rt_uint8_t var = 0; var < INPUT_NUM; var++) { configure_inpin(input_pins[var]); } } /** * 输出引脚默认为高电平 * @param pin */ void configure_outpin(rt_base_t pin) { // 设置引脚模式为输出模式 rt_pin_mode(pin, PIN_MODE_OUTPUT); // 默认为高电平 rt_pin_write(pin, PIN_HIGH); } //输出引脚初始化 void gpio_output_init(void){ for (rt_uint8_t var = 0; var < OUTPUT_NUM; var++) { configure_outpin(output_pins[var]); } } //获取端口电平触发次数 rt_uint32_t get_IO_count(rt_uint8_t io){ return IO.IO_Data[io].Temp_Count; } //控制台更改电平 void IO_key(int argc, char**argv){ rt_uint8_t var = atoi(argv[1]); rt_uint8_t var2 = atoi(argv[2]); if (var2) { rt_pin_write(output_pins[var], PIN_HIGH); } else { rt_pin_write(output_pins[var], PIN_LOW); } } MSH_CMD_EXPORT(IO_key, chage IO);