STM32有哪些不同GPIO驱动

这篇文章主要介绍STM32有哪些不同GPIO驱动,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站设计、做网站、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的兴安盟网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!

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)   //!<IO读入
 
#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   //!<IO读入

将上述整理为通用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)))   //!<IO读入

调用方法

GPIOx_BASE:GPIOE_BASE基地址,而不是GPIOE

GPIO_BitNumber:4,而不是GPIO_Pin_4

GPIO_OUT(GPIOE_BASE,4);

开源代码:

https://github.com/strongercjd/STM32F207VCT6/tree/master/08-GPIO-bit-band

以上是“STM32有哪些不同GPIO驱动”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注创新互联行业资讯频道!

本文标题:STM32有哪些不同GPIO驱动
文章分享:https://www.cdcxhl.com/article28/gecgjp.html

成都网站建设公司_创新互联,为您提供用户体验搜索引擎优化域名注册自适应网站软件开发小程序开发

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都网页设计公司