Linux 学习记录55(ARM篇)
本文目录
- Linux 学习记录55(ARM篇)
- 一、使用C语言封装GPIO函数
- 1. 封装GPIO组寄存器
- 2. 封装GPIO模式以及相关配置
- 3. 封装GPIO初始化结构体
- 4. 使用自己的封装配置GPIO
一、使用C语言封装GPIO函数
1. 封装GPIO组寄存器
#define GPIOA ((GPIO_TypeDef *) 0x50002000)
#define GPIOB ((GPIO_TypeDef *) 0x50003000)
#define GPIOC ((GPIO_TypeDef *) 0x50004000)
#define GPIOD ((GPIO_TypeDef *) 0x50005000)
#define GPIOE ((GPIO_TypeDef *) 0x50006000)
#define GPIOF ((GPIO_TypeDef *) 0x50007000)
#define GPIOG ((GPIO_TypeDef *) 0x50008000)
#define GPIOH ((GPIO_TypeDef *) 0x50009000)
#define GPIOI ((GPIO_TypeDef *) 0x5000A000)
#define GPIOJ ((GPIO_TypeDef *) 0x5000B000)
#define GPIOK ((GPIO_TypeDef *) 0x5000C000)
2. 封装GPIO模式以及相关配置
使用枚举封装
/*GPIO模式*/
typedef enum
{
GPIO_Mode_IN = 0, //输入
GPIO_Mode_OUT, //输出
GPIO_Mode_AF, //复用
GPIO_Mode_AN //模拟
}GPIOMode_TypeDef;
/*GPIO引脚速度*/
typedef enum
{
GPIO_Low_Speed = 0, //低速
GPIO_Medium_Speed, //中速
GPIO_Fast_Speed, //快速
GPIO_High_Speed //高速
}GPIOSpeed_TypeDef;
/*GPIO输出模式*/
typedef enum
{
GPIO_OType_PP = 0, //推挽
GPIO_OType_OD, //开漏
}GPIOOType_TypeDef;
/*GPIO上下拉设置*/
typedef enum
{
GPIO_PuPd_NOPULL = 0, //推挽
GPIO_PuPd_UP, //上拉
GPIO_PuPd_DOWN, //下拉
}GPIOPuPd_TypeDef;
3. 封装GPIO初始化结构体
typedef struct
{
unsigned int MODER;
unsigned int OTYPER;
unsigned int OSPEEDR;
unsigned int PUPDR;
unsigned int IDR;
unsigned int ODR;
}GPIO_TypeDef;
typedef struct
{
unsigned int GPIO_Pin; // Pin脚
GPIOMode_TypeDef GPIO_Mode; //模式
GPIOSpeed_TypeDef GPIO_Speed; //速度
GPIOOType_TypeDef GPIO_OType; //输出模式
GPIOPuPd_TypeDef GPIO_PuPd; //上下拉
}GPIO_InitTypeDef;
4. 使用自己的封装配置GPIO
void GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_init)
{
/*初始化GPIOE模式*/
GPIOx->MODER &= ~(0x3 << (GPIO_init->GPIO_Pin*2));
GPIOx->MODER |= GPIO_init->GPIO_Mode << (GPIO_init->GPIO_Pin*2);
/*初始化GPIOE输出模式*/
GPIOx->OTYPER &= ~(GPIO_init->GPIO_OType << GPIO_init->GPIO_Pin);
/*初始化GPIOE速度*/
GPIOx->OSPEEDR &= ~(0x3 << (GPIO_init->GPIO_Pin*2));
GPIOx->OSPEEDR |= GPIO_init->GPIO_Speed << (GPIO_init->GPIO_Pin*2);
/*初始化GPIOE上下拉设置*/
GPIOx->PUPDR &= ~(0x3 << (GPIO_init->GPIO_Pin*2));
GPIOx->PUPDR |= GPIO_init->GPIO_PuPd << (GPIO_init->GPIO_Pin*2);
}
/*LED控制*/
#define ledE_on(x) GPIOE->ODR |= 0x1 << x
#define ledE_off(x) GPIOE->ODR &= ~(0x1 << x)
#define ledF_on(x) GPIOF->ODR |= 0x1 << x
#define ledF_off(x) GPIOF->ODR &= ~(0x1 << x)
void delay_ms(int ms)
{
int i,j;
for(i = 0; i < ms;i++)
for (j = 0; j < 1800; j++);
}
int main()
{
RCC_MP_AHB4_ENSETR |= (0x3 << 4);
/*GPIO初始化*/
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = 10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Low_Speed;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOE, &GPIO_InitStructure);
while(1)
{
ledE_on(8);
ledE_on(10);
ledF_on(10);
delay_ms(500);
ledE_off(8);
ledE_off(10);
ledF_off(10);
delay_ms(500);
}
return 0;
}