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

【经验分享】STM32F103标准库开发:LED跑马灯实验

[复制链接]
STMCU小助手 发布时间:2022-5-2 09:43
一、硬件电路分析
具体LED原理图如下图所示:

9{LW2BMPQD}NQ$[X2]2Y3SX.png

由LED原理图可知:
当单片机的引脚,PB14和PB15输出低电平的时候,LED1和LED2 亮 。
当单片机的引脚,PB14和PB15输出高电平的时候,LED1和LED2 灭。

二、LED灯GPIO配置
1. GPIO初始化配置

(1)使能GPIO时钟
APB2外设时钟启用和禁用函数

  1. /**
  2.   *@功能:启用和禁用APB2外设时钟
  3.   *@参数1:指定外围设备
  4.   *@参数2:指定外围设备状态
  5.   *@返回值:无
  6.   */
  7. void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
复制代码

APB2外设如下:

  1. #define RCC_APB2Periph_AFIO              ((uint32_t)0x00000001)
  2. #define RCC_APB2Periph_GPIOA             ((uint32_t)0x00000004)
  3. #define RCC_APB2Periph_GPIOB             ((uint32_t)0x00000008)
  4. #define RCC_APB2Periph_GPIOC             ((uint32_t)0x00000010)
  5. #define RCC_APB2Periph_GPIOD             ((uint32_t)0x00000020)
  6. #define RCC_APB2Periph_GPIOE             ((uint32_t)0x00000040)
  7. #define RCC_APB2Periph_GPIOF             ((uint32_t)0x00000080)
  8. #define RCC_APB2Periph_GPIOG             ((uint32_t)0x00000100)
  9. #define RCC_APB2Periph_ADC1              ((uint32_t)0x00000200)
  10. #define RCC_APB2Periph_ADC2              ((uint32_t)0x00000400)
  11. #define RCC_APB2Periph_TIM1              ((uint32_t)0x00000800)
  12. #define RCC_APB2Periph_SPI1              ((uint32_t)0x00001000)
  13. #define RCC_APB2Periph_TIM8              ((uint32_t)0x00002000)
  14. #define RCC_APB2Periph_USART1            ((uint32_t)0x00004000)
  15. #define RCC_APB2Periph_ADC3              ((uint32_t)0x00008000)
  16. #define RCC_APB2Periph_TIM15             ((uint32_t)0x00010000)
  17. #define RCC_APB2Periph_TIM16             ((uint32_t)0x00020000)
  18. #define RCC_APB2Periph_TIM17             ((uint32_t)0x00040000)
  19. #define RCC_APB2Periph_TIM9              ((uint32_t)0x00080000)
  20. #define RCC_APB2Periph_TIM10             ((uint32_t)0x00100000)
  21. #define RCC_APB2Periph_TIM11             ((uint32_t)0x00200000)
复制代码

本次配置如下:
  1. RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); // 使能PB端口时钟
复制代码

(2)GPIO初始化配置信息
工作模式可以参考:STM32F103:GPIO八种工作原理详解

GPIO初始化函数如下
  1. /**
  2.   *@功能:初始化GPIO外设
  3.   *@参数1:指定GPIO外设(GPIOA~GPIOG)
  4.   *@参数2:指定GPIO外设的配置信息
  5.   *@返回值:无
  6.   */
  7. void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
复制代码

GPIO_InitTypeDef----GPIO初始化配置信息:

  1. typedef struct
  2. {
  3.           uint16_t GPIO_Pin;             //指定要配置的GPIO引脚
  4.           GPIOSpeed_TypeDef GPIO_Speed;  //指定所选引脚的速度
  5.           GPIOMode_TypeDef GPIO_Mode;    //指定所选引脚的工作模式

  6. }GPIO_InitTypeDef;
复制代码

GPIO_Pin----指定要配置的GPIO引脚:

  1. #define GPIO_Pin_0                 ((uint16_t)0x0001)  /*!< Pin 0 selected */
  2. #define GPIO_Pin_1                 ((uint16_t)0x0002)  /*!< Pin 1 selected */
  3. #define GPIO_Pin_2                 ((uint16_t)0x0004)  /*!< Pin 2 selected */
  4. #define GPIO_Pin_3                 ((uint16_t)0x0008)  /*!< Pin 3 selected */
  5. #define GPIO_Pin_4                 ((uint16_t)0x0010)  /*!< Pin 4 selected */
  6. #define GPIO_Pin_5                 ((uint16_t)0x0020)  /*!< Pin 5 selected */
  7. #define GPIO_Pin_6                 ((uint16_t)0x0040)  /*!< Pin 6 selected */
  8. #define GPIO_Pin_7                 ((uint16_t)0x0080)  /*!< Pin 7 selected */
  9. #define GPIO_Pin_8                 ((uint16_t)0x0100)  /*!< Pin 8 selected */
  10. #define GPIO_Pin_9                 ((uint16_t)0x0200)  /*!< Pin 9 selected */
  11. #define GPIO_Pin_10                ((uint16_t)0x0400)  /*!< Pin 10 selected */
  12. #define GPIO_Pin_11                ((uint16_t)0x0800)  /*!< Pin 11 selected */
  13. #define GPIO_Pin_12                ((uint16_t)0x1000)  /*!< Pin 12 selected */
  14. #define GPIO_Pin_13                ((uint16_t)0x2000)  /*!< Pin 13 selected */
  15. #define GPIO_Pin_14                ((uint16_t)0x4000)  /*!< Pin 14 selected */
  16. #define GPIO_Pin_15                ((uint16_t)0x8000)  /*!< Pin 15 selected */
  17. #define GPIO_Pin_All               ((uint16_t)0xFFFF)  /*!< All pins selected */
复制代码

GPIO_Speed----指定所选引脚的速度:

  1. typedef enum
  2. {
  3.           GPIO_Speed_10MHz = 1,
  4.           GPIO_Speed_2MHz,
  5.           GPIO_Speed_50MHz

  6. }GPIOSpeed_TypeDef;
复制代码

GPIO_Mode----指定所选引脚的工作模式:

  1. typedef enum
  2. {
  3.         GPIO_Mode_AIN = 0x0,                        //模拟输入模式
  4.           GPIO_Mode_IN_FLOATING = 0x04,        //浮空输入模式
  5.           GPIO_Mode_IPD = 0x28,                        //下拉输入模式
  6.           GPIO_Mode_IPU = 0x48,                        //上拉输入模式
  7.           GPIO_Mode_Out_OD = 0x14,                //开漏输出模式
  8.           GPIO_Mode_Out_PP = 0x10,                //推挽输出模式
  9.           GPIO_Mode_AF_OD = 0x1C,                        //复用开漏输出模式
  10.           GPIO_Mode_AF_PP = 0x18                        //复用推挽输出模式
  11.          
  12. }GPIOMode_TypeDef;
复制代码

本次配置如下:

  1.   GPIO_InitTypeDef GPIO_InitStructure;
  2.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15;        // PB14,PB15
  3.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出模式
  4.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                //50mHz速度
  5.         
  6.   GPIO_Init(GPIOB, &GPIO_InitStructure);  //初始化PB端口
复制代码

2. GPIO控制配置
GPIO引脚置高函数


  1. /**
  2.   *@功能:GPIO引脚置高
  3.   *@参数1:指定GPIO外设
  4.   *@参数2:指定GPIO外设的引脚端口号
  5.   *@返回值:无
  6.   */
  7. void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
复制代码

GPIO引脚置低函数

  1. /**
  2.   *@功能:GPIO引脚置低
  3.   *@参数1:指定GPIO外设
  4.   *@参数2:指定GPIO外设的引脚端口号
  5.   *@返回值:无
  6.   */
  7. void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
复制代码

本次配置如下:

  1. GPIO_SetBits(GPIOB,GPIO_Pin_14);        //PB14置高
  2. GPIO_ResetBits(GPIOB,GPIO_Pin_14);        //PB14置低
复制代码

3. 具体程序
LED.c文件

  1. #include "led.h"

  2. /***************  配置LED用到的I/O口 *******************/
  3. void LED_GPIO_Config(void)        
  4. {
  5.   RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); // 使能PB端口时钟
  6.         
  7.   GPIO_InitTypeDef GPIO_InitStructure;
  8.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15;        // PB14,PB15
  9.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出模式
  10.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                //50mHz速度
  11.         
  12.   GPIO_Init(GPIOB, &GPIO_InitStructure);  //初始化PB端口
  13. }
复制代码

LED.h文件

  1. #ifndef __LED_H
  2. #define        __LED_H  

  3. #include "stm32f10x.h"

  4. #define LED1(a)                if (a)        \
  5.                                         GPIO_ResetBits(GPIOB,GPIO_Pin_14);\
  6.                                         else        \
  7.                                         GPIO_SetBits(GPIOB,GPIO_Pin_14)
  8.                                                                         
  9. #define LED2(a)                if (a)        \
  10.                                         GPIO_ResetBits(GPIOB,GPIO_Pin_15);\
  11.                                         else        \
  12.                                         GPIO_SetBits(GPIOB,GPIO_Pin_15)                                

  13. void LED_GPIO_Config(void);        //LED初始化配置

  14. #endif
复制代码

三、LED跑马灯
1. 延时函数


2. LED跑马灯实现
  1. #include <stdio.h>
  2. #include "led.h"
  3. #include "delay.h"

  4. int main (void)
  5. {
  6.         SystemCoreClockUpdate();         //设置系统时钟为72M
  7.         LED_GPIO_Config();                        //LED初始化配置

  8.         while(1)
  9.         {
  10.                 LED1(1);                        //LED1亮
  11.                 LED2(0);                        //LED2灭
  12.                 delay_ms(200);                //延时200ms
  13.                 LED1(0);                        //LED1灭
  14.                 LED2(1);                        //LED2亮
  15.                 delay_ms(200);                //延时200ms
  16.         }
  17. }
复制代码





收藏 评论0 发布时间:2022-5-2 09:43

举报

0个回答

所属标签

相似分享

官网相关资源

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