下午安装好了keil3,编译了一下程序,下载OK,现在开始要正式开始学习了,历程里面有一个头文件。
例程很简单,如下:
#include "stm32f10x_lib.h"
int main(void)
{
while (1)
{
GPIO_AFIODeInit();
}
}
直接看头文件。会有资源的定义以及函数的定义。
这些东西在选芯片的时候,编译器会自动进行宏定义。
先从最简单的GPIO的头文件开始看:
先从最简单的端口GPIO来看:
头函数中有一个结构体:
typedef struct
{
__IO uint32_t CRL;
__IO uint32_t CRH;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
} GPIO_TypeDef;
对应手册中有如下的GPIO寄存器
其中CRL为端口配置寄存器低,其中包括了端口0~7的配置,每一个位配置,占用4位:
其中前两位:
CNF0在输入时,包括了三种配置功能:
模拟方式输入,浮置输入(复位状态),带上拉或者下拉的输入
如果为输出,普通的推挽输出,开漏输出,交替功能的推挽和开漏输出。
MODE配置包括:配置为输入,后面三个为输出模式,限制速度的设置,包括,2M,10M,50M
第二个寄存器,为高8~15脚的配置。
第三个为端口输入,共16个脚,数据共16位。
第四个为端口输出,同上。输出只能16位同时进行,如果要单独配置某位,则设置下面的寄存器。
第五个为复位或者置位某位的寄存器:前16位为复位,后为置位,置位优先。
第六个为复位端口寄存器,好像和上面寄存器有重复。
第七个为锁位寄存器,复位的时候才能清空。或者通过锁密码来进行修改。
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
初始化的函数.
使用的方法如下:
第一个参数:结构体,指向GPIOX的所有寄存器,在上面有定义。
第二个参数:结构体,定义如下:
typedef struct
{
u16 GPIO_Pin;
GPIOSpeed_TypeDef GPIO_Speed;
GPIOMode_TypeDef GPIO_Mode;
}GPIO_InitTypeDef;
如果要操作GPIOA,则先将选择端口为GPIOA,然后把后面的结构体填充好:
比如,GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
表示我要对A6~A9脚进行配置。然后设置模式,如下:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
模式一共有8种,在上面介绍过,枚举如下:
typedef enum
{ GPIO_Mode_AIN = 0x0,
GPIO_Mode_IN_FLOATING = 0x04,
GPIO_Mode_IPD = 0x28,
GPIO_Mode_IPU = 0x48,
GPIO_Mode_Out_OD = 0x14,
GPIO_Mode_Out_PP = 0x10,
GPIO_Mode_AF_OD = 0x1C,
GPIO_Mode_AF_PP = 0x18
}GPIOMode_TypeDef;
好,设置A6~A9脚为推挽输出,然后配置一下速度:
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
同样枚举出来,一共三种速度
typedef enum
{
GPIO_Speed_10MHz = 1,
GPIO_Speed_2MHz,
GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;
这样,结构体定义完毕,就可以进行初始化了:
GPIO_Init(GPIOA, &GPIO_InitStructure);
初始化后,A6~A9为推挽输出,速度限制为50M。
如果要给端口置电平,则用下面的函数:
GPIO_SetBits(GPIOA, GPIO_Pin_6);
然后置地,函数如下:
GPIO_ResetBits(GPIOA, GPIO_Pin_6);
东莞元宝代理Microchip长电二三极管 2015-6-26 11:17
806494566_654546512 2014-6-21 21:14
用户1759716 2014-5-27 12:45