123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 |
- #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 );
-
- }
|