stm32驱动_STM32的3种不同GPIO驱动

关注、星标公众,不错过精彩内容5f46124a43235b90c0d1938e164d0c96.png

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);
开源代码: https://github.com/strongercjd/STM32F207VCT6/tree/master/08-GPIO-bit-band (提示: 公众号不支持外链接,请复制链接到浏览器下载) 582f1256f2bd1f8c5f162adbef9caf80.gif b2d136c0ab86bd50de6b8d17bb25f7bf.gif

晶振原理解析

复位电路设计

STM32 GPIO详解

STM32延时函数的四种方法

设计一款兼容ST207和GD207的开发板

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值