跳转到主要内容
cathy 提交于

<strong>1、库函数版</strong>

最常用的版本,使用ST标准外设库
<pre>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);
}</pre>

开源代码:

<a href="https://github.com/strongercjd/STM32F207VCT6/tree/master/06-GPIO-Input-…;

<strong>2、寄存器版</strong>

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

<pre>/********使用寄存器---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) //!&lt;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********/</pre>

开源代码:
<a href="https://github.com/strongercjd/STM32F207VCT6/tree/master/06-GPIO-Input-…;

<strong>3、位段版</strong>

基于位段的,操作方便
<pre>/*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 //!&lt; IO写1
#define PE4_CLR() GPIO_OUT_DATA = 0 //!&lt; 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 //!&lt; IO读入</pre>

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

<pre>/*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 //!&lt; 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 //!&lt; IO写0

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

#define GPIO_IN(GPIOx_BASE,GPIO_BitNumber) *(__IO uint32_t *)(GPIOx_BASE+0X00) &= ~(GPIO_MODER_MODER0 &lt; &lt; (GPIO_BitNumber * 2));\
*(__IO uint32_t *)(GPIOx_BASE+0X00) |= ((GPIO_Mode_IN) &lt; &lt; (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))) //!&lt; IO读入</pre>

调用方法

GPIOx_BASE:GPIOE_BASE基地址,而不是GPIOE
GPIO_BitNumber:4,而不是GPIO_Pin_4

<pre>GPIO_OUT(GPIOE_BASE,4);</pre>

开源代码:
<a href="https://github.com/strongercjd/STM32F207VCT6/tree/master/08-GPIO-bit-ba…;

本文转载自:知晓编程(作者:Firefly)
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。