你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32的3种不同GPIO驱动

[复制链接]
STMCU-管管 发布时间:2020-9-8 09:49

1、库函数版

最常用的版本,使用ST标准外设库



  1. void  Led_Key_Init(void)
  2. {  
  3.   GPIO_InitTypeDef GPIO_Init_s;
  4.   
  5.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);//使能时钟  
  6.   GPIO_Init_s.GPIO_Pin = GPIO_Pin_4;
  7.   GPIO_Init_s.GPIO_Mode = GPIO_Mode_OUT;
  8.   GPIO_Init_s.GPIO_OType = GPIO_OType_PP;
  9.   GPIO_Init_s.GPIO_Speed = GPIO_Speed_50MHz;
  10.   GPIO_Init_s.GPIO_PuPd = GPIO_PuPd_UP;
  11.   GPIO_Init(GPIOE, &GPIO_Init_s);
  12. }
复制代码




2、寄存器版

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

  1. /********使用寄存器---start********/
  2. //TP---PA15

  3. #define TP_PORT      GPIOA      
  4. #define TP_PIN      GPIO_Pin_15

  5. #define TP_OUT()   TP_PORT->CRH&=0X0FFFFFFF; TP_PORT->CRH|=0X50000000;   //!IO输出
  6. #define TP_IN()    TP_PORT->CRH&=0X0FFFFFFF; TP_PORT->CRH|=0X40000000;   //!IO输入
  7. #define TP_READ()  (((TP_PORT->IDR)>>15)?1:0)   //!<IO读入

  8. #define TP_SET()    TP_PORT->BSRR = TP_PIN;//写1
  9. #define TP_CLR()    TP_PORT->BRR  = TP_PIN;//写0

  10. #define TP_DATA_SET()   TP_SET() //IO写1
  11. #define TP_DATA_CLR()   TP_CLR() //IO写0
  12. #define TP_DATA_OUT()   TP_OUT() //将IO设为输出
  13. #define TP_DATA_IN()    TP_IN()  //将IO设为输入
  14. #define TP_DATA_READ()  TP_READ()//读取IO的电平

  15. /********使用寄存器---end********/
复制代码




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



  1. /*LED配置---PE4*/
  2. #define  GPIO_IDR_OFFSET  (GPIOE_BASE+0x10 - PERIPH_BASE)
  3. #define  GPIO_ODR_OFFSET  (GPIOE_BASE+0x14 - PERIPH_BASE)

  4. #define  GPIO_BitNumber   4
  5. #define  GPIO_OUT_BB     (PERIPH_BB_BASE + (GPIO_ODR_OFFSET * 32) + (GPIO_BitNumber * 4))   
  6. #define  GPIO_OUT_DATA           *(__IO uint32_t *)GPIO_OUT_BB

  7. #define  GPIO_IN_BB     (PERIPH_BB_BASE + (GPIO_IDR_OFFSET * 32) + (GPIO_BitNumber * 4))   
  8. #define  GPIO_IN_DATA           *(__IO uint32_t *)GPIO_IN_BB

  9. #define  GPIO_DIR_REG     *(__IO uint32_t *)(GPIOE_BASE+0X00)


  10. #define PE4_SET()  GPIO_OUT_DATA = 1   //!< IO写1
  11. #define PE4_CLR()  GPIO_OUT_DATA = 0   //!< IO写0
  12. #define PE4_OUT()  GPIO_DIR_REG = (((GPIO_DIR_REG) & 0xFFFFFCFF) | 0x00000100)  //!IO输出
  13. #define PE4_IN()   GPIO_DIR_REG = ((GPIO_DIR_REG) & 0xFFFFFCFF)  //!IO输入
  14. #define PE4_READ() GPIO_IN_DATA   //!<IO读入
复制代码

  1. /*GPIO配置---PXX*/
  2. #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
  3. #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

  4. #define GPIO_OUT(GPIOx_BASE,GPIO_BitNumber)   *(__IO uint32_t *)(GPIOx_BASE+0X00)  &= ~(GPIO_MODER_MODER0 << (GPIO_BitNumber * 2));\
  5.                                               *(__IO uint32_t *)(GPIOx_BASE+0X00) |= ((GPIO_Mode_OUT) << (GPIO_BitNumber * 2)); //!IO输出

  6. #define GPIO_IN(GPIOx_BASE,GPIO_BitNumber)    *(__IO uint32_t *)(GPIOx_BASE+0X00)  &= ~(GPIO_MODER_MODER0 << (GPIO_BitNumber * 2));\
  7.                                               *(__IO uint32_t *)(GPIOx_BASE+0X00) |= ((GPIO_Mode_IN) << (GPIO_BitNumber * 2));  //!IO输入
  8.                                              
  9. #define GPIO_READ(GPIOx_BASE,GPIO_BitNumber)  *(__IO uint32_t *)((PERIPH_BB_BASE + ((GPIOx_BASE+0x10 - PERIPH_BASE) * 32) + (GPIO_BitNumber * 4)))   //!<IO读入
复制代码




调用方法GPIOx_BASE:GPIOE_BASE基地址,而不是GPIOEGPIO_BitNumber:4,而不是GPIO_Pin_4

  1. GPIO_OUT(GPIOE_BASE,4);
复制代码




1 收藏 2 评论0 发布时间:2020-9-8 09:49

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版