STM32入门——三种编写跑马灯程序的方法

这篇具有很好参考价值的文章主要介绍了STM32入门——三种编写跑马灯程序的方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

本文分别通过库函数、寄存器以及位操作完成跑马灯实验,使用的开发板是正点原子的min核心板。

一、库函数

1.1 硬件连接

图1 LED 与 STM32 连接原理图

stm32跑马灯,从零开始STM32学习之路,stm32,嵌入式硬件,单片机

 通过min板的原理图可以看出两个LED灯分别接到PD2和PA8引脚,并且LED灯是共阳极,当IO口输出高电平,LED灭;输出低电平,LED亮。

在实际的程序编程中我们需要用到GPIO文件也就是stm32f10x_gpio.h和stm32f10x_gpio.c,来操作对应IO口。同时我们需要设置时钟就要用到stm32f10x_rcc.c与其头文件进行时钟使能。

1.2 GPIO库函数介绍

  • 重要函数

1个初始化函数:

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

主要用途是用来初始化GPIO口的状态

第一个参数是一个结构体类型变量,指定哪组IO口,第二个同样是一个结构体类型变量,它共有三个变量,第一个指定哪个IO口,第二个指定速度,第三个指定Mode模式。

GPIO_Init函数初始化样例:

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;        //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度为50MHz
GPIO_Init(GPIOB,&GPIO_InitStructure);            //根据设定参数初始化为GPIOB.5

2个读取输入电平函数:

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, unit16_t GPIO_Pin);

作用:读取某个GPIO的输入电平。实际操作的是GPIOx_IDR寄存器。

例如:

GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5);//读取GPIOA.5的输入电平

uint16_t GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

作用:读取某个GPIO的输入电平。实际操作的是GPIOx_IDR寄存器

例如:

GPIO_ReadInputData(GPIOA);//读取GPIOA组中所有io口输入电平

2个读取输出电平函数:

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

上面两个函数的作用与读取输入电平大致相同,不同处在于这里读取的是某组或某个GPIO的输出电平。实际操作的是GPIO_ODR寄存器

4个设置输出电平函数:

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

作用:设置某个IO口输出为高电平(1)。实际操作BSRR寄存器。
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

作用:设置某个IO口输出为低电平(0)。实际操作BRR寄存器。
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

这两个函数不常用,也是用来设置IO口输出电平。

所有的函数都是在主函数中设置寄存器的值,例如SetBits使用了BSRR,ResetBit使用了BRR寄存器。

1.3 跑马灯程序

库函数——步骤:

  • 使能IO口时钟。调用函数RCC_APB2PeriphColckCmd();       

        不同的IO组,调用的始终使能函数不一样。

  • 初始化IO口模式。调用函数GPIO_Init();
  • 操作IO口,输出高低电平。

        GPIO_SetBits();

        GPIO_ResetBits();

注意:操作IO口之前,必须使能对应的时钟位。

在项目中新建一个HAREWARE文件夹,在其中新建程序文件夹,创建对应c文件与头文件,例如led.h与LED.c,在led.h头文件中定义LED_Init函数。

注意这里需要将对应头文件路径加入项目中来。以下是本次程序LED.c的代码内容,实现两个LED灯初始化。

stm32跑马灯,从零开始STM32学习之路,stm32,嵌入式硬件,单片机

 接下来在USER文件夹中编写main函数,

stm32跑马灯,从零开始STM32学习之路,stm32,嵌入式硬件,单片机

 编写完后利用flymcu烧录至开发板中,两个LED灯将同时点亮,间隔500毫秒后又同时熄灭,循环往复。

二、寄存器

2.1 硬件连接

连接如库函数。

2.2 跑马灯程序

寄存器——步骤:

  • 使能IO口时钟。配置寄存器RCC_APB2ENR;
  • 初始化IO口模式。配置寄存器GPIOx_CRH/CRL;
  • 操作IO口,输出高低电平。配置寄存器GPIOX_ODR或者BSRR/BRR。

2.2.1 使能IO口时钟

stm32跑马灯,从零开始STM32学习之路,stm32,嵌入式硬件,单片机

 stm32跑马灯,从零开始STM32学习之路,stm32,嵌入式硬件,单片机

 mini板的LED引脚分别为PA8和PD2,所以选择配置寄存器RCC_APB2ENR的位5和位2如上面原理图所示。

同样在项目中新建HAREWARE文件夹,其余操作步骤如库函数,在led.h头文件中定义LED_Init函数,首先我们需要操作RCC寄存器,它的定义在stm23f10x.h中,可以看到定义中使用RCC结构体指针定义了所有寄存器,在代码中我们将RCC指向APB2ENR来操作寄存器。

stm32跑马灯,从零开始STM32学习之路,stm32,嵌入式硬件,单片机

2.2.2 初始化IO口模式

 接下来操作端口配置寄存器,我们需要用GPIOx结构体指针指向该寄存器,配置为通用推挽输出模式,最大速度50MHz,对应到寄存器的每一个位是0011B,实际代码中先将对应位清零再进行配置,调用GPIOx的ODR寄存器,拉高需要操作的相应位。

stm32跑马灯,从零开始STM32学习之路,stm32,嵌入式硬件,单片机

2.2.3 操作IO口

 main.c里面把stm32f10x.h、delay.h、led.h头文件包含进来,主函数中调用delay_init和LED_Init初始化函数,随后进入while死循环,在死循环中同样可以直接用ODR寄存器对LED进行操作。

 stm32跑马灯,从零开始STM32学习之路,stm32,嵌入式硬件,单片机

 程序编写完毕后烧录至开发板实现跑马灯功能。

三、位操作

3.1 位操作基本原理

位操作原理:

把每个比特膨胀为一个32位的字,当访问这些字的时候就达到了访问比特的目的,比如说BSRR寄存器有32个位,那么可以映射到32个地址上,我们去访问(读-改-写)这32个地址就达到访问32个比特的目的。

哪些区域支持位操作:

stm32跑马灯,从零开始STM32学习之路,stm32,嵌入式硬件,单片机

 stm32跑马灯,从零开始STM32学习之路,stm32,嵌入式硬件,单片机

 由于位带区一个位对应32位的地址,所以位带区1MB对应别名区32MB。

stm32跑马灯,从零开始STM32学习之路,stm32,嵌入式硬件,单片机

 映射关系:

  • 位带区:支持位带操作的地址区

  • 位带别名:对别名地址的访问最终作用到位带区的访问上

stm32跑马灯,从零开始STM32学习之路,stm32,嵌入式硬件,单片机

3.2 硬件连接

硬件连接与前两个方法相同。

3.3 跑马灯程序

具体的代码实现里面,实际上运用的就是映射关系,比如要操作PA,就会宏定义一个PAout()函数,他的原理实际上就是在操作ODR寄存器,相应的,PAin()函数就是操作IDR寄存器,所有方法的最终原理都是操作寄存器,这是永恒不变的。

//IO口地址映射
#define GPIOA_ODR_Addr    (GPIOA_BASE+12)    //0x4001080c

//IO口操作,针对单一IO口
#define PAout(n)    BIT_ADDR(GPIOA_ODR_Addr,n)    //输出
#define PAin(n)     BIT_ADDR(GPIOA_IDR_Addr,n)    //输入

位操作——步骤:

  • 使能IO口时钟。调用函数RCC_APB2PeriphColckCmd();
  • 初始化IO口模式。调用函数GPIO_Init();
  • 操作IO口,输出高低电平。使用位带操作

大体上位操作的步骤和库函数相同,其使用的模板与库函数相同。

3.3.1 使能IO口时钟

与库函数版本程序代码相同。

3.3.2 初始化IO口模式

与库函数版本程序代码相同。

3.3.3 操作IO口

stm32跑马灯,从零开始STM32学习之路,stm32,嵌入式硬件,单片机

在这里只需要通过宏定义的位带函数操作LED灯即可。文章来源地址https://www.toymoban.com/news/detail-740455.html

到了这里,关于STM32入门——三种编写跑马灯程序的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • STM32F407ZGT6正点原子F4探索者开发板 -- 跑马灯例程

    LED0 - PF9 LED1 - PF10 PF9 = 0, LED0 亮,PF9 = 1,LED0 灭 PF10 = 0, LED1 亮,PF10 = 1,LED1 灭

    2024年02月15日
    浏览(46)
  • uni小程序 跑马灯效果

    写在前面 前几天帮一个朋友咋小程序上加一个类似于跑马灯的效果,本自己手写了一个。(代码和截图都在下方) 效果展示 等我截图~~~ 代码展示(布局代码) 主要就是图片css哪里加了一个“ flex-shrink: 0; ”,因为只是本地的一个功能,所以我就图片数据就写死了,需要的自

    2024年02月12日
    浏览(29)
  • 单片机(3)跑马灯,按钮控制的跑马灯(2种编程)

     先上电路图(图示的是高电平点亮的跑马灯)  这个是程序截图(keil5):我的建议是是先自己打一遍,边打边试着理解程序的意思。 下面的是没有注释的代码 下一个是另外一种编程思路  

    2024年02月11日
    浏览(29)
  • 20230705点亮STC32G实验箱9.6(STC32G12K128)开发板的跑马灯LED(深入了解)

    08第六集:LED闪烁第六集:LED闪烁和花式点灯上和花式点灯上.mp4 09第六集:LED闪烁和花式点灯下.mp4 【大文哥学习32位8051】20230704【冲哥视频】第六集的晶振时钟的学习困惑 2023/7/5 17:36 delay_ms(3000); 刷机的时候如果使用11.0592M的Fosc,3秒钟的延迟大概7秒钟。 刷机的时候如果使用

    2024年02月12日
    浏览(30)
  • 跑马灯实验

             1.熟悉龙芯实验开发板、熟悉 VIVADO 的编译环境及操作流程。         2.掌握 FPGA 编程入门知识、利用门级方法实现简单逻辑电路。         3.继续学习 Verilog HDL 语法、掌握跑马灯的设计、熟悉调试过程。          本次实验用 Verilog HDL 语言来描述 6 个不

    2024年02月04日
    浏览(31)
  • Android --- 跑马灯效果

    跑马灯效果主要使用的控件为TextView,其中涉及的几个标签如下所示: android:ellipsize If set, causes words that are longer than the view is wide to be ellipsized instead of broken in the middle. You will often also want to set scrollHorizontally or singleLine as well so that the text as a whole is also constrained to a single line in

    2023年04月08日
    浏览(67)
  • 3.跑马灯

    推挽模式输出:因为LED0和LED1阳极都是3.3V,需要将阴极设置为低电平才可以点亮LED; 操作io口时,必须引入源文件和头文件; 关于时钟的文件存放在rcc中; void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); 作用:初始化一个或多个io口(同一组)的工作方式和速度, 该函数

    2024年02月10日
    浏览(35)
  • Android 实现跑马灯效果

    Android中实现跑马灯效果有多种方式,本篇简单介绍下: 1: TextView属性实现 这里需要注意下: 需要限制textview的宽度,不能设置为wrap_content 启动跑马灯效果需要获取焦点requestFocus(). 2: 代码实现 3: 自定义 view实现 这里可以使用动画的效果实现. 4: 实现竖直效果的跑马灯

    2024年01月18日
    浏览(45)
  • CSS 之 跑马灯边框

    一、简介 ​ 之前有做过渐变色边框的样式,然后某天刷抖🎵,看到某个老师在讲跑马灯的样式效果,于是就自己尝试实现一下跑马灯样式的边框,虽然这种样式并不常见(基本没卵用),其使用场景我至今没想到,但是它足够花里胡哨,玩的就是花活。CSS才是前端最难精通

    2024年01月17日
    浏览(31)
  • CSS按钮-跑马灯边框

    思路很简单,实现方法有很多很多。但是大体思路与实现方法都类似:渐变色 + 动画,主要区别在动画的具体实现

    2024年02月11日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包