STM32(一):流水灯 (标准库函数)

这篇具有很好参考价值的文章主要介绍了STM32(一):流水灯 (标准库函数)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、实验原理

1.STM32VET6简介

STM32F103VET6是一款由意法半导体公司(ST)推出的基于Cortex-M3内核的32位微控制器,硬件采用LQFP48封装,属于ST公司微控制器中的STM32系列。

1.1 简要说明:

该款芯片 为 100引脚 , 512KFlash 64kSRAM LQFP 封装 32位 Cortex内核

内核 Cortex-M3
Flash 512K×8bit
SRAM 64K×8bit
GPIO 80个
ADC 12位 ADC 三路 共有 16个通道
CPU 72MHz
通讯方式 两个SPI,两个I2C,五个USART, 一个USB,一个CAN通信,一个SDIO
Timer 4个通用定时器 ,两个高级定时器,两个基本定时器

1.2 STM32各GPIO口介绍

GPIO分为七个部分:
1、保护二极管及上、下拉电阻:保护二级管可以防止引脚外部过高或过低的电压输入
2、P-MOS 管和N-MOS 管:控制推挽输出和开漏输出
3、输出数据寄存器:由输出数据寄存器GPIOX_ODR
4、复用功能输出:STM32 的其它片上外设对GPIO 引脚进行控制
5、输入数据寄存器:存储输入数据寄存器GPIOx_IDR
6、复用功能输入:GPIO 引脚的信号传输到STM32 其它片上外设
7、模拟输入输出:用于ADC 采集电压的输入通道
(原文链接:https://blog.csdn.net/xiaoxiaodawei/article/details/105834406)

二、实验步骤

1.时钟使能

流水灯操作的引脚位于GPIO端口,由下图可知AHB总线包含RCC时钟控制,GPIO是属于APB2的。需要使用的端口的复位和时间控制受RCC控制

STM32(一):流水灯 (标准库函数),STM32,stm32,单片机,嵌入式硬件

2.寄存器地址设置

1. 设置亮灯的高电平输出

STM32(一):流水灯 (标准库函数),STM32,stm32,单片机,嵌入式硬件

STM32(一):流水灯 (标准库函数),STM32,stm32,单片机,嵌入式硬件

2. 设置灭灯的低电平输出

STM32(一):流水灯 (标准库函数),STM32,stm32,单片机,嵌入式硬件

3. 反转输出电平

STM32(一):流水灯 (标准库函数),STM32,stm32,单片机,嵌入式硬件

3.延时函数

        程序执行指令的速度是很快的,若需要将灯的亮灭以及颜色的切换让人眼可观就需要设置延时函数。延时函数的延时时间跟stm32的晶振频率有关,程序执行指令需要一定时间,以此可以设计一个简单的延时函数。

        而这种死循环方式的延时函数是没办法精确控制延时时间长短, 只是大概的延时时间,所以基本上都是通过不断修改输入参数大小然后下载到开发板上看实验效果。

static void Delay(uint32_t time)
{
  uint32_t i,j;

  for(i=0;i<time;++i)
  {
    for(j=0;j<10000;++j)
    {       
      //空循环        
    }
  }
}

三、实操代码

程序分为3个文件:bsp_led.c、bsp_led.h、main.c

1.bsp_led.c


/* 包含头文件 ----------------------------------------------------------------*/
#include "bsp/led/bsp_led.h"
/**
  * 函数功能: 板载LED灯IO引脚初始化.
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:使用宏定义方法代替具体引脚号,方便程序移植,只要简单修改bsp_led.h
  *           文件相关宏定义就可以方便修改引脚。
  */
void LED_GPIO_Init(void)
{
  /* 定义IO硬件初始化结构体变量 */
  GPIO_InitTypeDef GPIO_InitStructure;
	
  /* 使能(开启)LED引脚对应IO端口时钟 */  
  RCC_APB2PeriphClockCmd(LED1_RCC_CLOCKGPIO|LED2_RCC_CLOCKGPIO |LED3_RCC_CLOCKGPIO , ENABLE);
  
  /* 设定LED对应引脚IO最大操作速度 :GPIO_Speed_50MHz */
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  /* 设定LED对应引脚IO为输出模式 */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  
	
  /* 设定LED1对应引脚IO编号 */
  GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN; 
  /* 初始化LED1对应引脚IO */
  GPIO_Init(LED1_GPIO, &GPIO_InitStructure);
 
  /* 设定LED2对应引脚IO编号 */
  GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN;  
  /* 初始化LED2对应引脚IO */
  GPIO_Init(LED2_GPIO, &GPIO_InitStructure);

  /* 设定LED3对应引脚IO编号 */
  GPIO_InitStructure.GPIO_Pin = LED3_GPIO_PIN;  
  /* 初始化LED3对应引脚IO */
  GPIO_Init(LED3_GPIO, &GPIO_InitStructure);

}

2.bsp_led.h

#ifndef __BSP_LED_H__
#define __BSP_LED_H__

/* 包含头文件 ----------------------------------------------------------------*/
#include <stm32f10x.h>

/* 类型定义 ------------------------------------------------------------------*/
typedef enum
{
  LED_OFF = 0,
  LED_ON,
}LEDState_TypeDef;
#define IS_LED_STATE(STATE)           (((STATE) == LED_OFF) || ((STATE) == LED_ON))

/* 宏定义 --------------------------------------------------------------------*/
#define LED1                          (uint8_t)0x01
#define LED2                          (uint8_t)0x02
#define LED3                          (uint8_t)0x04
#define IS_LED_TYPEDEF(LED)           (((LED) == LED1) || ((LED) == LED2) || ((LED) == LED3))

/*
 * 以下宏定义内容跟开发板硬件息息相关,需要查看开发板电路原理图才能正确编写。
 */

#define LED1_RCC_CLOCKGPIO            RCC_APB2Periph_GPIOA
#define LED1_GPIO_PIN                 GPIO_Pin_8
#define LED1_GPIO                     GPIOA


#define LED2_RCC_CLOCKGPIO            RCC_APB2Periph_GPIOA
#define LED2_GPIO_PIN                 GPIO_Pin_11
#define LED2_GPIO                     GPIOA


#define LED3_RCC_CLOCKGPIO            RCC_APB2Periph_GPIOA
#define LED3_GPIO_PIN                 GPIO_Pin_12
#define LED3_GPIO                     GPIOA

#if 1         /* 直接操作寄存器方法 */

#define LED1_ON                      {LED1_GPIO->BRR=LED1_GPIO_PIN;}   //输出高电平
#define LED1_OFF                       {LED1_GPIO->BSRR=LED1_GPIO_PIN;}    //输出低电平
#define LED1_TOGGLE                   {LED1_GPIO->ODR ^=LED1_GPIO_PIN;}  //输出反转

#define LED2_ON                      {LED2_GPIO->BRR=LED2_GPIO_PIN;}   //输出高电平
#define LED2_OFF                       {LED2_GPIO->BSRR=LED2_GPIO_PIN;}    //输出低电平
#define LED2_TOGGLE                   {LED2_GPIO->ODR ^=LED2_GPIO_PIN;}  //输出反转

#define LED3_ON                      {LED3_GPIO->BRR=LED3_GPIO_PIN;}   //输出高电平
#define LED3_OFF                       {LED3_GPIO->BSRR=LED3_GPIO_PIN;}    //输出低电平
#define LED3_TOGGLE                   {LED3_GPIO->ODR ^=LED3_GPIO_PIN;}  //输出反转

#endif


/* 扩展变量 ------------------------------------------------------------------*/
/* 函数声明 ------------------------------------------------------------------*/
void LED_GPIO_Init(void);
#endif  // __BSP_LED_H__


3.main.c

/* 包含头文件 ----------------------------------------------------------------*/
#include "stm32f10x.h"
#include "bsp/led/bsp_led.h"

static void Delay(uint32_t time);

/* 函数体 --------------------------------------------------------------------*/

int main(void)
{
  uint8_t count=0;

  /* 初始化板载LED灯,该函数定义在bsp_led.c文件中,在bsp_led.h声明所以需要包括该头文件 */
  LED_GPIO_Init();  
  
  /* 无限循环 */
  while (1)
  {

    switch(count)
    {
      /* 使用宏定义方法控制LED灯 */
      case 0:           
		LED1_OFF;
        LED2_OFF;
        LED3_OFF;
        break;
      case 1:           
	    LED1_ON;
        break;
      case 2:
		LED1_OFF;
        LED2_ON;
        break;
      case 3:                       
        LED2_OFF;
        LED3_ON;
        break;
      case 4:
        LED3_OFF;
        LED2_ON;
        break;
      case 5:
        LED2_OFF;
        LED1_ON; 
        break;
      case 6:
        LED1_ON;
        LED2_ON;
        LED3_ON;
        break;
    }    
    /* 延时一段时间 */
    Delay(1000);
    
    /* 计数增加1 */
    count++;
    /* 重新开始计数 */
    if(count==7)count=0;
  }
}


static void Delay(uint32_t time)
{
  uint32_t i,j;

  for(i=0;i<time;++i)
  {
    for(j=0;j<10000;++j)
    {       
      //空循环        
    }
  }
}

四、实验效果

流水灯

五、实验总结

通过这次利用STM32VET6进行流水灯实验以及撰写博客文章,对STM32中的GPIO初始化有了更深的体会。文章来源地址https://www.toymoban.com/news/detail-846466.html

到了这里,关于STM32(一):流水灯 (标准库函数)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 使用STM32做流水灯

    使用STM32做流水灯

    STM32,从字面上来理解, ST 是意法半导体, M 是 Microelectronics(微电子学) 的缩写, 32 表示32 位,合起来理解, STM32 就是指 ST 公司开发的 32 位微控制器。 1.强大的性能:STM32单片机基于ARM Cortex-M处理器核心,提供高性能的计算能力和快速的指令执行速度。 2.丰富的外设接口

    2024年02月04日
    浏览(16)
  • 基于stm32的流水灯实现

    主控芯片:  正点原子STM32F103ZET6精英开发板 oled:中景园七针脚0.96寸oled 代码编程软件: keil5 代码下载地址: stm32流水灯项目 希望大家仔细看一看是否符合自己的需求,实际上本文中写到的很多东西已经能为课设所用,理清逻辑后自己编程也很方便的,但如果想直接copy我的项目

    2024年02月07日
    浏览(11)
  • 利用STM32实现流水灯程序

    利用STM32实现流水灯程序

    keil MDK安装与新建工程 在KEIL MDK官网中下载KEIL MDK ARM,下载链接如下:MDK-ARM Version 5.38a Evaluation Software Request (keil.com),在填写信息后进行安装和下载。 安装后进行以下操作: 右键keil5图标,点击“以管理员身份运行” 进入之后, 点击“ file ”里边的选项“ License Management ”

    2024年02月06日
    浏览(14)
  • STM32MP157汇编流水灯

    STM32MP157汇编流水灯

    2024年02月07日
    浏览(14)
  • (STM32基础)STM32实现LED闪烁&LED流水灯&蜂鸣器

    (STM32基础)STM32实现LED闪烁&LED流水灯&蜂鸣器

    1、按照新建工程步骤创建工程,新建start、library、user三个文件夹,从固件库添加相应文件 2、keilkil小程序用来清理listings和objects文件夹中编译产生的中间文件,以后需要打包工程的话可以先用keilkill先清理,这样文件夹会大大缩小所占内存。 在library中可以查看外设函数库,

    2024年02月07日
    浏览(17)
  • 【STM32】STM32学习笔记-LED闪烁 LED流水灯 蜂鸣器(06-2)

    【STM32】STM32学习笔记-LED闪烁 LED流水灯 蜂鸣器(06-2)

    电路图示例1 电路图示例2 main.c 接线图如下图所示: 点击下载,现象为LED闪烁。 main.c main.c stm32F103工程模板 01-LED闪烁.rar 02-LED流水灯.rar 03-蜂鸣器示例程序.rar 参考: 【STM32】江科大STM32学习笔记汇总

    2024年03月19日
    浏览(8)
  • STM32——led灯的点亮+闪烁+流水灯的实现

    STM32——led灯的点亮+闪烁+流水灯的实现

    1.原理 其方式有两种一种是寄存器方式一种是库函数方式,但其原理都是一样的。如原理图所示,与LED相连接的IO口置低电平即可点亮led灯 2.寄存器方式–代码 3.库函数–代码 (1)led.c:函数led_config() (2)main.c调用led_config 4.结果展示 原理:让连接的IO口先置零再置1可以使其先亮

    2024年02月08日
    浏览(14)
  • STM32F103之点亮LED流水灯

    STM32F103之点亮LED流水灯

    目录 一、设计分析及代码思路 1.实现流水灯步骤 2.代码设计过程 二、创建项目 1.新建项目 2.编写代码 三、仿真运行 四、连接电路 1.器件连接 2.程序烧录 五、代码烧录及实现 1.烧录实现 2.流水灯实现 六、总结  配置时钟使能寄存器 配置端口寄存器 设置输出模式 实物连接及

    2024年04月25日
    浏览(13)
  • STM32第二课:灯的亮灭、流水灯、有源蜂鸣器

    STM32第二课:灯的亮灭、流水灯、有源蜂鸣器

             STM32的第二课,我们来学习如何使用STM32控制等的亮灭,使用多重控制制作我们自己的流水灯,然后再了解一下有源蜂鸣器的用法,创造出不一样的声音。         首先开头包含STM32的头文件#include \\\"stm32f10x.h\\\",这个头文件包含STM32众多的重要驱动,一定要把这个头文

    2024年01月24日
    浏览(12)
  • 使用Proteus 8.9仿真STM32F103流水灯实验

    使用Proteus 8.9仿真STM32F103流水灯实验

    STM32流水灯程序非常简单,在我的实验中使用GPIOC的引脚连接流水灯。主要程序如下: LED初始化:led.h  led.c test.c文件,main主函数:  工程目录如下,记得包含头文件。工程链接在文末。  编译生成.hex文件即可,接下来绘制仿真电路。 打开Proteus 点击新建工程。 我将工程保存

    2024年02月04日
    浏览(15)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包