控制GPIO输出点GPIO相关寄存器亮LED灯
#
具体编程:
新建工程并设置好环境,添加c文件,键入如下程序:
//**********************************************
//* 通过直接操作存储器控制GPIO输出点亮LED灯 *
//* LED1=GPIOC_Pin6; *
//* LED2=GPIOC_Pin7; *
//* LED3=GPIOC_Pin8; *
//* LED4=GPIOC_Pin9; *
//* —————————Sah_Pah————————- *
//**********************************************
#include
//定义各寄存器地址
#define GPIOC_CRL (* (volatile unsigned long *)(0x40011000))
#define GPIOC_CRH (* (volatile unsigned long *)(0x40011004))
#define GPIOC_ODR (* (volatile unsigned long *)(0x4001100C))
#define GPIOC_BSRR (* (volatile unsigned long *)(0x40011010))
#define GPIOC_BRR (* (volatile unsigned long *)(0x40011014))
#define RCC_APB2ENR (*(volatile unsigned long *)(0x40021018))
//设置GPIOC_Pin6,Pin7,Pin8,Pin9为推挽输出模式,最大速度50MHz
#define _GPIOC_CRL 0x33000000
#define _GPIOC_CRH 0x00000033
void delay(void);
void main(void)
{
volatile int i;
//使能APB2的PORTC时钟
RCC_APB2ENR |=(1<<4);
//设置GPIOC_Pin6,Pin7,Pin8,Pin9为推挽输出模式,最大速度50MHz
GPIOC_CRL = _GPIOC_CRL;
GPIOC_CRH = _GPIOC_CRH;
while(1)
{
delay();
//利用端口位复位寄存器BRR清除GPIOC各端口的ODR位为0
GPIOC\_BRR=0xFFFF;
delay();
//利用端口位设置/复位寄存器BSRR将P6、P7、P8、P9口置1,点亮LED灯
GPIOC\_BSRR=0x000003C0;
delay();
//重复三次,偷懒就不写循环了
GPIOC\_BRR=0xFFFF;
delay();
GPIOC\_BSRR=0x000003C0;
delay();
GPIOC\_BRR=0xFFFF;
delay();
GPIOC\_BSRR=0x000003C0;
delay();
GPIOC\_BRR=0xFFFF;
//利用端口输出数据寄存器ODR进行流水灯循环
for(i=0;i<3;i++)
\{
//P6脚置1
GPIOC\_ODR=0x0040;
delay();
//清0
GPIOC\_ODR=0x0000;
//P7脚置1
GPIOC\_ODR=0x0080;
delay();
GPIOC\_ODR=0x0000;
//P8脚置1
GPIOC\_ODR=0x0100;
delay();
GPIOC\_ODR=0x0000;
//P9脚置1
GPIOC\_ODR=0x0200;
delay();
\}
}
}
//定义延迟函数
void delay(void)
{
unsigned long j,n=100000;
while(n—)
{
j=12;
while(j—);
}
}
最终结果:
保存编译后,将程序烧写到开发板上,板上四个LED等闪烁三次后以流水灯形式循环三次。
还没有评论,来说两句吧...