库函数编程 -- 标准库
1. 库函数讲解
标准库是官方将对外设的寄存器操作封装成函数
配置步骤:
1.配置总线时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB
| RCC_APB2Periph_SPI1, ENABLE);
2.定义GPIO的参数结构体:
GPIO_InitTypeDef GPIO_InitStructure;
3.分别用来确定IO口的具体管脚、输出模式下的速度、引脚的模式:
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
引脚参数可选:
速度参数可选:
模式参数可选:
控制IO口输出高低电平的库函数 :
GPIO_SetBits(GPIOE, GPIO_Pin_3 ); //设置PE3的数据端口位
GPIO_ResetBits(GPIOE, GPIO_Pin_3); //清除PE3的数据端口位
读取IO口状态的库函数:IDR
ReadValue =GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7); //读取PB7的输入
返回值就是IO的电平状态
2. 库函数的简单应用
2.1 使用库函数点亮流水灯
首先通过原理图观察流水灯引脚与单片机开发板如何连接
经原理图观察得出:LED1、LED2、LED3、LED4分别与单片机的PE2、PE3、PE4、PE5连接
单片机实现延时原理:
NOP():单片机在执行NOP指令时,什么也不做,等待一个指令周期
主频为72Mhz 所以等待1个指令周期的时间为 1/72M s= 1/72000 ms = 1/72 us
延时1us 72个NOP
延时1ms 72000个NOP
编写程序代码:
延时函数头文件 delay.h
#ifndef __DELAY_H
#define __DELAY_H
#include "stm32f10x.h"
void Delay_1us(void);
void Delay_nus(uint32_t Time);
void Delay_nms(uint32_t Time);
#endif
延时函数 delay.c
#include "delay.h"
void Delay_1us(void)
{
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
}
void Delay_nus(uint32_t Time)
{
while(Time--)
{
Delay_1us();
}
}
void Delay_nms(uint32_t Time)
{
while(Time--)
{
Delay_nus(1000);//延时1ms
}
}
LED灯头文件 led.h
#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h"
#define LED_1ON() GPIO_ResetBits(GPIOE, GPIO_Pin_2); //开LED1 给PE2低电平信号
#define LED_1OFF() GPIO_SetBits(GPIOE, GPIO_Pin_2); //关LED1 给PE2高电平信号
#define LED_2ON() GPIO_ResetBits(GPIOE, GPIO_Pin_3); //开LED2 给PE3低电平信号
#define LED_2OFF() GPIO_SetBits(GPIOE, GPIO_Pin_3); //关LED2 给PE3高电平信号
#define LED_3ON() GPIO_ResetBits(GPIOE, GPIO_Pin_4); //开LED3 给PE4低电平信号
#define LED_3OFF() GPIO_SetBits(GPIOE, GPIO_Pin_4); //关LED3 给PE4高电平信号
#define LED_4ON() GPIO_ResetBits(GPIOE, GPIO_Pin_5); //开LED4 给PE5低电平信号
#define LED_4OFF() GPIO_SetBits(GPIOE, GPIO_Pin_5); //关LED4 给PE5高电平信号
#define LED_1Toggle() GPIOE->ODR ^=1<<2; //翻转LED1
#define LED_2Toggle() GPIOE->ODR ^=1<<3; //翻转LED2
#define LED_3Toggle() GPIOE->ODR ^=1<<4; //翻转LED3
#define LED_4Toggle() GPIOE->ODR ^=1<<5; //翻转LED4
void LED_Config(void);
#endif
注:宏定义中 LED_xToggle 将在按键控制LED灯亮灭中使用。
LED灯 led.c
#include "led.h"
void LED_Config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE , ENABLE); //配置APB2总线时钟
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 |GPIO_Pin_3 |GPIO_Pin_4 |GPIO_Pin_5; //初始化PE2345引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //最高输出速率 10MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //推挽输出模式
GPIO_Init(GPIOE, &GPIO_InitStructure);
}
主函数 man.c
#include "delay.h"
#include "led.h"
int main(void)
{
LED_Config(); //调用LED配置函数
while (1)
{
LED_1ON();
Delay_nms(50); //调用延时函数
LED_1OFF();
Delay_nms(50);
LED_2ON();
Delay_nms(50);
LED_2OFF();
Delay_nms(50);
LED_3ON();
Delay_nms(50);
LED_3OFF();
Delay_nms(50);
LED_4ON();
Delay_nms(50);
LED_4OFF();
Delay_nms(50);
}
}
2.2 使用库函数实现独立按键控制各LED亮灭
同样先通过原理图观察按键引脚与单片机开发板如何连接
经原理图观察得出:KEY1、KEY2、KEY3、KEY4分别与单片机的PA0、PC4、PC5、PC6连接
按键电路分析:
当按键KEY1被按下时会输出一个高电平信号;
KEY2、KEY3、KEY4被按下时会输出一个低电平
编写程序代码:
按键头文件 key.h
#ifndef __KEY_H
#define __KEY_H
#include "stm32f10x.h"
void KEY_Config(void);
#endif
按键 key.c
#include "key.h"
void KEY_Config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOC, ENABLE);
//配置APB2总线时钟
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //最高输出速率 10MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //初始化PA0引脚
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 |GPIO_Pin_5 |GPIO_Pin_6; //初始化PC456引脚
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
主函数 main.c
#include "delay.h"
#include "led.h"
#include "key.h"
int main(void)
{
KEY_Config();
LED_Config();
while (1)
{
//KEY1控制LED1亮灭
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==1)
{
Delay_nms(20); //消抖
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==1)
{
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==1);//消抖
LED_1Toggle();
}
}
//KEY2控制LED2亮灭
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_4)==0)
{
Delay_nms(20);
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_4)==0)
{
while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_4)==0);
LED_2Toggle();
}
}
//KEY3控制LED3亮灭
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5)==0)
{
Delay_nms(20);
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5)==0)
{
while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5)==0);
LED_3Toggle();
}
}
//KEY4控制LED4亮灭
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6)==0)
{
Delay_nms(20);
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6)==0)
{
while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6)==0);
LED_4Toggle();
}
}
}
}
(感谢阅读! 此文章为本人学习总结, 如有错误 ,欢迎指教 )