如何使用汇编中端口c引脚0的按钮?

时间:2017-02-26 10:21:07

标签: button assembly input arm embedded

我试着编写一些代码,但我是初学者在装配时我无法完成我想在按下按钮时闪烁2个指示灯。我可以在没有按钮的情况下使LED闪烁,但我无法使用按钮。

@ STM32F107 - 装配模板

.thumb
.syntax unified

@保留STACKINIT变量。     .equ STACKINIT,0x20008000     .equ DELAY,80000

.equ     RCC_APB2ENR,   0x40021018      @ 
.equ     GPIOD_CRL,     0x40011400      @ D portuna clock
.equ     GPIOD_ODR,     0x4001140C      @ D portunu output olarak belirledik 0x0C offset
.equ     GPIOC_CRL,     0x40011000      @ C portuna clock 
.equ     GPIOC_IDR,     0x40011008      @ C portunu input olarak belirledik 0x08 offset

.section .text

.word    STACKINIT
.word    _start + 1

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ Main代码从这里开始 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

_start:

LDR R6, = RCC_APB2ENR  @ Load peripheral clock enable regiser
LDR R5, [R6]           @ Read its content
ORR R5, 0x00000020     @ Buranın nasıl bulunacağını biliyorum portlara göre - Bit( A 2 B 3 C 4 D 5 ...)
STR R5, [R6]           @ Store back the result in Perihperal clock enable register

@ Make GIOOD Pin1 as output pin (Page 170 from RM0008)
LDR R6, = GPIOD_CRL    @ Load GPIOD control register low  (Pin1 is in CRL register)
LDR R5, = 0x22222222   @ hepsi output yap
STR R5, [R6]           @ Store back the result in GPIOD control register low

@ Enable GPIOC Peripheral Clock (
LDR R6, = RCC_APB2ENR  
LDR R5, [R6]           
ORR R5, 0x00000010  @ c portu    
STR R5, [R6]           

@ Make GIOOC Pins as input pin 
LDR R6, = GPIOC_CRL    
LDR R5, = 0x11111111   @ hepsi input mu oldu butonların bilmiyorum ?
STR R5, [R6]           

dongu:

LDR R6, = GPIOC_IDR    
LDR R5, = 0x00000001   
STR R5, [R6]           

BTFSC GPIOC,1
GOTO dongu


@ Set GIOOD Pin1 to 1 (Page 172 from RM0008)
LDR R6, = GPIOD_ODR    @ Load GPIOD output data register
LDR R5, = 0x00000001   @ 1. lede elaktirik ver :)
STR R5, [R6]           @ Store back the result in GPIOD output data register


LDR R1, = 1460000

循环:     SUBS R1,1     BNE循环

LDR R6, = GPIOD_ODR    @ Load GPIOD output data register
LDR R5, = 0x00000002   @ 2. LED
STR R5, [R6]  


LDR R1, = 1460000

LOOP1:     SUBS R1,1     BNE loop1     B dongu

1 个答案:

答案 0 :(得分:0)

两个问题,我认为您将端口C配置为输出而不是输入。模式应该是00而不是01.并且汇编程序应该捕获一个错字,你不想要0x40011008而不是0x4001108h作为端口c IDR的地址吗?只要端口c引脚0不是该规则的例外,端口应该重置为输入,只要端口c引脚0不是例外(我没有在寄存器描述中看到异常,它默认为0x44444444,这是所有端口都是数字的输入)您可以在RCC中启用端口C后轮询IDR。