#include "SN_GPIO.h" /* 文件名:SN_GPIO.c/.h 作者: SN_FAE_黄泽洪 免责声明:无版权,可随意传播和篡改,该代码仅供开发参考,如需使用请自行验证 本人不担负商业使用上带来的风险。 */ /* SN_GPIO模块的使用方法 int main(void){ SN_SYSCLK_set(SYSCLK_48MHZ); std_delay_init(); SN_GPIO_PIN_init(GPIOA ,GPIO_PIN_0 , GPIO_MODE_OUTPUT ,GPIO_PULLUP ,GPIO_OUTPUT_PUSHPULL); while(1){ std_delayms(500); SN_GPIO_PIN_set(GPIOA,GPIO_PIN_0); } } 或是 int main(void){ SN_SYSCLK_set(SYSCLK_48MHZ); std_delay_init(); SN_GPIO_PIN_init(GPIOA ,GPIO_PIN_0 , GPIO_MODE_INPUT ,GPIO_PULLUP ,GPIO_OUTPUT_OPENDRAIN); while(1){ if(SN_GPIO_PIN_get(GPIOA, GPIO_PIN_0)){ //用户逻辑 } } } */ /* 函数名称:SN_GPIO_PIN_init() 功能: 设置对应的PIN脚的IO工作模式 @参数:GPIO_PORT @GPIOA @GPIOB @GPIOC @参数: PIN @GPIO_PIN_0 @GPIO_PIN_1 @GPIO_PIN_2 @GPIO_PIN_3 @GPIO_PIN_4 @GPIO_PIN_5 @GPIO_PIN_6 @GPIO_PIN_7 @GPIO_PIN_x|GPIO_PIN_y|GPIO_PIN_z @参数:MODE (输入输出) @GPIO_MODE_INPUT 输入模式 @GPIO_MODE_OUTPUT 输出模式 @参数:GPIO_PULL (上下拉电阻) : @GPIO_PULLUP 设置上拉 @GPIO_PULLDOWN 设置下拉 @GPIO_NOPULL 不设置上下拉 @参数:output_type (是否开漏输出) @GPIO_OUTPUT_PUSHPULL @GPIO_OUTPUT_OPENDRAIN (注意:如果是MODE设置为输入,该参数会被忽略) @返回值:无 */ void SN_GPIO_PIN_init(GPIO_t* gpiox , uint32_t pin_mask , uint32_t GPIO_MODE ,uint32_t GPIO_PULL ,uint32_t output_type){ std_gpio_init_t gpio_config = {0}; /*开启对应时钟*/ if(gpiox == GPIOA)std_rcc_gpio_clk_enable(RCC_PERIPH_CLK_GPIOA ); if(gpiox == GPIOB)std_rcc_gpio_clk_enable(RCC_PERIPH_CLK_GPIOB ); if(gpiox == GPIOC)std_rcc_gpio_clk_enable(RCC_PERIPH_CLK_GPIOC ); /* 配置IO */ gpio_config.pin = pin_mask; gpio_config.mode = GPIO_MODE; if(GPIO_MODE == GPIO_MODE_INPUT ){gpio_config.pull = GPIO_PULL;}else{gpio_config.pull = GPIO_NOPULL;} if(GPIO_MODE == GPIO_MODE_OUTPUT ){gpio_config.output_type = output_type;} std_gpio_init(gpiox, &gpio_config); } /* 函数名称:SN_GPIO_PIN_write() 功能: 输出高低电平 @参数:GPIO_PORT : @GPIOA @GPIOB , @GPIOC @参数:PIN : @GPIO_PIN_0 @GPIO_PIN_1 @GPIO_PIN_2 @GPIO_PIN_3 @GPIO_PIN_4 @GPIO_PIN_5 @GPIO_PIN_6 @GPIO_PIN_7 @GPIO_PIN_x|GPIO_PIN_y|GPIO_PIN_z @返回值:失败 1 ,成功 0 */ uint8_t SN_GPIO_PIN_write(GPIO_t* gpiox, uint32_t pin_mask, uint8_t status){ //判断是否可以输出 if(std_gpio_get_pin_mode(gpiox, pin_mask) != GPIO_MODE_OUTPUT ){ return 1;} if(status == 1)gpiox->BSR = pin_mask; else gpiox->BR = pin_mask; return 0; } /* 函数名称:SN_GPIO_PIN_set() 功能: 输出高低电平 @参数:GPIO_PORT : @GPIOA @GPIOB , @GPIOC @参数:PIN : @GPIO_PIN_0 @GPIO_PIN_1 @GPIO_PIN_2 @GPIO_PIN_3 @GPIO_PIN_4 @GPIO_PIN_5 @GPIO_PIN_6 @GPIO_PIN_7 @GPIO_PIN_x|GPIO_PIN_y|GPIO_PIN_z @返回值:失败 1 ,成功 0 */ uint8_t SN_GPIO_PIN_set(GPIO_t* gpiox, uint32_t pin_mask){ //判断是否可以输出 if(std_gpio_get_pin_mode(gpiox, pin_mask) != GPIO_MODE_OUTPUT ){ return 1;} gpiox->BSR = pin_mask; return 0; } /* 函数名称:SN_GPIO_PIN_reset() 功能: 输出高低电平 @参数:GPIO_PORT @GPIOA @GPIOB , @GPIOC @参数:PIN : @GPIO_PIN_0 @GPIO_PIN_1 @GPIO_PIN_2 @GPIO_PIN_3 @GPIO_PIN_4 @GPIO_PIN_5 @GPIO_PIN_6 @GPIO_PIN_7 @GPIO_PIN_x|GPIO_PIN_y|GPIO_PIN_z @返回值:失败 1 ,成功 0 */ uint8_t SN_GPIO_PIN_reset(GPIO_t* gpiox, uint32_t pin_mask){ //判断是否可以输出 if(std_gpio_get_pin_mode(gpiox, pin_mask) != GPIO_MODE_OUTPUT ){ return 1;} gpiox->BR = pin_mask; return 0; } /* 函数名称:SN_GPIO_PIN_get() 功能: 获取输入io电平 @参数:GPIO_PORT @GPIOA @GPIOB , @GPIOC @参数:PIN @GPIO_PIN_0 @GPIO_PIN_1 @GPIO_PIN_2 @GPIO_PIN_3 @GPIO_PIN_4 @GPIO_PIN_5 @GPIO_PIN_6 @GPIO_PIN_7 @GPIO_PIN_x|GPIO_PIN_y|GPIO_PIN_z @返回值:失败 0xff ,成功 0/1 */ uint8_t SN_GPIO_PIN_get(GPIO_t* gpiox, uint32_t pin){ //判断是否可以输输入 if(std_gpio_get_pin_mode(gpiox, pin) != GPIO_MODE_INPUT ){ return 0xff;} return ((gpiox->IDR & (pin)) == (pin)); } /* 函数名称:SN_GPIO_PIN_toggle() 功能: 获取输入io电平 @参数:GPIO_PORT @GPIOA @GPIOB , @GPIOC @参数:PIN @GPIO_PIN_0 @GPIO_PIN_1 @GPIO_PIN_2 @GPIO_PIN_3 @GPIO_PIN_4 @GPIO_PIN_5 @GPIO_PIN_6 @GPIO_PIN_7 @返回值:@返回值:失败 0xff ,成功 0/1 */ uint8_t SN_GPIO_PIN_toggle(GPIO_t* gpiox, uint32_t pin_mask){ //判断是否可以输出 if(std_gpio_get_pin_mode(gpiox, pin_mask) != GPIO_MODE_OUTPUT ){ return 0xff;} gpiox->ODR ^= pin_mask; return 1; } /* 函数名称:SN_GPIO_Deinit(uint8 GPIO_X) 参数: GPIOA GPIOB GPIOC 返回:无 */ void SN_GPIO_Deinit(GPIO_t * GPIOx){ std_gpio_deinit(GPIOx); if(GPIOx == GPIOA)std_rcc_gpio_clk_disable(RCC_PERIPH_CLK_GPIOA ); if(GPIOx == GPIOB)std_rcc_gpio_clk_disable(RCC_PERIPH_CLK_GPIOB ); if(GPIOx == GPIOC)std_rcc_gpio_clk_disable(RCC_PERIPH_CLK_GPIOC ); }