-
说明
(1)这里我分配的管脚号:PC2、PC3
(2)测试电路实物电路图
实验名称:GPIO实验
实验目的:用PC2、PC3管脚交替点亮两个LED灯
实验内容:封装成指令,设计程序,完成两个LED 灯交替点亮。
实验方法:通过写指令,设计程序来调控寄存器的值从而控制管脚的输出。
实验分析:
-
配置管脚
- 使能GPIOC时钟
寄存器:RCC->AHB1ENR
需要修改内容:bit2置1
指令:RCC->AHB1ENR |=0x1<<2;//使能时钟
(RCC->AHB1ENR与0x100的或运算,即将bit2置1)
- PC2、3为输出模式
寄存器:GPIOC->MODER
需要修改内容:bit4、5和6、7分别置01
指令:GPIOC->MODER =(GPIOC->MODER&~(0xF<<4))|(0x5<<4);//输出模式
(清零:先将MODER与0x00001111进行与运算,即清零
置01:再讲MODER与0x01010000进行或运算,即值01)
- PC2、3为推挽模式
寄存器:GPIOC->OTYPER
需要修改内容:bit2、3置0
指令:GPIOC->OTYPER&=~(0x3<<2);//推挽输出
- PC2、3为高速
寄存器:GPIOC->OSPEEDR
需要修改内容:bit4、5和6、7分别置10
指令:GPIOC->OSPEEDR=(GPIOC->OSPEEDR&~(0xF<<4))|(0xC<<4);//高速
- PC2输出为低,PC3输出为高
寄存器:GPIOC->ODR
需要修改内容:bit2置0,bit3置1
指令:GPIOC->ODR = GPIOC->ODR&~(0x3<<2)|(0x1<<3);
6.PC2输出为高,PC3输出为低
寄存器:GPIOC->ODR
需要修改内容:bit2置1,bit3置0
指令:GPIOC->ODR = GPIOC->ODR&~(0x3<<2)|(0x1<<2);
-
函数化
初始化函数
void Ledlnit(void)
{
RCC->AHB1ENR |=0x1<<2;//使能时钟
GPIOC->MODER =(GPIOC->MODER&~(0xF<<4))|(0x5<<4);//输出模式
GPIOC->OTYPER&=~(0x3<<2);//推挽输出
GPIOC->OSPEEDR=(GPIOC->OSPEEDR&~(0xF<<4))|(0xC<<4);//高速
GPIOC->ODR |=0x3<<2;
}
延时1s函数
void Delay(void)
{
unsigned int i;
for(i=4000000;i>0;i--);
}
控制灯亮灭函数
void LedFlash(int on)
{
if(on)
GPIOC->ODR = GPIOC->ODR&~(0x3<<2)|(0x1<<3);
else
GPIOC->ODR = GPIOC->ODR&~(0x3<<2)|(0x1<<2);
}
这里若on为1,则PC3输出为高、PC2输出为低
若on为0,反之。
-
程序设计
#include "stm32f4xx.h"
void Ledlnit(void)
{
RCC->AHB1ENR |=0x1<<2;//使能时钟
GPIOC->MODER =(GPIOC->MODER&~(0xF<<4))|(0x5<<4);//输出模式
GPIOC->OTYPER&=~(0x3<<2);//推挽输出
GPIOC->OSPEEDR=(GPIOC->OSPEEDR&~(0xF<<4))|(0xC<<4);//高速
GPIOC->ODR |=0x3<<2;
}
void LedFlash(int on)
{
if(on)
GPIOC->ODR = GPIOC->ODR&~(0x3<<2)|(0x1<<3);//GPIOC->ODR|=(0x1<<2); //breathe
else
GPIOC->ODR = GPIOC->ODR&~(0x3<<2)|(0x1<<2);//GPIOC->ODR&=~(0x1<<2);
}
void Delay(void)
{
unsigned int i;
for(i=4000000;i>0;i--);
}
int main()
{
Ledlnit();
while(1)
{
LedFlash(1);
Delay();
LedFlash(0);
Delay();
}
return 0;
}
至此就完成了GPIO交替点亮LED灯的实验啦!