一、C语言编程
1.先创建一个新的工程
2.文件名
3.右键Source Group创建一个.c文件
4.在.c文件中放入以下代码
//--------------APB2使能时钟寄存器------------------------
#define RCC_AP2ENR *((unsigned volatile int*)0x40021018)
//----------------GPIOA配置寄存器 ------------------------
#define GPIOA_CRL *((unsigned volatile int*)0x40010800)
#define GPIOA_ORD *((unsigned volatile int*)0x4001080C)
//----------------GPIOB配置寄存器 ------------------------
#define GPIOB_CRH *((unsigned volatile int*)0x40010C04)
#define GPIOB_ORD *((unsigned volatile int*)0x40010C0C)
//----------------GPIOC配置寄存器 ------------------------
#define GPIOC_CRH *((unsigned volatile int*)0x40011004)
#define GPIOC_ORD *((unsigned volatile int*)0x4001100C)
//-------------------简单的延时函数-----------------------
void Delay_ms( volatile unsigned int t)
{
unsigned int i;
while(t--)
for (i=0;i<800;i++);
}
void A_LED_LIGHT(){
GPIOA_ORD=0x0<<7; //PA7低电平
GPIOB_ORD=0x1<<9; //PB9高电平
GPIOC_ORD=0x1<<15; //PC15高电平
}
void B_LED_LIGHT(){
GPIOA_ORD=0x1<<7; //PA7高电平
GPIOB_ORD=0x0<<9; //PB9低电平
GPIOC_ORD=0x1<<15; //PC15高电平
}
void C_LED_LIGHT(){
GPIOA_ORD=0x1<<7; //PA7高电平
GPIOB_ORD=0x1<<9; //PB9高电平
GPIOC_ORD=0x0<<15; //PC15低电平
}
//------------------------主函数--------------------------
int main()
{
int j=100;
RCC_AP2ENR|=1<<2; //APB2-GPIOA外设时钟使能
RCC_AP2ENR|=1<<3; //APB2-GPIOB外设时钟使能
RCC_AP2ENR|=1<<4; //APB2-GPIOC外设时钟使能
//这两行代码可以合为 RCC_APB2ENR|=1<<3|1<<4;
GPIOA_CRL&=0x0FFFFFFF; //设置位 清零
GPIOA_CRL|=0x20000000; //PA7推挽输出
GPIOA_ORD|=1<<7; //设置PA7初始灯为灭
GPIOB_CRH&=0xFFFFFF0F; //设置位 清零
GPIOB_CRH|=0x00000020; //PB9推挽输出
GPIOB_ORD|=1<<9; //设置初始灯为灭
GPIOC_CRH&=0x0FFFFFFF; //设置位 清零
GPIOC_CRH|=0x30000000; //PC15推挽输出
GPIOC_ORD|=0x1<<15; //设置初始灯为灭
while(j)
{
A_LED_LIGHT();
Delay_ms(10000000);
B_LED_LIGHT();
Delay_ms(10000000);
C_LED_LIGHT();
Delay_ms(10000000);
}
}
5.点击build,在Objects文件夹中生成一个hex文件,这个是下载到板子中的程序
6.打开FlyMcu,将bps改为256000,点击检索窜口,选择空闲的,点击开始编程,可以看到命令执行完毕,成功下载到板子里面
7.运行结果
二、汇编语言
1.新建一个工程,步骤和上面一致,不过只需要勾选CORE,其余步骤与C语言一样
2.代码部分
RCC_APB2ENR EQU 0x40021018;
GPIOC_CRH EQU 0x40011004;
GPIOC_ORD EQU 0x4001100c;
GPIOA_CRL EQU 0x40010800;
GPIOA_ORD EQU 0x4001080C;
GPIOB_CRH EQU 0x40010C04;
GPIOB_ORD EQU 0x40010C0C;
Stack_Size EQU 0x00000400;
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
AREA RESET, DATA, READONLY
__Vectors DCD __initial_sp
DCD Reset_Handler
AREA |.text|, CODE, READONLY
THUMB
REQUIRE8
PRESERVE8
ENTRY
Reset_Handler
bl LED_Init
MainLoop BL LED_ON_C
BL Delay
BL LED_OFF_C
BL Delay
BL LED_ON_A
BL Delay
BL LED_OFF_A
BL Delay
BL LED_ON_B
BL Delay
BL LED_OFF_B
BL Delay
B MainLoop
LED_Init
PUSH {R0,R1, LR}
LDR R0,=RCC_APB2ENR
ORR R0,R0,#0x1c
LDR R1,=RCC_APB2ENR
STR R0,[R1]
LDR R0,=GPIOA_CRL
BIC R0,R0,#0x0fffffff
LDR R1,=GPIOA_CRL
STR R0,[R1]
LDR R0,=GPIOA_CRL
ORR R0,#0x20000000
LDR R1,=GPIOA_CRL
STR R0,[R1]
MOV R0,#0x80
LDR R1,=GPIOA_ORD
STR R0,[R1]
;初始化GPIOB部分
LDR R0,=GPIOB_CRH
BIC R0,R0,#0xffffff0f
LDR R1,=GPIOB_CRH
STR R0,[R1]
LDR R0,=GPIOB_CRH
ORR R0,#0x00000020
LDR R1,=GPIOB_CRH
STR R0,[R1]
MOV R0,#0x200
LDR R1,=GPIOB_ORD
STR R0,[R1]
LDR R0,=GPIOC_CRH
BIC R0,R0,#0x0fffffff
LDR R1,=GPIOC_CRH
STR R0,[R1]
LDR R0,=GPIOC_CRH
ORR R0,#0x20000000
LDR R1,=GPIOC_CRH
STR R0,[R1]
MOV R0,#0x8000
LDR R1,=GPIOC_ORD
STR R0,[R1]
POP {R0,R1,PC}
LED_ON_A
PUSH {R0,R1, LR}
MOV R0,#0x00
LDR R1,=GPIOA_ORD
STR R0,[R1]
POP {R0,R1,PC}
LED_OFF_A
PUSH {R0,R1, LR}
MOV R0,#0x80
LDR R1,=GPIOA_ORD
STR R0,[R1]
POP {R0,R1,PC}
LED_ON_B
PUSH {R0,R1, LR}
MOV R0,#0x000
LDR R1,=GPIOB_ORD
STR R0,[R1]
POP {R0,R1,PC}
LED_OFF_B;熄灯
PUSH {R0,R1, LR}
MOV R0,#0x200
LDR R1,=GPIOB_ORD
STR R0,[R1]
POP {R0,R1,PC}
LED_ON_C;亮灯
PUSH {R0,R1, LR}
MOV R0,#0x0000
LDR R1,=GPIOC_ORD
STR R0,[R1]
POP {R0,R1,PC}
LED_OFF_C;熄灯
PUSH {R0,R1, LR}
MOV R0,#0x8000
LDR R1,=GPIOC_ORD
STR R0,[R1]
POP {R0,R1,PC}
Delay
PUSH {R0,R1, LR}
MOVS R0,#0
MOVS R1,#0
MOVS R2,#0
DelayLoop0
ADDS R0,R0,#1
CMP R0,#330
BCC DelayLoop0
MOVS R0,#0
ADDS R1,R1,#1
CMP R1,#330
BCC DelayLoop0
MOVS R0,#0
MOVS R1,#0
ADDS R2,R2,#1
CMP R2,#15
BCC DelayLoop0
POP {R0,R1,PC}
NOP
END
3.运行结果
三、总结
通过这次实验,我学会了如何使用汇编语言和C语言来点亮led流水灯,在经过这两次实验之后,对keil的使用也更加的熟练和熟悉了。在用FlyMcu烧录的时候,由于port没选对,一直没烧录成功,因为选到了已被占用的port,在这个地方卡了好久。
五、参考
伊始不觉
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)