/********************************************************************** * Copyright: (C)2024 LingYun IoT System Studio * Author: GuoWenxue * Description: ISKBoard Hardware Abstract Layer driver * * ChangeLog: * Version Date Author Description * V1.0.0 2024.08.29 GuoWenxue Release initial version ***********************************************************************/ #include "miscdev.h" /* *+----------------------+ *| GPIO Relay API | *+----------------------+ */ gpio_t relays[RelayMax] = { { "Relay1", GPIOD, GPIO_PIN_2, OFF }, }; int init_relay(void) { int which; /* Turn all relays off */ for(which=0; which= RelayMax ) return ; level = status==OFF ? GPIO_PIN_RESET : GPIO_PIN_SET; HAL_GPIO_WritePin(relays[which].group, relays[which].pin, level); relays[which].status = status; } /* Get $which relay current status */ int status_relay(int which) { if( which >= RelayMax ) return 0; return relays[which].status; } /* *+----------------------+ *| GPIO Led API | *+----------------------+ */ gpio_t leds[LedMax] = { { "RedLed", GPIOC, GPIO_PIN_9, OFF }, { "GreenLed", GPIOC, GPIO_PIN_6, OFF }, { "BlueLed", GPIOB, GPIO_PIN_2, OFF }, }; int init_led(void) { int which; /* Turn all Leds off */ for(which=0; which= LedMax ) return ; level = status==OFF ? GPIO_PIN_SET : GPIO_PIN_RESET; HAL_GPIO_WritePin(leds[which].group, leds[which].pin, level); leds[which].status = status; } /* Toggle $which led status */ void toggle_led(int which) { if( which >= LedMax ) return ; HAL_GPIO_TogglePin(leds[which].group, leds[which].pin); leds[which].status = !leds[which].status; } /* Blink $which led */ void blink_led(int which, uint32_t interval) { turn_led(which, ON); HAL_Delay(interval); turn_led(which, OFF); HAL_Delay(interval); } /* Get $which led current status */ int status_led(int which) { if( which >= LedMax ) return 0; return leds[which].status; } /* *+----------------------+ *| GPIO Key API | *+----------------------+ */ #include "main.h" /* Key1_pin, Key2_Pin, Key3_Pin 定义在该头文件下 */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if( Key1_Pin == GPIO_Pin ) { blink_led( Led_R, 500 ); } else if( Key2_Pin == GPIO_Pin ) { blink_led( Led_G, 500 ); } else if( Key3_Pin == GPIO_Pin ) { blink_led( Led_B, 500 ); } } /* *+----------------------+ *| printf API | *+----------------------+ */ #include "usart.h" /* 全局变量huart1定义在 usart.c中,并在sart.h头文件中声明 */ /* gcc 编译器中的 printf 函数将会调用 __io_putchar() 函数,实现最终的字符打印 * keil编译器中的 printf 函数将会调用 fputc() 函数,实现最终的字符打印 * 这里我们定义一个宏 PUTCHAR_PROTOTYPE 来兼容这两个编译器所需要的函数原型; */ #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* * STM32CubeIDE使用的是 gcc 编译器,它会内建 __GNUC__ 宏定义,所以下面PUTCHAR_PROTOTYPE将会扩展为: * int __io_putchar(int ch) */ PUTCHAR_PROTOTYPE { /* 调用STM32 HAL库的串口发送函数,将printf要打印的这个字符通过串口发送出去 */ HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF); return ch; }