汇编语言代码段
.text
.global _start
_start:
LED13_INIT:
/**********LED1\3点灯**************/
/**********RCC章节**************/
@ 1.设置GPIO始终使能 通过RCC_AHB4ENSRTR寄存器设置0x50000A28[4]=1
ldr r0,=0x50000A28 @准备一块地址空间
ldr r1,[r0] @将r0指向的地址空间中内容读到目标寄存器中
orr r1,r1,#(0x01<<4)
str r1,[r0] @将r1寄存器中的值写到r0指向的地址空间中
/***********GPIO***************/
@1.设置PE10 PE8引脚为输出模式
ldr r0,=0x50006000 @准备一块地址空间
ldr r1,[r0]
bic r1,r1,#(0x03<<20)
bic r1,r1,#(0x03<<16)
orr r1,r1,#(0x01<<20)
orr r1,r1,#(0x01<<16)
str r1,[r0] @将r1寄存器中的值写到r0指向的地址空间中
@2.设置PE10 PE8引脚为推挽输出
ldr r0,=0x50006004 @准备一块地址空间
ldr r1,[r0]
bic r1,r1,#(0x01<<10)
bic r1,r1,#(0x01<<8)
str r1,[r0] @将r1寄存器中的值写到r0指向的地址空间中
@3.设置PE10 PE8引脚为低速输出
ldr r0,=0x50006008 @准备一块地址空间
ldr r1,[r0]
bic r1,r1,#(0x03<<20)
bic r1,r1,#(0x03<<16)
str r1,[r0] @将r1寄存器中的值写到r0指向的地址空间中
@4.设置PE10 PE8引脚为禁止上下拉电阻
ldr r0,=0x5000600c @准备一块地址空间
ldr r1,[r0]
bic r1,r1,#(0x03<<20)
bic r1,r1,#(0x03<<16)
str r1,[r0] @将r1寄存器中的值写到r0指向的地址空间中
LED2_INIT:
/**********LED2点灯 PF10**************/
/**********RCC章节**************/
@ 1.设置GPIO始终使能 通过RCC_AHB4ENSRTR寄存器设置0x50000A28[5]=1
ldr r0,=0x50000A28 @准备一块地址空间
ldr r1,[r0] @将r0指向的地址空间中内容读到目标寄存器中
orr r1,r1,#(0x01<<5)
str r1,[r0] @将r1寄存器中的值写到r0指向的地址空间中
/***********GPIO***************/
@1.设置PF10引脚为输出模式
ldr r0,=0x50007000 @准备一块地址空间
ldr r1,[r0]
bic r1,r1,#(0x03<<20)
orr r1,r1,#(0x01<<20)
str r1,[r0] @将r1寄存器中的值写到r0指向的地址空间中
@2.设置PF10引脚为推挽输出
ldr r0,=0x50007004 @准备一块地址空间
ldr r1,[r0]
bic r1,r1,#(0x01<<10)
str r1,[r0] @将r1寄存器中的值写到r0指向的地址空间中
@3.设置PF10引脚为低速输出
ldr r0,=0x50007008 @准备一块地址空间
ldr r1,[r0]
bic r1,r1,#(0x03<<20)
str r1,[r0] @将r1寄存器中的值写到r0指向的地址空间中
@4.设置PF10引脚为禁止上下拉电阻
ldr r0,=0x5000700c @准备一块地址空间
ldr r1,[r0]
bic r1,r1,#(0x03<<20)
str r1,[r0] @将r1寄存器中的值写到r0指向的地址空间中
Loop:
bl LED13_ON
bl LED2_ON
bl delay_1s
bl LED13_OFF
bl LED2_OFF
bl delay_1s
bl Loop
LED13_ON:
@5.设置使能
ldr r0,=0x50006014 @准备一块地址空间
ldr r1,[r0]
orr r1,r1,#(0x01<<10)
orr r1,r1,#(0x01<<8)
str r1,[r0] @将r1寄存器中的值写到r0指向的地址空间中
mov pc,lr
LED13_OFF:
@5.设置使能
ldr r0,=0x50006014 @准备一块地址空间
ldr r1,[r0]
and r1,r1,#(~(0x01<<10))
and r1,r1,#(~(0x01<<8))
str r1,[r0] @将r1寄存器中的值写到r0指向的地址空间中
mov pc,lr
LED2_ON:
@5.设置使能
ldr r0,=0x50007014 @准备一块地址空间
ldr r1,[r0]
orr r1,r1,#(0x01<<10)
str r1,[r0] @将r1寄存器中的值写到r0指向的地址空间中
mov pc,lr
LED2_OFF:
@5.设置使能
ldr r0,=0x50007014 @准备一块地址空间
ldr r1,[r0]
and r1,r1,#(~(0x01<<10))
str r1,[r0] @将r1寄存器中的值写到r0指向的地址空间中
mov pc,lr
@ 大概1s的延时函数
delay_1s:
mov r3, #0x10000000
mm:
cmp r3, #0
subne r3, r3, #1
bne mm
mov pc, lr
.end
实现功能展示,间隔1秒实现循环亮灭
C语言编写
头文件
#ifndef __LED_H__
#define __LED_H__
//寄存器封装
typedef struct{
volatile unsigned int MODER; //设置为输出模式00
volatile unsigned int OTYPER; //设置为推挽模式04
volatile unsigned int OSPEEDR; //设置为低速输出 08
volatile unsigned int PUPDR; //设置为不需要上下拉电阻 0C
volatile unsigned int IDR; //10
volatile unsigned int ODR; //设置使能 14
}gpio_t;
//LED1---->PE10
void Led13_init();
void Led13_on();
void Led13_off();
void Led2_init();
void Led2_on();
void Led2_off();
#endif
功能文件
#include "led.h"
#define GPIOE (*(gpio_t *)0x50006000)
#define GPIOF (*(gpio_t *)0x50007000)
#define RCC_AHB4_ENSETR (*(volatile unsigned int*)0x50000A28)
void Led13_init()
{
RCC_AHB4_ENSETR |=(0x1<<4);
GPIOE.MODER &= (~(0x03<<20)); //20-21位清零在将20位置1
GPIOE.MODER &= (~(0x03<<16)); //20-21位清零在将20位置1
GPIOE.MODER |= (0x01<<20); //20-21位清零在将20位置1
GPIOE.MODER |= (0x01<<16); //20-21位清零在将20位置1
GPIOE.OTYPER &=(~(0X01<<10));
GPIOE.OTYPER &=(~(0X01<<8));
GPIOE.OSPEEDR &=(~(0X03<<20));
GPIOE.OSPEEDR &=(~(0X03<<16));
GPIOE.PUPDR &=(~(0X01<<20));
GPIOE.PUPDR &=(~(0X01<<16));
return;
}
void Led13_on()
{
GPIOE.ODR |= (0X01<<10);
GPIOE.ODR |= (0X01<<8);
return;
}
void Led13_off()
{
GPIOE.ODR &=(~(0X01<<10));
GPIOE.ODR &=(~(0X01<<8));
return;
}
void Led2_init()
{
RCC_AHB4_ENSETR |=(0x1<<5);
GPIOF.MODER &= (~(0x03<<20)); //0-21位清零在将20位置1
GPIOF.MODER |= (0x01<<20); //20-21位清零在将20位置1
GPIOF.OTYPER &=(~(0X01<<10));
GPIOF.OSPEEDR &=(~(0X03<<20));
GPIOF.PUPDR &=(~(0X01<<20));
}
void Led2_on()
{
GPIOF.ODR |= (0X01<<10);
return;
}
void Led2_off()
{
GPIOF.ODR &=(~(0X01<<10));
return;
}
测试文件
#include "led.h"
extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{
int i,j;
for(i = 0; i < ms;i++)
for (j = 0; j < 1800; j++);
}
int main()
{
Led13_init(); // led灯初始化
Led2_init();
while(1)
{
Led13_on();
Led2_on();
delay_ms(1000);
Led13_off();
Led2_off();
delay_ms(1000);
}
return 0;
}
测试结果:实现功能展示,间隔1秒实现循环亮灭