第三讲 按键跑马灯、编程及keil

合集下载

LED跑马灯实验-库函数

LED跑马灯实验-库函数

LED跑马灯实验修改记录审核记录LED跑马灯1.1实验介绍GPIO即通用可编程输入输出口,在此我们通过GPIO编程实现一个跑马灯的实验。

该跑马灯实验是最简单,也是一般最先开始的一个实验,它可以搭建一个最小的工程项目,之后,所有的实验都可以建立在该项目之上,从而节省了在搭建过程中所消耗的时间和精力。

所有的 GPIO 操作都是以跑马灯为基础进行的。

1.2实验目标1. 理解固件库的结构2. 分析和学习固件库3. 灵活运用 GPIO1.3实验时间60分钟1.4预备知识熟悉C语言知识,熟练MDK的使用1.5实验步骤1.解压32f可以从ST官方网站免费下载。

本教程使用的标准库版本为 3.1.22.创建一个GPIO文件夹新建子文件夹User,用于存放用户源程序新建子文件夹Project,用户KEIL工程文件在Project下依次创建Obj和List子文件夹,存放编译过程中产生的中间文件。

3. 复制源代码到GPIO文件夹将stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.1.2\Libraries文件夹和Utilities文件夹整体复制到GPIO文件夹下。

这就是ST的标准库,是以源代码形式提供的。

将库中的演示代码\GPIO\labsolutions\4GPIO_fuction\User中的文件复制到GPIO\User文件夹.4. 新建Keil MDK工程启动Keil MDK,点击菜单 New uVision Project,新建一个工程,命名为GPIO选择CPU类型为 STM32F107VC (这是MDV-STM32-107开发板采用的CPU类型)当提示是否复制启动代码时,请选择否。

(我们用最新的库中的启动代码,不用Keil软件自带的旧版本启动文件)根据自己的需要修改Target名字。

(名字任意)为了便于代码管理,在这个Project下创建几个Group (名字可以任意)User : 存放用户自己写的源代码RVMDK : 存放启动文件(汇编文件)StdPeriph_Driver : 存放ST标准库外设驱动文件CMSIS : 存放CMSIS接口文件(这也是库的一部分)STM32_EVAL存放板集设备驱动文件创建好Group后,我们开始依次添加文件。

嵌入式系统原理实验三跑马灯

嵌入式系统原理实验三跑马灯

嵌入式系统原理实验三跑马灯(共4页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--实验三跑马灯实验实验目的:通过一个经典的跑马灯程序,了解 STM32F1 的 IO 口作为输出使用的方法。

通过代码控制 ALIENTEK 战舰 STM32 开发板上的两个 LED: DS0 和DS1 交替闪烁,实现类似跑马灯的效果内容要点:1.硬件设计本章用到的硬件只有LED(DS0 和DS1)。

其电路在ALIENTEK 战舰STM32F103 开发板上默认是已经连接好了的。

DS0 接PB5,DS1 接PE5。

所以在硬件上不需要动任何东西。

其连接原理图如图:2.软件设计跑马灯实验我们主要用到的固件库文件是:/stm32f10x_usart /其中头文件在每个实验中都要引入,因为系统时钟配置函数以及相关的外设时钟使能函数都在这个其源文件中。

和头文件在我们SYSTEM 文件夹中都需要使用到,所以每个实验都会引用。

首先,找到之前新建的Template 工程,在该文件夹下面新建一个HARDWARE 的文件夹,用来存储以后与硬件相关的代码,然后在HARDWARE 文件夹下新建一个LED 文件夹,用来存放与LED 相关的代码。

新建和文件,一个外设对应一个.h和.c文件。

在Manage Components 管理里面新建一个HARDWARE 的组,并把加入到这个组里面,将头文件的路径加入到工程里面一般的头文件有固定的格式,多个地方调用头文件会重复引用,为了避免头文件内容重复引用,一般通过预编译的方式来写头文件。

一般的格式如下:#ifndef __LED_H#define __LED_H……#endif第一次调用时会将#define下面这一节全部定义,重复调用时,下面的东西就不会被引用。

头文件里一般用来写函数声明或者宏定义,在源文件中再去定义具体的函数。

#ifndef __LED_H#define __LED_Hvoid LED_Init(void);#endif然后我们打开USER 文件夹下的工程(如果是使用的上面新建的工程模板,那么就是Template. uvprojx,大家可以将其重命名为LED. uvprojx),按新建按钮新建一个文件,然后保存在HARDWARE->LED 文件夹下面,保存为。

11.2 跑马灯控制程序设计

11.2 跑马灯控制程序设计
厦电气门控大制学实物践理训与练M机O电OC工课程程学团院队
二、跑马灯控制程序设计 结合顺序控制设计法来设计跑马灯控制程序。
首先来看一下该任务的控制要求: 要求通过启动按钮SB1使得8盏灯按照L0、L1~L7的 顺序亮,每隔1S亮一盏灯;再按L7、L6~L1、L0的 顺序灭,每隔1S灭一盏灯;如此循环,直至按下停 止按钮SB2,全部灯熄灭,停止工作。
下面我们按步来看一下程序的编写: (2)S1步:S1步是起始步,表示程序开始运行,满足 转换条件SB1可以进入S2步。SB1为启动按钮I0.0,按 下后程序开始运行,S2步激活。我们使用M0.0来指示 启停状态,M0.0为1表示启动,M0.0为0表示停止。这 段程序比较简单,使用置位线圈指令,当I0.0按下, 使M0.0置位为1。
厦电气门控大制学实物践理训与练M机O电OC工课程程学团院队
(4)S3步和S4步
S3步负责控制左移,S4步负责控制右移,这两步 是密切相关的。由于操作对象是MW20,是一个字的存 储空间,所以我们要选择字的移位指令。如图蓝色圈 中所示,使用移位脉冲T1,T1每1S产生一个下降沿, 检测这个下降沿使移位指令产生移位。如图红色圈中 所示,在写入初值后,一次移一位,先左移,就会看 到MB20的各个位,从M20.0至M20.7依次变1;等M20.7 变1了,再右移,一次移一位,就会看到MB20的各个 位,从M20.7至M20.0依次变0。
厦电气门控大制学实物践理训与练M机O电OC工课程程学团院队
第二项工作是为移位对象写入初值,有的同学要 问了,移位对象不是输出Q0.0至Q0.7吗?应该这么说 ,控制Q0.0至Q0.7是我们的目的,怎么来达到这个目 的呢?为了避免直接控制输出所带来的误操作,我们 要使用一个中间存储空间MW20来作为移位对象,将移 位后的结果通过MB20来传送到QB0。我们来看看这个 MW20的空间,MW20包含MB20和MB21两个字节,给这个 空间填入初值W#16#FF,这时MB20的各个位为0,MB21 的各个位为1。

3 第三章 Keil软件的使用及流水灯的设计 (1)

3 第三章 Keil软件的使用及流水灯的设计 (1)

VCC P0. 0 P1=0xfe;//1111 1110 0000 P1=0xff;//1111 1111 P0.1P1=0x00;//0000 P0.2 P0.3 由于单片机P1 P0.4 P0.5 口的8个引脚 P0.6 可以同时输出 P0.7 PSEN 不同的电平, ALE 所以可以控制 EA P2.7 不同的发光二 P2.6 P2.5 极管处于不同 P2.4 的亮灭状态。 P2.3 P2.2 P2.1 P2. 0
#include<reg51.h> #define uint unsigned int sbit led1=P1^0; uint i,j; void main() { while(1) { led1=0; for(i=1000;i>0;i--) for(j=110;j>0;j--); led1=1; for(i=1000;i>0;i--) for(j=110;j>0;j--); }
#include<reg51.h> #define uint unsigned int sbit led1=P1^0;
void delay1s();
void main() { while(1) { led1=0; delay1s(); led1=1; delay1s(); }}
void delay1s() {uint i,j; for(i=1000;i>0;i--) for(j=110;j>0;j--);}
1 0
+5V
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 24 22 21

如何用51单片机数码管实现跑马灯功能?

如何用51单片机数码管实现跑马灯功能?

如何用51单片机数码管实现跑马灯功能?51单片机数码管显示跑马灯程序源代码讲解基于51单片机学习板。

用S1键作为控制跑马灯的方向按键,S5键作为控制跑马灯方向的加速度按键,S9键作为控制跑马灯方向的减速度按键,S13键作为控制跑马灯方向的启动或者暂停按键。

记得把输出线P0.4一直输出低电平,模拟独立按键的触发地GND。

(2)实现功能:跑马灯运行:第1个至第8个LED灯一直不亮。

在第9个至第16个LED灯,依次逐个亮灯并且每次只能亮一个灯。

每按一次独立按键S13键,原来运行的跑马灯会暂停,原来暂停的跑马灯会运行。

用S1来改变方向。

用S5和S9来改变速度,每按一次按键的递增或者递减以10为单位。

数码管显示:本程序只有1个窗口,这个窗口分成3个局部显示。

8,7,6位数码管显示运行状态,启动时显示“on”,停止时显示“oFF”。

5位数码管显示数码管方向,正向显示“n”,反向显示“U”。

4,3,2,1位数码管显示速度。

数值越大速度越慢,最慢的速度是550,最快的速度是50。

(3)源代码讲解如下:#include "REG52.H"#define const_voice_short 40 //蜂鸣器短叫的持续时间#define const_key_time1 20 //按键去抖动延时的时间#define const_key_time2 20 //按键去抖动延时的时间#define const_key_time3 20 //按键去抖动延时的时间#define const_key_time4 20 //按键去抖动延时的时间void initial_myself();void initial_peripheral();void delay_short(unsigned int uiDelayShort);void delay_long(unsigned int uiDelaylong);。

iar编写stm8跑马灯

iar编写stm8跑马灯

iar编写stm8跑马灯一、概述跑马灯是一种常见的LED灯效,通过依次点亮和熄灭LED灯,形成像跑马一样的效果。

本文将介绍如何使用IAR编写STM8跑马灯程序。

二、硬件准备在开始编写跑马灯程序之前,需要准备以下硬件: 1. STM8开发板:用于运行程序的主控板。

2. LED灯:用于显示跑马灯效果的灯珠。

三、软件准备在开始编写跑马灯程序之前,需要准备以下软件: 1. IAR Embedded Workbench:用于编写和调试STM8程序的集成开发环境。

四、编写跑马灯程序以下是使用IAR编写STM8跑马灯程序的详细步骤:1. 创建新工程在IAR Embedded Workbench中,选择”File” -> “New” -> “Project”,然后选择STM8作为目标平台,输入工程名称并选择保存路径。

点击”OK”创建新工程。

2. 配置工程在工程中,选择”Project” -> “Options”,在弹出的对话框中选择正确的芯片型号和调试器。

点击”OK”保存配置。

3. 编写主程序在IAR Embedded Workbench的工程窗口中,选择”Project” -> “Add New File”,然后输入文件名和保存路径。

点击”OK”创建新文件,并在文件中编写主程序。

以下是一个简单的跑马灯程序示例:#include <iostm8s103f3.h>#define LED_PORT GPIOC#define LED_PIN GPIO_PIN_3void delay(unsigned int n){unsigned int i, j;for (i = 0; i < n; i++)for (j = 0; j < 1000; j++);}int main(void){GPIO_Init(LED_PORT, LED_PIN, GPIO_MODE_OUT_PP_LOW_FAST);while (1){GPIO_WriteLow(LED_PORT, LED_PIN);delay(1000);GPIO_WriteHigh(LED_PORT, LED_PIN);delay(1000);}}4. 编译和下载程序点击IAR Embedded Workbench的工具栏中的”Make”按钮编译程序。

单片机跑马灯实验报告

单片机跑马灯实验报告

单片机跑马灯实验报告摘要:本实验通过使用单片机来控制LED灯进行跑马灯效果的展示。

通过简单的电路连接和编程,我们成功实现了单片机跑马灯的功能。

实验结果表明,单片机跑马灯是一种简单而有效的显示系统,可广泛应用于娱乐和装饰等领域。

引言:跑马灯效果是一种常见且受欢迎的LED显示效果,它可以不断地循环显示LED灯的亮灭轮廓,给人们带来视觉上的愉悦。

单片机是一种可编程的微控制器,广泛应用于电子系统的控制和管理。

在本实验中,我们将利用单片机来实现跑马灯效果,通过编程控制LED灯的亮灭来模拟跑马灯的效果。

材料和方法:本实验所需材料如下:1. 单片机开发板2. LED灯3. 面包板4. 连接线实验步骤:1. 将单片机开发板放置在面包板上,确保连接稳固。

2. 将LED灯连接到面包板上,按照电路图正确连接。

3. 接通电源,将USB线连接到单片机开发板上。

4. 在计算机上打开开发板的编程软件。

5. 编写程序代码,实现跑马灯的效果。

6. 将程序代码下载到单片机开发板中。

7. 观察LED灯的亮灭情况,检查是否实现了跑马灯效果。

结果和讨论:经过实验,我们成功实现了单片机跑马灯的效果。

LED灯按照指定的顺序循环亮灭,产生出跑马灯的效果。

通过调整程序代码,我们可以控制跑马灯的速度和亮灭顺序,使其更加多样化和有趣。

单片机跑马灯是一种简单而有效的LED显示系统。

它可以应用于各种场景,包括室内和室外的装饰灯,新闻标语显示,广告牌等。

跑马灯效果不仅能够吸引人们的目光,还可以起到一定的宣传和广告效果。

总结:通过本次实验,我们了解了单片机的基本原理和应用,并成功实现了单片机跑马灯的效果。

单片机跑马灯具有简单、低成本、可编程等优点,适用于各种需要循环显示效果的场景。

未来,我们可以探索更多有趣的跑马灯效果,并将其应用于实际项目中。

在这个数字化时代,单片机跑马灯有着广阔的应用前景,希望能够为人们的生活和工作带来更多的灵感和乐趣。

单片机实训报告跑马灯

单片机实训报告跑马灯

一、实训背景随着科技的发展,单片机作为一种重要的嵌入式系统控制单元,在工业控制、智能家居、物联网等领域得到了广泛的应用。

为了提高学生对单片机程序设计的理解和实践能力,本次实训选择了跑马灯程序设计作为实训项目。

二、实训目的1. 熟悉单片机的基本结构和编程方法。

2. 掌握Keil C51集成开发环境的使用。

3. 学习跑马灯程序的设计与实现。

4. 培养动手实践能力和团队协作精神。

三、实训内容本次实训主要分为以下几个部分:1. 电路设计:设计跑马灯的电路,包括单片机、LED灯、电阻、按键等元件。

2. 程序设计:编写跑马灯的程序,实现LED灯的正序、倒序、闪烁等功能。

3. 程序调试:在Keil C51集成开发环境中进行程序调试,确保程序正常运行。

4. 实验报告撰写:总结实训过程中的经验和收获,撰写实验报告。

四、电路设计跑马灯电路主要包括以下元件:1. 单片机:选用AT89C51单片机作为控制核心。

2. LED灯:使用8个LED灯作为显示元件。

3. 电阻:用于限流,防止LED灯烧毁。

4. 按键:用于控制跑马灯的运行模式。

电路连接方式如下:1. 将8个LED灯的正极依次连接到单片机的P1口。

2. 将8个LED灯的负极依次连接到地线。

3. 将按键的一端连接到单片机的P3.0口,另一端连接到地线。

五、程序设计跑马灯的程序采用C语言编写,主要功能包括:1. 正序跑马灯:LED灯依次点亮,从D1到D8。

2. 倒序跑马灯:LED灯依次点亮,从D8到D1。

3. 闪烁跑马灯:LED灯快速闪烁。

程序流程如下:1. 初始化单片机P1口为输出模式。

2. 根据按键输入选择跑马灯的运行模式。

3. 根据选择的模式,依次点亮LED灯。

4. 延时一段时间,然后继续点亮下一个LED灯。

5. 重复步骤3和4,直到所有LED灯点亮完毕。

程序代码如下:```c#include <reg51.h>#define LED P1void delay(unsigned int t) {unsigned int i, j;for (i = 0; i < t; i++)for (j = 0; j < 120; j++);}void main() {unsigned char i;LED = 0x01; // 正序跑马灯while (1) {for (i = 0; i < 8; i++) {delay(500); // 延时LED = (0x01 << i); // 点亮下一个LED灯}}}```六、程序调试在Keil C51集成开发环境中,将程序代码编译生成HEX文件,然后将HEX文件烧录到单片机中。

MCS-51单片机控制跑马灯的三种方法

MCS-51单片机控制跑马灯的三种方法

MCS-51单片机控制跑马灯的三种方法
在MCS一51单片机的控制系统中,它的四个并行8位输入输出端口P0一P3是我们经常使用的。

在并行端口的编程学习中,跑马灯是单片机并行端口输出控制的典型实例。

所谓跑马灯,是指将八个发光二极管分别连接到单片机的某一并行端口的八根线上,通过编程控制这八个发光二极管从低到高或从高到低依次点亮。

图1 跑马灯电路图
如图1所示,将8个发光二极管阴极接到MCS一51单片机P1端口的8根端口线上,阳极通过限流电阻接+5V电源。

要让发光二极管点亮,则对应的端口线应该为低电平(0);而要让其熄灭,对应的端I=I线应该为高电平(1)。

由此,我们假定跑马灯由端I=1的低位向高位轮流点亮.可以得到如下状态:
表1 跑马灯状态表
从表1可以看出,P1端口的状态共有8种,在跑马灯的显示过程中.这8种状态依次出现,循环往复。

而要实现跑马灯的这种显示功能.我们可以采用三种方法:
(1)穷举法;
(2)移位法;
(3)查表法。

下面分别来介绍一下这三种方法。

一、穷举法对于单片机的显示状态来说,它的8种状态是循环显示的。

所谓穷举法。

是指将单片机所有的显示状态全部列举出来。

写在程序的主函数中,通过while(1)的死循环来实现这些状态的循环显示。

程序如下:
#include<reg51.h>//延时函数.延时0.5s
voiddelay()。

单片机跑马灯(流水灯)控制实验报告

单片机跑马灯(流水灯)控制实验报告

单片机实验报告姓名: 学号:一、 实验实现功能:1:计数器功能2:流水灯二、 具体操作:1、计数器功能数码管的动态显示。

每按一次K2键计数器加1通过数码管显示出来,计数器可以实现从0计数到9999。

2、流水灯当在计数器模式下的时候按下K3键时程序进入跑马灯模式,8个小灯轮流点亮每次只点亮一个,间隔时间为50ms 。

三、 程序流程图开始 定时器T0 设置初值,启动定时器,打开中断复位 Key2按下 中断关闭 计数器模式 计数器加1 Key3按下 流水灯模式 数码管显示数字加1 跑马灯点亮间隔50ms Key1按下中断打开四、程序#include <reg51.h>typedef unsigned char uint8;typedef unsigned int uint16; //类型定义sbit P2_1 = P2^1;sbit P2_2 = P2^2;sbit P2_3 = P2^3;sbit P2_4 = P2^4; //位声明四个数码管开关sbit Key2 = P3^2;sbit Key3 = P3^3; //位声明2个按键K2和K3sbit Ledk = P2^0 ; //LED 开关void delay(uint16 i); //延时函数声明void refresh (); // 数码管刷新函数声明void liushuideng(); //流水灯函数声明uint8 number[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//数码管的真值表uint8 out[4] = {0}; // 数组变量uint16 counter=0; //用作计数器的变量uint16 Time_counter=0; //用作定时器的变量void main() //主函数{TMOD = 0x01; //定时器0,工作方式一TH0 = 0xFC;TL0 = 0x18; //定时器初值使每次循环为1msTR0 = 0; //定时器0开始作ET0 = 0; // 定时器中断关EA = 0; // 关中断while(1) //计数器模式{Ledk =1 ; //led开关关out[0]=number[counter%10]; //取个位out[1]=number[counter%100/10]; //十位out[2]=number[counter%1000/100]; //百位out[3]=number[counter/1000]; //千位if (!Key2) //计数器加1{++counter; //自加out[0]=number[counter%10]; //取个位out[1]=number[counter%100/10]; //十位out[2]=number[counter%1000/100]; //百位out[3]=number[counter/1000]; //千位while(!Key2) //等待键盘抬起refresh(); //刷新数码管}refresh(); //刷新数码管if (!Key3) // 进入跑马灯模式liushuideng();}} //主函数结束/*******************延时*************/void delay(uint16 i){uint8 j; // 定义局部变量for(i;i>0;i--) //循环i*240 次for(j=240;j>0;j--);}/************数码管刷新******************/void refresh (){uint8 j;for (j=0;j<4;j++) //四次循环刷新数码管{switch(j){case 0: P2_1=1;P2_2=1;P2_3=1;P2_4=0;break;case 1: P2_1=1;P2_2=1;P2_3=0;P2_4=1;break;case 2: P2_1=1;P2_2=0;P2_3=1;P2_4=1;break;case 3: P2_1=0;P2_2=1;P2_3=1;P2_4=1;break;//每次循环只选中一个数码管default:break;}P0 = out[j]; // 位选,给数码管送值delay (20); //延时消抖}}/*************定时器的中断服务函数**************/void Timer0_Overflow() interrupt 1 //定时器0溢出中断,这个语句1ms执行一次{TH0 = 0xFC;TL0 = 0x18; //每1ms重新赋定时器初值Time_counter++; //计数,看经过了几个1ms}/***********************流水灯子函数****************************/ void liushuideng(){uint8 j = 0 ; //定义局部变量P0 = 0xff; // 小灯全关TR0 = 1; //定时器1开始计时EA = 1; //中断开放ET0 = 1; //定时器0中断开while(1){Ledk = 0 ; //打开LED开关P2 = P2|0x1E; //关掉数码管if(50 == Time_counter) //50个毫秒{P0=~(1<<j++); //控制小灯Time_counter = 0; //清零开始下一次循环定时}if (8==j) //移完8次再重新移{j=0;}}}。

实验一跑马灯实验

实验一跑马灯实验

目录实验一跑马灯实验 (1)实验二按键输入实验 (3)实验三串口实验 (5)实验四外部中断实验 (8)实验五独立看门狗实验 (11)实验七定时器中断实验 (13)实验十三ADC实验 (15)实验十五DMA实验 (17)实验十六I2C 实验 (21)实验十七SPI 实验 (24)实验二十一红外遥控实验 (27)实验二十二DS18B20实验 (30)1 / 32'.实验一跑马灯实验一.实验简介我的第一个实验,跑马灯实验。

二.实验目的掌握STM32 开发环境,掌握从无到有的构建工程。

三.实验内容熟悉MDK KEIL 开发环境,构建基于固件库的工程,编写代码实现跑马灯工程。

通过ISP 下载代码到实验板,查看运行结果。

使用JLINK 下载代码到目标板,查看运行结果,使用JLINK 在线调试。

四.实验设备硬件部分:PC计算机(宿主机)、亮点STM32实验板、JLINK。

软件部分:PC机WINDOWS系统、MDK KEIL软件、ISP软件。

五.实验步骤1.熟悉MDK KEIL 开发环境2.熟悉串口编程软件ISP3.查看固件库结构和文件4.建立工程目录,复制库文件5.建立和配置工程6. 编写代码7. 编译代码8.使用ISP下载到实验板9.测试运行结果10.使用JLINK 下载到实验板11.单步调试12. 记录实验过程,撰写实验报告六.实验结果及测试源代码:int main(void}<5tm32_Clock_IniC (9); /,耒红对甘去置delay^init (72 >; "延吋初始<tLED Tnit:C>;"初维花与LED连接的硬伴接口while tl){匚EDO=O;匸ED1=1;de .lay ms (300 J ;LEDO=1;LEDL-0;delay ms(3"0^;两个灯LEDO与LED1实现交替闪烁的类跑马灯效果,每300ms闪烁一次。

STM32-GPIO学习-跑马灯实验和按键实验-寄存器版本和HAL库版本

STM32-GPIO学习-跑马灯实验和按键实验-寄存器版本和HAL库版本

STM32-GPIO学习-跑马灯实验和按键实验-寄存器版本和HAL库版本⼀、stm32跑马灯实验a.GPIOgeneral purpose input output通⽤输⼊输出端⼝,可以做输⼊也可做输出,GPIO端⼝可通过程序配置成输⼊或输出。

STM32FXXXIGT6⼀共9组IO:PA~ PI,其中PA~ PH每组16个IO,PI只有PI0~PI11。

16*8+12=140,⼀共140个IO⼝。

STM32⼤部分引脚除了当GPIO⽤,还可复⽤为外设功能引脚,⽐如串⼝。

节省引脚资源。

b.GPIO的8种⼯作模式4种输⼊模式:输⼊浮空、输⼊上拉、输⼊下拉、模拟输⼊4种输出模式带上下拉:开漏输出(带上拉或下拉)、开漏复⽤功能、推挽式输出、推挽式复⽤推挽输出可以输出强⾼低电平,连接数字器件开漏输出只可以输出强低电平,⾼电平得靠外部电阻拉⾼。

输出端相当于三级管的集电极c.GPIO寄存器4个32位配置寄存器GPIOx_MODER 模式GPIOx_OTYPER 输出类型GPIOx_OSPEEDR 输出速度GPIOx_PUPDR 上拉下拉2个32位数据寄存器GPIOx_IDR 输⼊数据GPIOx_ODR 输出数据1个32位置位/复位寄存器GPIOx_BSRR 置位/复位1个32位锁存寄存器GPIOx_LCKR 配置锁存2个32位复⽤功能寄存器GPIOx_AFRL&GPIOx_AFRH 复⽤功能每组IO⼝由10个寄存器组成如果配置⼀个IO⼝需要2个位,32位寄存器配置⼀组IO⼝,16个IO⼝如果配置⼀个IO⼝只需要1个位,⾼16位保留1.寄存器定义F767:stm32f767xx.h⽂件中查找GPIO得到:typedef struct{__IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */__IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */__IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */__IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */__IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */__IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */__IO uint32_t BSRR; /*!< GPIO port bit set/reset register, Address offset: 0x18 */__IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */__IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */} GPIO_TypeDef;再查找GPIO_TypeDef找到:#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE)#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE)#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE)#define GPIOI ((GPIO_TypeDef *) GPIOI_BASE)#define GPIOJ ((GPIO_TypeDef *) GPIOJ_BASE)#define GPIOK ((GPIO_TypeDef *) GPIOK_BASE)可以看出GPIOA是⼀个结构体指针,它指向基地址。

GPIO原理与配置(跑马灯,蜂鸣器,按键)

GPIO原理与配置(跑马灯,蜂鸣器,按键)

GPIO原理与配置(跑马灯,蜂鸣器,按键) ⼀。

STM32 GPIO固件库函数配置⽅法 1. 根据需要在项⽬中删掉⼀些不⽤的固件库⽂件,保留有⽤的固件库⽂件 2. 在stm32f10x_conf.h中注释掉这些不⽤的头⽂件 3. STM32的IO⼝可以由软件配置成如下8种模式(4种输⼊模式,4种输出模式) 分别在CRL寄存器和CRH寄存器中配置,配置每⼀个IO⼝需要4位来配置 2位MODE位----配置是输⼊模式还是输出模式 2位CNF位---根据MODE位的配置来确定是哪种输⼊模式或输出模式 a。

输⼊浮空 b。

输⼊上拉 c。

输⼊下拉 d。

模拟输⼊ e。

开漏输出 f。

推挽输出 g。

推挽式复⽤功能 h。

开漏复⽤功能 配置函数 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); 4。

GPIO输⼊值的读取 IDR是⼀个端⼝输⼊数据寄存器,只⽤了低16位。

操作IDR寄存器读取IO端⼝数据是通过GPIO_ReadInputDataBit函数实现的: uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); ⽐如我要读 GPIOA.5 的电平状态,那么⽅法是: GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5); uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); 5. 往某个IO⼝输出数据 ODR 是⼀个端⼝输出数据寄存器,也只⽤了低 16 位。

该寄存器为可读写,从该寄存器读出来的数据可以⽤于判断当前 IO ⼝的输出状态。

⽽向该寄存器写数据,则可以控制某个 IO ⼝的输出电平。

在固件库中设置 ODR 寄存器的值来控制 IO ⼝的输出状态是通过函数 GPIO_Write 来实现的: void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal); 该函数⼀般⽤来往⼀次性⼀个 GPIO 的多个端⼝设值。

keilc与跑马灯

keilc与跑马灯
Keil
第8章
C语言应用
第8章
C语言应用
工程窗口寄存器页
存储器窗口

显示连接状态及 监控程序版本号
第8章
C语言应用
4.1常用调试命令
Debug 菜单上的大部份命令可以在此找到对应的快捷按钮,从左到右依次是复位、运行、暂 停、单步、过程单步、执行完当前子程序、运行到当前行、下一状态、打开跟踪、观察 跟踪、反汇编窗口、观察窗口、代码作用范围分析、1#串行窗口、内存窗口、性能分析、 工具按钮等命令。
第8章
C语言应用
•使用菜单STEP 或相应的命令按钮或使用快捷键F11 可以
单步执行程序。
•使用菜单STEP OVER 或功能键F10 可以以过程单步形式 执行命令,所谓过程单步,是指将汇编语言中的子程序或 高级语言中的函数作为一个语句来全速执行。 •跳出当前函数或子程序。 •直接运行到光标处。 通过单步执行程序,可以找出一些问题的所在,但是仅依 靠单步执行来查错有时是困难的,或虽能查出错误但效率 很低,为此必须辅之以其它的方法,如过程单步,中断等。
C语言应用

一、项目初始化
在项目开发中,并不是仅有一个源程序就行了,还要 为这个项目选择CPU(Keil 支持数百种CPU,而这些CPU 的 特性并不完全相同),确定编译、汇编、连接的参数,指定 调试的方式,有一些项目还会有多个文件组成等,为管理和 使用方便,Keil 使用工程(Project)这一概念,将这些参数 设置和所需的所有文件都加在一个工程中,只能对工程而不 能对单一的源程序进行编译(汇编)和连接等操作,下面我
们就一步一步地来建立工程。
第8章
C语言应用
创建新项目
单击Project菜单, 在弹出的下拉菜单 中选中New Project 选项

菜鸟学STM32之跑马灯

菜鸟学STM32之跑马灯

菜鸟学STM32之跑马灯微信公众号:⼩樊Study关注共同学习,问题或建议,请公众号留⾔作为⼀名程序员,在初步学习编程想必都绕不开⼀个最为基础的⼊门级⽰例“Hello World”,那么,在学习单⽚机时,最基础的⼊门⽰例是什么呢?没错,那就是“点亮⼀盏LED灯”本次将通过⼀个经典的跑马灯程序,带⼤家开启 STM32F4 之旅,通过本次的学习,你将了解到STM32F4 的 IO ⼝作为输出使⽤的⽅法。

我们将通过代码控制STM32F4 开发板上的两个 LED:DS0 和 DS1 交替闪烁,实现类似跑马灯的效果。

硬件连接GPIO⼯作⽅式4种输⼊模式:输⼊浮空输⼊上拉输⼊下拉模拟输⼊4种输出模式:开漏输出(带上拉或者下拉)开漏复⽤功能(带上拉或者下拉)推挽式输出(带上拉或者下拉)推挽式复⽤功能(带上拉或者下拉)4种最⼤输出速度:-2MHZ-25MHz-50MHz-100MHz软件设计led.c#include "led.h"////////////////////////////////////////////////////////////////////////////////////初始化PF9和PF10为输出⼝.并使能这两个⼝的时钟//LED IO初始化void LED_Init(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟//GPIOF9,F10初始化设置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//LED0和LED1对应IO⼝GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIOGPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置⾼,灯灭}该代码⾥⾯就包含了⼀个函数 void LED_Init(void),该函数的功能就是⽤来实现配置 PF9和 PF10 为推挽输出。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档