目录
一、GPIO介绍
二、基于固件库(Library Faction)的流水灯
三、基于固件库(Library Faction)的静态数码管
一、GPIO介绍
GPIO库函数,对GPIO可进行一些,读写控制的操作,本文章应用的就是GPIO_Write
GPIO接在APB2(高速总线)上,
AHB/APB桥(APB) 两个AHB/APB桥在AHB和2个APB总线间提供同步连接。APB1操作速度限于36MHz,APB2操 作于全速(最高72MHz)。 有关连接到每个桥的不同外设的地址映射请参考表1。在每一次复位以后,所有除SRAM和 FLITF以外的外设都被关闭,在使用一个外设之前,必须设置寄存器RCC_AHBENR来打开该外 设的时钟。
注意: 当对APB寄存器进行8位或者16位访问时,该访问会被自动转换成32位的访问:桥会自动将8位 或者32位的数据扩展以配合32位的向量。
每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存 器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。
根据数据手册中列出的每个I/O端口的特定硬件特征, GPIO端口的每个位可以由软件分别配置 成多种模式。
─ 输入浮空
─ 输入上拉
─ 输入下拉
─ 模拟输入
─ 开漏输出
─ 推挽式输出
─ 推挽式复用功能
─ 开漏复用功能
每个I/O端口位可以自由编程,然而I/0端口寄存器必须按32位字被访问(不允许半字或字节访 问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器的读/更改的独立访问;这 样,在读和更改访问之间产生IRQ时不会发生危险。
二、基于固件库(Library Faction)的流水灯
文件的搭建请参照使用MDK-ARM(KEIL V5)创建一个工程(有图有文字)_可乐CC+的博客-CSDN博客
main.c
#include "stm32f10x.h"
#include <flowingwater.h>
void Delayms(uint32_t i)
{
while(i--);
}
int main()
{
int i;
LED_Init();
while(1)
{
// GPIO_SetBits(LED_GPIO_PORT,LED_GPIO_PIN);//8个led同时亮、灭
// Delayms(0xa00000);
// GPIO_ResetBits(LED_GPIO_PORT,LED_GPIO_PIN);
// Delayms(0xa00000);
for(i=0;i<8;i++)
{
// GPIO_Write(LED_GPIO_PORT,0Xfffffe<<i);//8个灯依次点亮,不熄灭
GPIO_Write(LED_GPIO_PORT,~(0x000001<<i));//八个灯依次点亮,前一个熄灭
Delayms(0xa00000);
}
}
}
flowing water.h
#ifndef _FLOWINGWATER_H_
#define _FLOWINGWATER_H_
#include <stm32f10x.h>
#define LED_GPIO_PORT GPIOC
#define LED_GPIO_PIN (GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7)
void LED_Init(void);
#endif
flowing water.c
#include <flowingwater.h>
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStruct.GPIO_Pin = LED_GPIO_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(LED_GPIO_PORT,&GPIO_InitStruct);
}
1-初始化所需要使用的引脚,如果使用的多,可以用“|”进行合并,写在一起。
2-根据需求,对gpio口进行驱动。
三、基于固件库(Library Faction)的静态数码管
编写静态数码管只需要在原来的基础上添加一个数组。
#include "stm32f10x.h"
#include <flowingwater.h>
uint16_t table[16]={0xffc0, 0xf9, 0xa4, 0xb0,0x99,0x92,0x82,0xf8, 0x80 ,0x90 ,0x88,0x83,0xc6 ,0xa1,0x86,0x8e};
void Delayms(uint32_t i)
{
while(i--);
}
int main()
{
int i;
LED_Init();
while(1)
{
// GPIO_SetBits(LED_GPIO_PORT,LED_GPIO_PIN);//8
// Delayms(0xa00000);
// GPIO_ResetBits(LED_GPIO_PORT,LED_GPIO_PIN);
// Delayms(0xa00000);
for(i=0;i<16;i++)
{
// GPIO_Write(LED_GPIO_PORT,0Xfffffe<<i);
// GPIO_Write(LED_GPIO_PORT,~(0x000001<<i));
GPIO_Write(LED_GPIO_PORT,table[i]);
Delayms(0xa00000);
GPIO_Write(LED_GPIO_PORT,0xffff);
}
}
}