跑马灯实验——学会怎样输出)
一个技巧:使用函数时,若不清楚参数,可以先编译,然后“go to 。。。definition”找到它在头文件里面的位置,里面就会有详细的参数说明了。
以下相关内容还要配合新建工程模板–基于寄存器这一章节来看
推挽输出可以输出强高低电平,连接数字器件
一、首先,
操作IO口必须引入源文件和头文件
源文件:stm32f10x_gpio.c
头文件:stm32f10x_gpio.h
CPIO库 重要函数:
1个初始化函数:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
初始化一个或者多个IO口(同一组)的工作方式和速度。该函数主要是操作GPIO_CRL(CRH)寄存器,在上拉或者下拉的时候有设置BSRR或者BRR寄存器
首先,GPIO_InitTypeDef* GPIO_InitStruct的定义如下:
typedef struct
{
uint16_t GPIO_Pin; //指定要初始化的IO口
GPIOSpeed_TypeDef GPIO_Speed; //设置IO口输出速度
GPIOMode_TypeDef GPIO_Mode; //设置工作模式:8种中的一个
}GPIO_InitTypeDef;
使用示例:
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5
其中,
GPIO_PIN_x 中的 IO口x 预定义的有0~15和ALL。GPIOx对应的是Px端口
GPIO_SPEED_x 中的 速度x 预定义有10、20、50MHz
GPIO_Mode_x 中的 模式x 预定义有8种:
AIN:模拟输入 0x00
IN_FLOATING:浮空输入 0x04
IPD:下拉 0x28
IPU:上拉 0x48
OUT_OD: 0x14
OUT_PP:推挽输出 0x10
AF_OD: 0x1C
AF_PP: 0x18
2个读取输入电平函数:
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
例如:
GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);//读取GPIOA.5的输入电平
2个读取输出电平函数:
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
4个设置输出电平函数:(重点:SetBits,ResetBits)
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
(操作BSRR寄存器,16位)
作用:设置某个IO口输出为高电平(1)。实际操作BSRR寄存器
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
(操作BRR寄存器,16位)
作用:设置某个IO口输出为低电平(0)。实际操作的BRR寄存器。
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
二、使用
使用之前要先使能(enable,允许)时钟
调用函数RCC_APB2PeriphColckCmd(RCC_APB2Periph_x);
mini板初始化的是PA5和PD2端口的时钟
如果想要一个一个功能函数地去用,那就应该这样(类似于C)
例如:想要建立一个初始化LED的函数LED_Init(),让他可以直接在main函数里面使用
首先应该建立一个头文件led.h
led.h
#ifndef __LED_H
#define __LED_H //这两个和C的宏定义同理,
//__LED_H这个名字随便改都行,不一定要和文件名字一样
void LED_Init(void); //要自定义的函数
#endif
led.c
#include "led.h"
#include "stm32f10x.h"
void LED_Init(void){
//这里写函数的具体内容
}
主函数main.c
#include "stm32f10x.h"
#include "led.h"
int main(void){
//主函数其他内容
LED_Init();
//主函数其他内容
}