控制GPIO输出点GPIO相关寄存器亮LED灯

左手的ㄟ右手 2022-08-19 11:17 257阅读 0赞

#

具体编程:

新建工程并设置好环境,添加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)

{

  1. delay();
  2. //利用端口位复位寄存器BRR清除GPIOC各端口的ODR位为0
  3. GPIOC\_BRR=0xFFFF;
  4. delay();
  5. //利用端口位设置/复位寄存器BSRR将P6、P7、P8、P9口置1,点亮LED灯
  6. GPIOC\_BSRR=0x000003C0;
  7. delay();
  8. //重复三次,偷懒就不写循环了
  9. GPIOC\_BRR=0xFFFF;
  10. delay();
  11. GPIOC\_BSRR=0x000003C0;
  12. delay();
  13. GPIOC\_BRR=0xFFFF;
  14. delay();
  15. GPIOC\_BSRR=0x000003C0;
  16. delay();
  17. GPIOC\_BRR=0xFFFF;
  18. //利用端口输出数据寄存器ODR进行流水灯循环
  19. for(i=0;i<3;i++)
  20. \{
  21. //P6脚置1
  22. GPIOC\_ODR=0x0040;
  23. delay();
  24. //清0
  25. GPIOC\_ODR=0x0000;
  26. //P7脚置1
  27. GPIOC\_ODR=0x0080;
  28. delay();
  29. GPIOC\_ODR=0x0000;
  30. //P8脚置1
  31. GPIOC\_ODR=0x0100;
  32. delay();
  33. GPIOC\_ODR=0x0000;
  34. //P9脚置1
  35. GPIOC\_ODR=0x0200;
  36. delay();
  37. \}

}

}

//定义延迟函数

void delay(void)

{

unsigned long j,n=100000;

while(n—)

{

j=12;

while(j—);

}

}

最终结果:

保存编译后,将程序烧写到开发板上,板上四个LED等闪烁三次后以流水灯形式循环三次。

发表评论

表情:
评论列表 (有 0 条评论,257人围观)

还没有评论,来说两句吧...

相关阅读