STM32的3种不同GPIO驱动介绍
知晓编程 2023-03-30


1、库函数版
最常用的版本,使用ST标准外设库












void Led_Key_Init(void){  GPIO_InitTypeDef GPIO_Init_s;  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);//使能时钟  GPIO_Init_s.GPIO_Pin = GPIO_Pin_4; GPIO_Init_s.GPIO_Mode = GPIO_Mode_OUT; GPIO_Init_s.GPIO_OType = GPIO_OType_PP; GPIO_Init_s.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init_s.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOE, &GPIO_Init_s);}
开源代码:
https://github.com/strongercjd/STM32F207VCT6/tree/master/06-GPIO-Input-Output (提示: 公众号不支持外链接,请复制链接到浏览器下载)

2、寄存器版
寄存器版其实就是把ST标准外设库拷贝出来,可以简化一些操作




















/********使用寄存器---start********///TP---PA15 #define TP_PORT GPIOA #define TP_PIN GPIO_Pin_15 #define TP_OUT() TP_PORT->CRH&=0X0FFFFFFF; TP_PORT->CRH|=0X50000000; //!IO输出#define TP_IN() TP_PORT->CRH&=0X0FFFFFFF; TP_PORT->CRH|=0X40000000; //!IO输入#define TP_READ() (((TP_PORT->IDR)>>15)?1:0) //! #define TP_SET() TP_PORT->BSRR = TP_PIN;//写1#define TP_CLR() TP_PORT->BRR = TP_PIN;//写0 #define TP_DATA_SET() TP_SET() //IO写1#define TP_DATA_CLR() TP_CLR() //IO写0#define TP_DATA_OUT() TP_OUT() //将IO设为输出#define TP_DATA_IN() TP_IN() //将IO设为输入#define TP_DATA_READ() TP_READ()//读取IO的电平 /********使用寄存器---end********/
开源代码:
https://github.com/strongercjd/STM32F207VCT6/tree/master/06-GPIO-Input-Output (提示: 公众号不支持外链接,请复制链接到浏览器下载)

3、位段版
基于位段的,操作方便



















/*LED配置---PE4*/#define GPIO_IDR_OFFSET (GPIOE_BASE+0x10 - PERIPH_BASE)#define GPIO_ODR_OFFSET (GPIOE_BASE+0x14 - PERIPH_BASE) #define GPIO_BitNumber 4#define GPIO_OUT_BB (PERIPH_BB_BASE + (GPIO_ODR_OFFSET * 32) + (GPIO_BitNumber * 4)) #define GPIO_OUT_DATA *(__IO uint32_t *)GPIO_OUT_BB #define GPIO_IN_BB (PERIPH_BB_BASE + (GPIO_IDR_OFFSET * 32) + (GPIO_BitNumber * 4)) #define GPIO_IN_DATA *(__IO uint32_t *)GPIO_IN_BB #define GPIO_DIR_REG *(__IO uint32_t *)(GPIOE_BASE+0X00)  #define PE4_SET() GPIO_OUT_DATA = 1 //!< IO写1#define PE4_CLR() GPIO_OUT_DATA = 0 //!< IO写0#define PE4_OUT() GPIO_DIR_REG = (((GPIO_DIR_REG) & 0xFFFFFCFF) | 0x00000100) //!IO输出#define PE4_IN() GPIO_DIR_REG = ((GPIO_DIR_REG) & 0xFFFFFCFF) //!IO输入#define PE4_READ() GPIO_IN_DATA //!
将上述整理为通用GPIO驱动代码











/*GPIO配置---PXX*/#define GPIO_SET(GPIOx_BASE,GPIO_BitNumber) *(__IO uint32_t *)((PERIPH_BB_BASE + ((GPIOx_BASE+0x14 - PERIPH_BASE) * 32) + (GPIO_BitNumber * 4))) = 1 //!< IO写1#define GPIO_CLR(GPIOx_BASE,GPIO_BitNumber) *(__IO uint32_t *)((PERIPH_BB_BASE + ((GPIOx_BASE+0x14 - PERIPH_BASE) * 32) + (GPIO_BitNumber * 4))) = 0 //!< IO写0 #define GPIO_OUT(GPIOx_BASE,GPIO_BitNumber) *(__IO uint32_t *)(GPIOx_BASE+0X00) &= ~(GPIO_MODER_MODER0 << (GPIO_BitNumber * 2));\ *(__IO uint32_t *)(GPIOx_BASE+0X00) |= ((GPIO_Mode_OUT) << (GPIO_BitNumber * 2)); //!IO输出 #define GPIO_IN(GPIOx_BASE,GPIO_BitNumber) *(__IO uint32_t *)(GPIOx_BASE+0X00) &= ~(GPIO_MODER_MODER0 << (GPIO_BitNumber * 2));\ *(__IO uint32_t *)(GPIOx_BASE+0X00) |= ((GPIO_Mode_IN) << (GPIO_BitNumber * 2)); //!IO输入 #define GPIO_READ(GPIOx_BASE,GPIO_BitNumber) *(__IO uint32_t *)((PERIPH_BB_BASE + ((GPIOx_BASE+0x10 - PERIPH_BASE) * 32) + (GPIO_BitNumber * 4))) //!
调用方法GPIOx_BASE:GPIOE_BASE基地址,而不是GPIOEGPIO_BitNumber:4,而不是GPIO_Pin_4

GPIO_OUT(GPIOE_BASE,4);
开源代码:

本文源自微信公众号:知晓编程,不代表用户或本站观点,如有侵权,请联系nick.zong@aspencore.com 删除!

声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 相关技术文库
  • 单片机
  • 嵌入式
  • MCU
  • STM
下载排行榜
更多
评测报告
更多
广告