STM32的3种不同GPIO驱动

1 库函数版

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

1void 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}

开源代码:

https://github.com/strongercjd/STM32F207VCT6/tree/master/06-GPIO-Input-Output

2 寄存器版

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

1/********使用寄存器---start********/ 2//TP---PA15 3 4#define TP_PORT GPIOA 5#define TP_PIN GPIO_Pin_15 6 7#define TP_OUT() TP_PORT->CRH&=0X0FFFFFFF; TP_PORT->CRH|=0X50000000; //!IO输出 8#define TP_IN() TP_PORT->CRH&=0X0FFFFFFF; TP_PORT->CRH|=0X40000000; //!IO输入 9#define TP_READ() (((TP_PORT->IDR)>>15)?1:0) //!<IO读入 10 11#define TP_SET() TP_PORT->BSRR = TP_PIN;//写1 12#define TP_CLR() TP_PORT->BRR = TP_PIN;//写0 13 14#define TP_DATA_SET() TP_SET() //IO写1 15#define TP_DATA_CLR() TP_CLR() //IO写0 16#define TP_DATA_OUT() TP_OUT() //将IO设为输出 17#define TP_DATA_IN() TP_IN() //将IO设为输入 18#define TP_DATA_READ() TP_READ()//读取IO的电平 19 20/********使用寄存器---end********/

开源代码:

https://github.com/strongercjd/STM32F207VCT6/tree/master/06-GPIO-Input-Output

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 5#define GPIO_BitNumber 4 6#define GPIO_OUT_BB (PERIPH_BB_BASE + (GPIO_ODR_OFFSET * 32) + (GPIO_BitNumber * 4)) 7#define GPIO_OUT_DATA *(__IO uint32_t *)GPIO_OUT_BB 8 9#define GPIO_IN_BB (PERIPH_BB_BASE + (GPIO_IDR_OFFSET * 32) + (GPIO_BitNumber * 4)) 10#define GPIO_IN_DATA *(__IO uint32_t *)GPIO_IN_BB 11 12#define GPIO_DIR_REG *(__IO uint32_t *)(GPIOE_BASE+0X00) 13 14 15#define PE4_SET() GPIO_OUT_DATA = 1 //!< IO写1 16#define PE4_CLR() GPIO_OUT_DATA = 0 //!< IO写0 17#define PE4_OUT() GPIO_DIR_REG = (((GPIO_DIR_REG) & 0xFFFFFCFF) | 0x00000100) //!IO输出 18#define PE4_IN() GPIO_DIR_REG = ((GPIO_DIR_REG) & 0xFFFFFCFF) //!IO输入 19#define PE4_READ() GPIO_IN_DATA //!<IO读入

将上述整理为通用GPIO驱动代码

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 5#define GPIO_OUT(GPIOx_BASE,GPIO_BitNumber) *(__IO uint32_t *)(GPIOx_BASE+0X00) &= ~(GPIO_MODER_MODER0 << (GPIO_BitNumber * 2));\ 6 *(__IO uint32_t *)(GPIOx_BASE+0X00) |= ((GPIO_Mode_OUT) << (GPIO_BitNumber * 2)); //!IO输出 7 8#define GPIO_IN(GPIOx_BASE,GPIO_BitNumber) *(__IO uint32_t *)(GPIOx_BASE+0X00) &= ~(GPIO_MODER_MODER0 << (GPIO_BitNumber * 2));\ 9 *(__IO uint32_t *)(GPIOx_BASE+0X00) |= ((GPIO_Mode_IN) << (GPIO_BitNumber * 2)); //!IO输入 10 11#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

点击查看本文所在的专辑,STM32F207教程

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )