STM32汇编语言 左右跑马灯

合集下载

汇编语言实现led灯的跑马灯

汇编语言实现led灯的跑马灯

汇编语⾔实现led灯的跑马灯led实验1.看原理图看设备⼯作的原理(可能需要阅读芯⽚⼿册),看设备与cpu的连接关系GPIO具有输⼊输出功能。

输⼊:cpu想知道io引脚是⾼电平还是低电平那么就是输⼊⽅式输出:cpu想控制io引脚为⾼电平还是低电平那么就是输出⽅式跟电流的⽅向没有任何关系2. cpu的相关章节GPJ2CON control是配置这个引脚是什么功能GPJ2有8个引脚,每个引脚由con寄存器中的4个位进⾏配置GPJ2DAT 如果cpu要输出⾼电平或者低电平,就需要设置该寄存器,只有8位有效When the port is configured as input port, the correspondingbit is the pin state. When the port is configured as outputport, the pin state is the same as the corresponding bit.When the port is configured as functional pin, the undefinedvalue will be read.当配置为输⼊模式的时候,dat寄存器中的某⼀位的值由引脚设置,引脚是⾼电平是,对应的位为1,引脚为低电平时,对应的位为0当配置为输出模式的时候,dat寄存器中的某⼀位控制引脚的电平,对应的位为1时,对应的引脚输出⾼电平,对应的位为0时,对应的引脚输出为低电平其他功能模式时,读到的值是未定义的。

@gec210 light first led.globl _start_start:ldr r0,=0xe0200280mov r1,#1<<4str r1,[r0] @config pin0 output modemov r1,#0str r1,[r0,#4] @output low levelb . @same as while(1);arm-linux-gcc -c led.S -o led.o //编译不链接arm-linux-ld -Ttext 0x30008000 led.o -o led.elf //链接指定代码段起始位置arm-linux-objcopy -O binary led.elf led.bin //⽣成⼆进制执⾏⽂件arm-linux-objdump -D led.elf > led.dis //⽣成反汇编代码uboot的⼏个常⽤命令printenv 打印显⽰环境变量ipaddr=192.168.1.4 //开发板的ipserverip=192.168.1.2 //tftp服务器的ip设置为各⾃的ip,只是设置到内存,掉电就没有setenv ipaddr 192.168.1.xsetenv serverip 192.168.1.xsaveenv //保存到flash中,再次启动后为刚刚设置的值ping //单向的,只能从开发板ping电脑alive表⽰⽹络是通的,not alive表⽰⽹络不通tftp 30008000 led.bin //下载⼆进制⽂件到内存0x30008000地址go 30008000 //跳转到0x30008000运⾏程序@gec210 light first led.globl _start_start:ldr r0,=0xe0200280ldr r1,=(1<<0 | 1<<4 | 1<<8 | 1<<12)str r1,[r0] @config pin0-pin3 output modemov r1,#0str r1,[r0,#4] @output low levelb . @same as while(1);简单的makefileAPP=led$(APP).bin:$(APP).oarm-linux-ld -Ttext 0x30008000 $^ -o $(APP).elf arm-linux-objcopy -O binary $(APP).elf $@ arm-linux-objdump -D $(APP).elf > $(APP).dis cp $@ /home/gec/tftp/%.o:%.sarm-linux-gcc $^ -c -o $@%.o:%.Sarm-linux-gcc $^ -c -o $@%.o:%.carm-linux-gcc $^ -c -o $@clean:@rm -f $(APP).bin $(APP).elf $(APP).dis *.o四个灯同时点亮或者同时熄灭循环闪烁@gec210 light first led.globl _start_start:ldr r0,=0xe0200280ldr r1,=(1<<0 | 1<<4 | 1<<8 | 1<<12)str r1,[r0] @config pin0-pin3 output mode loop:mov r1,#0str r1,[r0,#4] @output low levelbl delaymov r1,#0xfstr r1,[r0,#4]bl delayb loopb . @same as while(1);delay:mov r4,#0xff00000delay1:subs r4,r4,#1bne delay1mov pc,lr#define GPJ2CON (unsigned long *)0xe0200280unsigned long *p = (unsigned long *)0xe0200280;p练习:第1个灯到第4个灯依次点亮,第4个灯到第1个灯依次熄灭,循环。

STM32汇编语言 左右跑马灯

STM32汇编语言  左右跑马灯

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;; STM32 LED左右跑马灯实验;;8个LED接在PE口(PE[0..7]);;LED先向右跑,跑完再向左跑,不停左右跑动;;2011-5-3 by 追梦;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;BIT6 EQU 0X00000040GPIOE EQU 0X40011800 ;GPIOE 地址GPIOE_CRL EQU 0X40011800 ;低配置寄存器GPIOE_CRH EQU 0X40011804 ;高配置寄存器GPIOE_ODR EQU 0X4001180C ;输出,偏移地址0Ch GPIOE_BSRR EQU 0X40011810 ;低置位,高清除偏移地址10h GPIOE_BRR EQU 0X40011814 ;清除,偏移地址14h IOPEEN EQU BIT6 ;GPIOE使能位RCC_APB2ENR EQU 0X40021018STACK_TOP EQU 0X20002000AREA RESET,CODE,READONLYDCD STACK_TOP ;MSP主堆栈指针DCD START ;复位,PC初始值ENTRY;指示开始执行STARTLDR R1,=RCC_APB2ENRLDR R0,[R1] ;读LDR R2,=IOPEENORR R0,R2 ;改STR R0,[R1] ;写,使能GPIOE时钟;PE[0..7] 8个引脚均设置成推挽式输出LDR R0,=0x33333333LDR R1,=GPIOE_CRLSTR R0,[R1]LDR R1,=GPIOE_ODRLDR R0,=0X7F ;初始时最高位点亮MOV R2,#0LOOPSTR R0,[R1]PUSH {R0}MOV R0,#300BL.W DELAY_NMS ;延时300msPOP {R0}ADD R2,#1CMP R2,#7BLE STA TE1CMP R2,#14BEQ RESTARTB STA TE2STA TE1 ;状态1,右循环移位BL.W ByteRor1 ;状态位右循环移一位B LOOPRESTARTMOV R2,#0STA TE2 ;状态2,左循环移位BL.W ByteRol1 ;状态位左循环移一位B LOOP;延时R0(ms),误差((R0-1)*4+12)/8us;延时较长时,误差小于0.1%DELAY_NMSPUSH {R1} ;2个周期DELAY_NMSLOOPSUB R0,#1MOV R1,#1000DELAY_ONEUSSUB R1,#1NOPNOPNOPCMP R1,#0BNE DELAY_ONEUSCMP R0,#0BNE DELAY_NMSLOOPPOP {R1}BX LR;子程序,将R0低八位右循环移一位,高位不变ByteRor1PUSH {R1,R2,R3}LDR R3,=0XFFFFFF00LSR R1,R0,#1AND R1,#0X0000007FAND R2,R0,#0X01LSL R2,#7ORR R1,R2AND R0,R3ORR R0,R1POP {R1,R2,R3}BX LR;子程序,将R0低八位左循环移一位,高位不变ByteRol1PUSH {R1,R2,R3}LDR R3,=0XFFFFFF00LSL R1,R0,#1AND R1,#0X000000FEAND R2,R0,#0X80LSR R2,#7ORR R1,R2AND R0,R3ORR R0,R1POP {R1,R2,R3}BX LREND。

2020年STM32实现跑马灯实验精编版

2020年STM32实现跑马灯实验精编版

6.1 STM32 IO简介本章将要实现的是控制ALIENTEK战舰STM32开发板上的两个LED实现一个类似跑马灯的效果,该实验的关键在于如何控制STM32的IO口输出。

了解了STM32的IO口如何输出的,就可以实现跑马灯了。

通过这一章的学习,你将初步掌握STM32基本IO口的使用,而这是迈向STM32的第一步。

这一章节因为是第一个实验章节,所以我们在这一章将讲解一些知识为后面的实验做铺垫。

为了小节标号与后面实验章节一样,这里我们不另起一节来讲。

在讲解STM32的GPIO之前,首先打开我们光盘的第一个固件库版本实验工程跑马灯实验工程(光盘目录为:“4,程序源码\标准例程-V3.5库函数版本\实验1跑马灯/USER/LED.Uv2”),可以看到我们的实验工程目录:图6.1.1 跑马灯实验目录结构接下来我们逐一讲解一下我们的工程目录下面的组以及重要文件。

①组FWLib下面存放的是ST官方提供的固件库函数,里面的函数我们可以根据需要添加和删除,但是一定要注意在头文件stm32f10x_conf.h文件中注释掉删除的源文件对应的头文件,这里面的文件内容用户不需要修改。

②组CORE下面存放的是固件库必须的核心文件和启动文件。

这里面的文件用户不需要修改。

③组SYSTEM是ALIENTEK提供的共用代码,这些代码的作用和讲解在第五章都有讲解,大家可以翻过去看下。

④组HARDWARE下面存放的是每个实验的外设驱动代码,他的实现是通过调用FWLib下面的固件库文件实现的,比如led.c里面调用stm32f10x_gpio.c里面的函数对led进行初始化,这里面的函数是讲解的重点。

后面的实验中可以看到会引入多个源文件。

⑤组USER下面存放的主要是用户代码。

但是system_stm32f10x.c文件用户不需要修改,同时stm32f10x_it.c里面存放的是中断服务函数,这两个文件的作用在3.1节有讲解,大家可以翻过去看看。

STM32实现跑马灯实验

STM32实现跑马灯实验

6.1 STM32 IO简介本章将要实现的是控制ALIENTEK战舰STM32开发板上的两个LED实现一个类似跑马灯的效果,该实验的关键在于如何控制STM32的IO口输出。

了解了STM32的IO口如何输出的,就可以实现跑马灯了。

通过这一章的学习,你将初步掌握STM32基本IO口的使用,而这是迈向STM32的第一步。

这一章节因为是第一个实验章节,所以我们在这一章将讲解一些知识为后面的实验做铺垫。

为了小节标号与后面实验章节一样,这里我们不另起一节来讲。

在讲解STM32的GPIO之前,首先打开我们光盘的第一个固件库版本实验工程跑马灯实验工程(光盘目录为:“4,程序源码\标准例程-V3.5库函数版本\实验1跑马灯/USER/LED.Uv2”),可以看到我们的实验工程目录:图6.1.1 跑马灯实验目录结构接下来我们逐一讲解一下我们的工程目录下面的组以及重要文件。

①组FWLib下面存放的是ST官方提供的固件库函数,里面的函数我们可以根据需要添加和删除,但是一定要注意在头文件stm32f10x_conf.h文件中注释掉删除的源文件对应的头文件,这里面的文件内容用户不需要修改。

②组CORE下面存放的是固件库必须的核心文件和启动文件。

这里面的文件用户不需要修改。

③组SYSTEM是ALIENTEK提供的共用代码,这些代码的作用和讲解在第五章都有讲解,大家可以翻过去看下。

④组HARDWARE下面存放的是每个实验的外设驱动代码,他的实现是通过调用FWLib下面的固件库文件实现的,比如led.c里面调用stm32f10x_gpio.c里面的函数对led进行初始化,这里面的函数是讲解的重点。

后面的实验中可以看到会引入多个源文件。

⑤组USER下面存放的主要是用户代码。

但是system_stm32f10x.c文件用户不需要修改,同时stm32f10x_it.c里面存放的是中断服务函数,这两个文件的作用在3.1节有讲解,大家可以翻过去看看。

stm32跑马灯实验

stm32跑马灯实验

29:28, 25:24, 21:20, 17:16, 13:12, 9:8, 5:4, 1:0位(MODy)为:端口模式位(y = 8…15) (Port x mode bits) 00:输入模式(复位后的状态) 01:输出模式,最大速度10MHz 10:输出模式,最大速度2MHz 11:输出模式,最大速度50MHz
给个实例,比如我们要设置PORTC的11位为上拉输入,12位为推挽输出。代码如下: GPIOC->CRH&=0XFFF00FFF;//清掉这2个位原来的设置,同时也不影响其他位的设置 GPIOC->CRH|=0X00038000; //PC11输入,PC12输出 GPIOC->ODR=1<<11;//PC11上拉 通过这 3 句话的配置,我们就设置了 PC11 为上拉输入,PC12 为推挽输出。
详见上面端口模式配置表
该寄存器的复位值为0X4444 4444,从上图可以看到,复位值其实就是配置端口为浮空输入模式。从上图还可 以得出:STM32的CRL控制着每个IO端口(A~G)的低8位的模式。每个IO端口的位占用CRL的4个位,高两位为 CNF,低两位为MODE。这里我们可以记住几个常用的配置,比如0X4表示模拟输入模式(ADC用)、0X3表示推 挽输出模式(做输出口用,50M速率)、0X8表示上/下拉输入模式(做输入口用)、0XB表示复用输出(使用IO口 的第二功能,50M速率)。
对于 I2C 接口,假如使用 400k 波特率,若想把余量留大些,那么用 2M 的 GPIO 的引脚速度或许不够,这时可以选 用 10M 的 GPIO 引脚速度。 对于 SPI 接口,假如使用 18M 或 9M 波特率,用 10M 的 GPIO 的引脚速度显然不够了,需要选用 50M 的 GPIO 的引脚 速度。 除此之外,使用端口设置时,有以下几点需要注意: GPIO 口设为输入时,输出驱动电路与端口是断开,所以输出速度配置无意义。 在复位期间和刚复位后,复用功能未开启,I/O 端口被配置成浮空输入模式。 所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。 GPIO 口的配置具有上锁功能,当配置好 GPIO 口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。

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

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

实验三跑马灯实验实验目的:通过一个经典的跑马灯程序,了解STM32F1 的IO 口作为输出使用的方法。

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

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

DS0 接PB5,DS1 接PE5。

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

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

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

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

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

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

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

STM32F1 第6讲 手把手编写跑马灯实验-库函数-M3

STM32F1 第6讲 手把手编写跑马灯实验-库函数-M3
2个读取输出电平函数:
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
4个设置输出电平函数:
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal); void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
STM32F1xx官方资料:
《STM32中文参考手册V10》-第8章通用和复用功能IO(GPIO和AFIO)
✓ 回顾GPIO基础知识
4种输入模式:
输入浮空 输入上拉 输入下拉 模拟输入
4种输出模式:
开漏输出 开漏复用功能 推挽式输出 推挽式复用功能
3种最大输出速度:
-2MHZ -10MHz -50MHz
GPIOx: GPIOA~GPIOG
typedef struct
{
uint16_t GPIO_Pin;
//指定要初始化的IO口
GPIOSpeed_TypeDef GPIO_Speed; //设置IO口输出速度
GPIOMode_TypeDef GPIO_Mode; //设置工作模式:8种中的一个
}GPIO_InitTypeDef;

基于STM32的跑马灯实验的详细解析

基于STM32的跑马灯实验的详细解析

程序编写 一,程序的实现: 使开发板上的 LED1,LED2,LED3,LED4 循环点亮,实现流水灯效果。
硬件电路图: 二,编写 LED 子程序 1, led.h 头文件 2, led.c 源文件 3, 在 led.c 中如何使能 GPIO 时钟 (1)在库文件 rcc.hk 中找到”RCC_AHB1PeriphClockCmd(); “并将其复制 粘贴下来
成第一个入口函数如下:
(2)第二个入口参数,是个结构体
先将它复制粘贴下来,去掉*号,进行定义这个结构体:
完成第二个入口参数:
(3)用结re 加点来进行各类型的寄存器配置:
配置 GPIO_Mode 寄存器,点击 GPIO_Mode,右键 Go
To
Definition………查询如下:
再点击 GPIOMode_TypeDef,查询如下:
选择合适的类型,将其复制粘贴下来,完成 GPIO_Mode 的配置:
完成 GPIO 的配置:
三, 编写 main 函数
2, 重要的 GPIO 库函数 (1)GPIO 初始化函数 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); (2)设置电平输出函数 输出高电平: void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 输出低电平: void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
基于 STM32 的跑马灯实验的详细解析
我们用 C 语言来再学习 STM32,以加深理解,并且应用相关资料和官方 固件标准库。因此,我们来编写一个跑马灯实验 先前准备 一, 开发环境 安装 MDK5,并且导入 STM32 官方标准库。 STM32 官方标准库名称:stm32f4_dsp_stdperiph_lib 这个 STM32 官方固件标准库以前是可以在 ST 官网下载,现在好像在官 网上找不到了。 二,相关应用资料:STM32F4XX 中文参考手册
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;; STM32 LED左右跑马灯实验
;;8个LED接在PE口(PE[0..7])
;;LED先向右跑,跑完再向左跑,不停左右跑动
;;2011-5-3 by 追梦;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BIT6 EQU 0X00000040
GPIOE EQU 0X40011800 ;GPIOE 地址
GPIOE_CRL EQU 0X40011800 ;低配置寄存器
GPIOE_CRH EQU 0X40011804 ;高配置寄存器
GPIOE_ODR EQU 0X4001180C ;输出,偏移地址0Ch GPIOE_BSRR EQU 0X40011810 ;低置位,高清除偏移地址10h GPIOE_BRR EQU 0X40011814 ;清除,偏移地址14h IOPEEN EQU BIT6 ;GPIOE使能位
RCC_APB2ENR EQU 0X40021018
STACK_TOP EQU 0X20002000
AREA RESET,CODE,READONLY
DCD STACK_TOP ;MSP主堆栈指针
DCD START ;复位,PC初始值
ENTRY;指示开始执行
START
LDR R1,=RCC_APB2ENR
LDR R0,[R1] ;读
LDR R2,=IOPEEN
ORR R0,R2 ;改
STR R0,[R1] ;写,使能GPIOE时钟
;PE[0..7] 8个引脚均设置成推挽式输出
LDR R0,=0x33333333
LDR R1,=GPIOE_CRL
STR R0,[R1]
LDR R1,=GPIOE_ODR
LDR R0,=0X7F ;初始时最高位点亮
MOV R2,#0
LOOP
STR R0,[R1]
PUSH {R0}
MOV R0,#300
BL.W DELAY_NMS ;延时300ms
POP {R0}
ADD R2,#1
CMP R2,#7
BLE STA TE1
CMP R2,#14
BEQ RESTART
B STA TE2
STA TE1 ;状态1,右循环移位BL.W ByteRor1 ;状态位右循环移一位
B LOOP
RESTART
MOV R2,#0
STA TE2 ;状态2,左循环移位BL.W ByteRol1 ;状态位左循环移一位
B LOOP
;延时R0(ms),误差((R0-1)*4+12)/8us
;延时较长时,误差小于0.1%
DELAY_NMS
PUSH {R1} ;2个周期
DELAY_NMSLOOP
SUB R0,#1
MOV R1,#1000
DELAY_ONEUS
SUB R1,#1
NOP
NOP
NOP
CMP R1,#0
BNE DELAY_ONEUS
CMP R0,#0
BNE DELAY_NMSLOOP
POP {R1}
BX LR
;子程序,将R0低八位右循环移一位,高位不变ByteRor1
PUSH {R1,R2,R3}
LDR R3,=0XFFFFFF00
LSR R1,R0,#1
AND R1,#0X0000007F
AND R2,R0,#0X01
LSL R2,#7
ORR R1,R2
AND R0,R3
ORR R0,R1
POP {R1,R2,R3}
BX LR
;子程序,将R0低八位左循环移一位,高位不变ByteRol1
PUSH {R1,R2,R3}
LDR R3,=0XFFFFFF00
LSL R1,R0,#1
AND R1,#0X000000FE
AND R2,R0,#0X80
LSR R2,#7
ORR R1,R2
AND R0,R3
ORR R0,R1
POP {R1,R2,R3}
BX LR
END。

相关文档
最新文档