在ARM架構下,stm32的流水燈可以用三種方法實作:
在這里只提供源代碼(不知道如何新建工程或者在Proteus內實作仿真的可以參照我的上一篇博客)
基于ARM,用匯編語言在Keil_V5和Proteus仿真下實作點燈操作
1、匯編語言直接對暫存器操作GPIO口
BIT4 EQU 0X00000010
GPIOC EQU 0X40011000
GPIOC_CRL EQU 0X40011000
GPIOC_CRH EQU 0X40011004
GPIOC_ODR EQU 0X4001100C
GPIOC_BSRR EQU 0X40011010
GPIOC_BRR EQU 0X40011014
IOPCEN EQU BIT4
RCC_APB2ENR EQU 0X40021018
AREA MYCODE, CODE
ENTRY
EXPORT __main
__main
LDR R1, =RCC_APB2ENR
LDR R0, [R1] ;讀
LDR R2, =IOPCEN ;進入IOPCEN的地址
ORR R0, R2 ;改
STR R0, [R1] ;寫,使能GPIOC時鐘
LOOP
MOV R0, #0x00000003
LDR R1, =GPIOC_CRL ;進入配置低暫存器
STR R0, [R1] ;對低四位進行操作,0011,推挽輸出,50MHZ
NOP
NOP
LDR R1, =GPIOC_ODR ;進入配置高暫存器
LDR R2, =0x0 ;輸出led0
STR R2,[R1] ;輸出狀態
MOV R0, #4500 ;4500/9=500ms
BL.W DELAY_NMS
EOR R2, #LED0
MOV R0, #0x00000030 ;對高四位進行操作
LDR R1, =GPIOC_CRL
STR R0, [R1]
NOP
NOP
LDR R1, =GPIOC_ODR
LDR R2, =0x1 ;輸出led1
STR R2,[R1]
MOV R0, #4500
BL.W DELAY_NMS
EOR R2, #LED0
MOV R0, #0x00000300
LDR R1, =GPIOC_CRL
STR R0, [R1]
NOP
NOP
LDR R1, =GPIOC_ODR
LDR R2, =0x2 ;輸出led2
STR R2,[R1]
MOV R0, #4500
BL.W DELAY_NMS
EOR R2, #LED0
MOV R0, #0x00003000
LDR R1, =GPIOC_CRL
STR R0, [R1]
NOP
NOP
LDR R1, =GPIOC_ODR
LDR R2, =0x4 ;輸出led3
STR R2,[R1]
MOV R0, #4500
BL.W DELAY_NMS
EOR R2, #LED0
MOV R0, #0x00030000
LDR R1, =GPIOC_CRL
STR R0, [R1]
NOP
NOP
LDR R1, =GPIOC_ODR
LDR R2, =0x8 ;輸出led4
STR R2,[R1]
MOV R0, #4500
BL.W DELAY_NMS
EOR R2, #LED0
MOV R0, #0x00300000
LDR R1, =GPIOC_CRL
STR R0, [R1]
NOP
NOP
LDR R1, =GPIOC_ODR
LDR R2, =0x10 ;輸出led5
STR R2,[R1]
MOV R0, #4500
BL.W DELAY_NMS
EOR R2, #LED0
MOV R0, #0x03000000
LDR R1, =GPIOC_CRL
STR R0, [R1]
NOP
NOP
LDR R1, =GPIOC_ODR
LDR R2, =0x20 ;輸出led6
STR R2,[R1]
MOV R0, #4500
BL.W DELAY_NMS
EOR R2, #LED0
MOV R0, #0x30000000
LDR R1, =GPIOC_CRL
STR R0, [R1]
NOP
NOP
LDR R1, =GPIOC_ODR
LDR R2, =0x40 ;輸出led7
STR R2,[R1]
MOV R0, #4500
BL.W DELAY_NMS
EOR R2, #LED0
B LOOP
DELAY_NMS
PUSH {R1} ;2T
DELAY_NMSLOOP
SUB R0, #1
MOV R1,#100
DELAY_ONEUS
SUB R1, #1
NOP
NOP
NOP
CMP R1, #0
BNE DELAY_ONEUS
CMP R0, #0
BNE DELAY_NMSLOOP
POP {R1}
BX LR
NOP
END
2、C語言直接對暫存器操作GPIO口
#include"stm32f10x.h"
void delay_ms(unsigned short Number);
#define RCC_APB2Periph_GPIOC ((uint32_t)0x00000010)
int main(void)
{
while(1)
{
RCC->APB2ENR |=RCC_APB2Periph_GPIOC;
GPIOC->CRL &=0XFFFFFFF0;
GPIOC->CRL |=0X00000003;
GPIOC->ODR &=~(0x1);
delay_ms(50);
GPIOC->ODR |=0x1;
delay_ms(50);
GPIOC->CRL &=0XFFFFFF0F;
GPIOC->CRL |=0X00000030;
GPIOC->ODR &=~(0x2);
delay_ms(50);
GPIOC->ODR |=0x2;
delay_ms(50);
GPIOC->CRL &=0XFFFFF0FF;
GPIOC->CRL |=0X00000300;
GPIOC->ODR &=~(0x4);
delay_ms(50);
GPIOC->ODR |=0x4;
delay_ms(50);
GPIOC->CRL &=0XFFFF0FFF;
GPIOC->CRL |=0X00003000;
GPIOC->ODR &=~(0x8);
delay_ms(50);
GPIOC->ODR |=0x8;
delay_ms(50);
GPIOC->CRL &=0XFFF0FFFF;
GPIOC->CRL |=0X00030000;
GPIOC->ODR &=~(0x10);
delay_ms(50);
GPIOC->ODR |=0x10;
delay_ms(50);
GPIOC->CRL &=0XFF0FFFFF;
GPIOC->CRL |=0X00300000;
GPIOC->ODR &=~(0x20);
delay_ms(50);
GPIOC->ODR |=0x20;
delay_ms(50);
GPIOC->CRL &=0XF0FFFFFF;
GPIOC->CRL |=0X03000000;
GPIOC->ODR &=~(0x40);
delay_ms(50);
GPIOC->ODR |=0x40;
delay_ms(50);
GPIOC->CRL &=0X0FFFFFFF;
GPIOC->CRL |=0X30000000;
GPIOC->ODR &=~(0x80);
delay_ms(50);
GPIOC->ODR |=0x80;
delay_ms(50);
}
}
void delay_ms(unsigned short int Number)
{
unsigned int i;
while(Number--){
i=12000;while(i--);
}
}
3、使用標準韌體庫操作GPIO埠
如果出現未定義的錯誤,則在Define輸入USE_STDPERIPH_DRIVER

#include "stm32f10x.h"
void delay_ms(unsigned short int Number);
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //輸出模式,通用推挽輸出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //輸出速度50MHZ
GPIO_Init(GPIOC, &GPIO_InitStructure);
while(1)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_0); //LED0亮
GPIO_SetBits(GPIOC,GPIO_Pin_1);
GPIO_SetBits(GPIOC,GPIO_Pin_2);
GPIO_SetBits(GPIOC,GPIO_Pin_3);
GPIO_SetBits(GPIOC,GPIO_Pin_4);
GPIO_SetBits(GPIOC,GPIO_Pin_5);
GPIO_SetBits(GPIOC,GPIO_Pin_6);
GPIO_SetBits(GPIOC,GPIO_Pin_7);
delay_ms(40);
GPIO_SetBits(GPIOC,GPIO_Pin_0); //LED0滅
GPIO_ResetBits(GPIOC,GPIO_Pin_1); //LED1亮
GPIO_SetBits(GPIOC,GPIO_Pin_2);
GPIO_SetBits(GPIOC,GPIO_Pin_3);
GPIO_SetBits(GPIOC,GPIO_Pin_4);
GPIO_SetBits(GPIOC,GPIO_Pin_5);
GPIO_SetBits(GPIOC,GPIO_Pin_6);
GPIO_SetBits(GPIOC,GPIO_Pin_7);
delay_ms(40);
GPIO_SetBits(GPIOC,GPIO_Pin_0);
GPIO_SetBits(GPIOC,GPIO_Pin_1); //LED1滅
GPIO_ResetBits(GPIOC,GPIO_Pin_2);
GPIO_SetBits(GPIOC,GPIO_Pin_3);
GPIO_SetBits(GPIOC,GPIO_Pin_4);
GPIO_SetBits(GPIOC,GPIO_Pin_5);
GPIO_SetBits(GPIOC,GPIO_Pin_6);
GPIO_SetBits(GPIOC,GPIO_Pin_7);
delay_ms(40);
GPIO_SetBits(GPIOC,GPIO_Pin_0);
GPIO_SetBits(GPIOC,GPIO_Pin_1);
GPIO_SetBits(GPIOC,GPIO_Pin_2);
GPIO_ResetBits(GPIOC,GPIO_Pin_3);
GPIO_SetBits(GPIOC,GPIO_Pin_4);
GPIO_SetBits(GPIOC,GPIO_Pin_5);
GPIO_SetBits(GPIOC,GPIO_Pin_6);
GPIO_SetBits(GPIOC,GPIO_Pin_7);
delay_ms(40);
GPIO_SetBits(GPIOC,GPIO_Pin_0);
GPIO_SetBits(GPIOC,GPIO_Pin_1);
GPIO_SetBits(GPIOC,GPIO_Pin_2);
GPIO_SetBits(GPIOC,GPIO_Pin_3);
GPIO_ResetBits(GPIOC,GPIO_Pin_4);
GPIO_SetBits(GPIOC,GPIO_Pin_5);
GPIO_SetBits(GPIOC,GPIO_Pin_6);
GPIO_SetBits(GPIOC,GPIO_Pin_7);
delay_ms(40);
GPIO_SetBits(GPIOC,GPIO_Pin_0);
GPIO_SetBits(GPIOC,GPIO_Pin_1);
GPIO_SetBits(GPIOC,GPIO_Pin_2);
GPIO_SetBits(GPIOC,GPIO_Pin_3);
GPIO_SetBits(GPIOC,GPIO_Pin_4);
GPIO_ResetBits(GPIOC,GPIO_Pin_5);
GPIO_SetBits(GPIOC,GPIO_Pin_6);
GPIO_SetBits(GPIOC,GPIO_Pin_7);
delay_ms(40);
GPIO_SetBits(GPIOC,GPIO_Pin_0);
GPIO_SetBits(GPIOC,GPIO_Pin_1);
GPIO_SetBits(GPIOC,GPIO_Pin_2);
GPIO_SetBits(GPIOC,GPIO_Pin_3);
GPIO_SetBits(GPIOC,GPIO_Pin_4);
GPIO_SetBits(GPIOC,GPIO_Pin_5);
GPIO_ResetBits(GPIOC,GPIO_Pin_6);
GPIO_SetBits(GPIOC,GPIO_Pin_7);
delay_ms(40);
GPIO_SetBits(GPIOC,GPIO_Pin_0);
GPIO_SetBits(GPIOC,GPIO_Pin_1);
GPIO_SetBits(GPIOC,GPIO_Pin_2);
GPIO_SetBits(GPIOC,GPIO_Pin_3);
GPIO_SetBits(GPIOC,GPIO_Pin_4);
GPIO_SetBits(GPIOC,GPIO_Pin_5);
GPIO_SetBits(GPIOC,GPIO_Pin_6);
GPIO_ResetBits(GPIOC,GPIO_Pin_7);
delay_ms(40);
}
}
void delay_ms(unsigned short int Number)
{
unsigned int i;
while(Number--){
i=12000;
while(i--);
}
}
以上三種方法都是直接控制八個燈,并未使用位移演算法,若有簡易的方法,煩請大家指教,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/277835.html
標籤:其他
上一篇:hive sql系列(總結)
