① GPIO ( 通用 I/O引脚 )
STM32F429IGT6 共有176个引脚,其中144个引脚可被用于 GPIO;
分为9组,为 A ~ I;每组15个引脚,从0 ~ 15;
即:A0 ~ A15 —— I0 ~ I15;
② GPIO的输入 / 输出
(1)输出方式:
a、推挽输出:两个MOS管同时工作且状态相反,可以加快 导通 / 截止 的速度;
b、开漏输出:只有N-MOS工作,无高电平输出,可以使用一个上拉电阻提供高电平;
(2)输入方式:
a、模拟信号输入;
b、数字信号输入:通过施密特触发器,可以加快边沿变化速度;
③ .c — >可执行文件的过程
预处理 — > 编译(.c — > .s)— >汇编(.s — > .o)— >链接(提取多个.o文件中被使用的内容)— >生成可执行文件(.exe / .elf / .bin / .hex)
④ 可执行文件的构成
Flash:
a、.bss(可优化段):存放未被使用的数据;
b、.data(数据段):存放地址,全局变量,常量,静态变量等;
c、.code(代码段);
SRAM(存放临时数据):
a、创建栈空间,地址指向首地址;
b、创建堆空间,地址指向末地址;
⑤ 任务 — 控制PH10(低电平点亮,高电平熄灭)
程序流程:
a、硬件初始化
(1)时钟源打开:通过RCC打开GPIO_H时钟源,RCC首地址0x40023800;
(2)外设初始化:
设置PH10为:
输出:GPIOH_MODER = 0x100000,偏移0x00;
推挽:GPIOH_OTYPER = 0x00,偏移0x04;
低速:GPIOH_SPEEDER = 0x00,偏移0x08;
上拉:GPIOH_PUPDR = 0x100000,偏移0x0C;
设置端口输出寄存器为:
高电平:GPIOH_ODR = 0x400,偏移0x14;
低电平:GPIOH_ODR = 0x00,偏移0x14;
⑥ 成果:七色灯,灯与蜂鸣器同时工作
源代码:
#include<stdio.h>
#define Time_Delay 3000
#define RCC_ADDR 0x40023800
#define RCC_AHB1ENR *((unsigned int *)(RCC_ADDR+0x30))
#define GPIOH_ADDR 0x40021C00
#define GPIOH_MODER *((unsigned int *)(GPIOH_ADDR + 0x00))
#define GPIOH_OTYPER *((unsigned int *)(GPIOH_ADDR + 0x04))
#define GPIOH_OSPEEDER *((unsigned int *)(GPIOH_ADDR + 0x08))
#define GPIOH_PUPDR *((unsigned int *)(GPIOH_ADDR + 0x0C))
#define GPIOH_ODR *((unsigned int *)(GPIOH_ADDR + 0x14))
#define GPIOI_ADDR 0x40022000
#define GPIOI_MODER *((unsigned int *)(GPIOI_ADDR + 0x00))
#define GPIOI_OTYPER *((unsigned int *)(GPIOI_ADDR + 0x04))
#define GPIOI_OSPEEDER *((unsigned int *)(GPIOI_ADDR + 0x08))
#define GPIOI_PUPDR *((unsigned int *)(GPIOI_ADDR + 0x0C))
#define GPIOI_ODR *((unsigned int *)(GPIOI_ADDR + 0x14))
void SystemInit(void)
{
}
void delay(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<1000;j++);
}
void Beep()
{
GPIOI_MODER = 0x400000;
GPIOI_OTYPER = 0x00;
GPIOI_PUPDR = 0x400000;
GPIOI_OSPEEDER = 0x00;
GPIOI_ODR = 0x800;
delay(Time_Delay);
GPIOI_ODR = 0x00;
}
void Red()
{
GPIOH_MODER = 0x100000; //Êä³ö
GPIOH_OTYPER = 0x00; //ÍÆÍì
GPIOH_PUPDR = 0x100000; //ÉÏÀ
GPIOH_OSPEEDER = 0x00; //µÍËÙ
GPIOH_ODR = 0x00; //µÍ
Beep();
GPIOH_ODR = 0x400; //¸ß
delay(Time_Delay);
}
void Yellow()
{
GPIOH_MODER = 0x500000;
GPIOH_OTYPER = 0x00;
GPIOH_PUPDR = 0x500000;
GPIOH_OSPEEDER = 0x00;
GPIOH_ODR = 0x00;
Beep();
GPIOH_ODR = 0xC00;
delay(Time_Delay);
}
void Green()
{
GPIOH_MODER = 0x400000;
GPIOH_OTYPER = 0x00;
GPIOH_PUPDR = 0x400000;
GPIOH_OSPEEDER = 0x00;
GPIOH_ODR = 0x00;
Beep();
GPIOH_ODR = 0x800;
delay(Time_Delay);
}
void Cyan()
{
GPIOH_MODER = 0x1400000;
GPIOH_OTYPER = 0x00;
GPIOH_PUPDR = 0x1400000;
GPIOH_OSPEEDER = 0x00;
GPIOH_ODR = 0x00;
Beep();
GPIOH_ODR = 0x1800;
delay(Time_Delay);
}
void Blue()
{
GPIOH_MODER = 0x1000000;
GPIOH_OTYPER = 0x00;
GPIOH_PUPDR = 0x1000000;
GPIOH_OSPEEDER = 0x00;
GPIOH_ODR = 0x00;
Beep();
GPIOH_ODR = 0x1000;
delay(Time_Delay);
}
void Purple()
{
GPIOH_MODER = 0x1100000;
GPIOH_OTYPER = 0x00;
GPIOH_PUPDR = 0x1100000;
GPIOH_OSPEEDER = 0x00;
GPIOH_ODR = 0x00;
Beep();
GPIOH_ODR = 0x1400;
delay(Time_Delay);
}
void White()
{
GPIOH_MODER = 0x1500000;
GPIOH_OTYPER = 0x00;
GPIOH_PUPDR = 0x1500000;
GPIOH_OSPEEDER = 0x00;
GPIOH_ODR = 0x00;
Beep();
GPIOH_ODR = 0x1C00;
delay(Time_Delay);
}
int main(void)
{
//ʹÄÜʱÖÓÔ´
RCC_AHB1ENR = 0x100180;
//ÅäÖÃ
while(1)
{
//red
Red();
//yellow
Yellow();
//green
Green();
//cyan
Cyan();
//blue
Blue();
//purple
Purple();
//white
White();
}
}