你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32学习笔记——点亮LED

[复制链接]
STMCU小助手 发布时间:2022-1-17 20:24
本人学习STM32是直接通过操作stm32的寄存器,使用的开发板是野火ISO-V2版本;
先简单的介绍一下stm32的GPIO;
stm32的GPIO有多种模式:
  1.输入浮空
  2.输入上拉
  3.输入下拉
  4.模拟输入
  5.开漏输出
  6.推挽式输出
  7.推挽式复用功能
  8.开漏复用功能
stm32GPIO模式设置相关寄存器设置的介绍


1015113-20160913172903180-1111627856.png

stm32中文参考手册中对GPIO模式设置对应寄存器的详细介绍:

1015113-20160913180331586-1126379600.png

1015113-20160913180402930-213428021.png

下图为开发板LED的接线图;


1015113-20160913173326258-2131728542.png

根据上面的电路图可知,将GPIOB_0,GPIOF_7和GPIOF_8设置为低电平时,LED将被点亮;
程序代码:
LED.h 文件
  1. #ifndef __LED_H
  2. #define __LED_H

  3. void GPIO_Init(void);




  4. #endif
复制代码

stm32.h 文件

  1. #ifndef __STM32_H
  2. #define __STM32_H

  3. //引脚寄存器定义

  4. //GPIO对应寄存器起始地址

  5. #define GPIOA 0x40010800
  6. #define GPIOB 0x40010C00
  7. #define GPIOC 0x40011000
  8. #define GPIOD 0x40011400
  9. #define GPIOE 0x40011800
  10. #define GPIOF 0x40011C00
  11. #define GPIOG 0x40012000

  12. //寄存器偏移地址

  13. #define GPIOx_CRL 0x00
  14. #define GPIOx_CRH 0x04
  15. #define GPIOx_IDR 0x08
  16. #define GPIOx_ODR 0x0c
  17. #define GPIOx_BSRR 0x10
  18. #define GPIOx_BRR 0x14
  19. #define GPIOx_LCKR 0x18



  20. #define GPIOB_CRL *((volatile unsigned int *)(GPIOB + GPIOx_CRL))
  21. #define GPIOB_CRH *((volatile unsigned int *)(GPIOB + GPIOx_CRH))
  22. #define GPIOB_IDR *((volatile unsigned int *)(GPIOB + GPIOx_IDR))
  23. #define GPIOB_ODR *((volatile unsigned int *)(GPIOB + GPIOx_ODR))
  24. #define GPIOB_BSRR *((volatile unsigned int *)(GPIOB + GPIOx_BSRR))
  25. #define GPIOB_BRR *((volatile unsigned int *)(GPIOB + GPIOx_BRR))
  26. #define GPIOB_LCKR *((volatile unsigned int *)(GPIOB + GPIOx_LCKR))



  27. #define GPIOF_CRL *((volatile unsigned int *)(GPIOF + GPIOx_CRL))
  28. #define GPIOF_CRH *((volatile unsigned int *)(GPIOF + GPIOx_CRH))
  29. #define GPIOF_IDR *((volatile unsigned int *)(GPIOF + GPIOx_IDR))
  30. #define GPIOF_ODR *((volatile unsigned int *)(GPIOF + GPIOx_ODR))
  31. #define GPIOF_BSRR *((volatile unsigned int *)(GPIOF + GPIOx_BSRR))
  32. #define GPIOF_BRR *((volatile unsigned int *)(GPIOF + GPIOx_BRR))
  33. #define GPIOF_LCKR *((volatile unsigned int *)(GPIOF + GPIOx_LCKR))


  34. #endif
复制代码

LED.c 文件
  1. #include "LED.h"
  2. #include "stm32.h"

  3. void delay(unsigned int x)
  4. {
  5.   volatile int i, j;
  6.   for(i = 0; i < x; i++)
  7.   {
  8.     for(j = 0; j < 1000; j++);
  9.   }
  10. }

  11. void GPIO_Init(void)
  12. {
  13.   //使能GPIOB和GPIOF的时钟
  14.   RCC_APB2ENR |= 1 << 3;
  15.   RCC_APB2ENR |= 1 << 7;

  16.   //清除GPIOB和GPIOF的配置寄存器
  17.   GPIOB_CRL &= ~(0xf << 0);
  18.   GPIOF_CRL &= ~(0xf << 0);
  19.   GPIOF_CRH &= ~(0xf << 0);

  20.   //配置GPIOB和GPIOF的端口为通用推挽输出,输出速度为50HZ
  21.   GPIOB_CRL |= 3 << 0;
  22.   GPIOF_CRL |= 3 << 28;
  23.   GPIOF_CRH |= 3 << 0;

  24.   //设置GPIOB_0和GPIOF_7和GPIOF_8输出为高电平
  25.   GPIOB_ODR |= 1 << 0;
  26.   GPIOF_ODR |= 3 << 7;
  27. }

  28. int main(void)
  29. {
  30.   GPIO_Init();

  31.   GPIOB_ODR &= ~(1 << 0); //设置GPIOB_0端口输出为低电平
  32.   GPIOF_ODR &= ~(3 << 7); //设置GPIOF_7和GPIOF_8输出为低电平
  33.   while(1)
  34.   {
  35.     GPIOB_ODR &= ~(1 << 0); //设置GPIOB_0端口输出为低电平
  36.     GPIOF_ODR |= 3 << 7; //设置GPIOF_7和GPIOF_8输出为高电平
  37.     delay(100);

  38.     GPIOB_ODR |= 1 << 0; //设置GPIOB_0端口输出为高电平
  39.     GPIOF_ODR &= ~(1 << 7); //设置GPIOF_7输出为低电平
  40.     delay(100);

  41.     GPIOF_ODR &= ~(1 << 8); //设置GPIOF_7输出为高电平
  42.     GPIOF_ODR |= 1 << 7; //设置GPIOF_8输出为低电平
  43.     delay(100);
  44.   }

  45. }
复制代码


程序将实现流水灯的效果;
在使用GPIO时一定要将相应GPIO的时钟开启;

收藏 评论0 发布时间:2022-1-17 20:24

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版