汇编实验:
STACK_TOP EQU 0x20002000 ; SP初始值,常数
NUM EQU 20
; Vector Table Mapped to Address 0 at Reset
AREA RESET, CODE, READONLY ;(段名为RESET)
DCD STACK_TOP ; Top of Stack
DCD START ; Reset Handler
ENTRY ; 指示程序从这里开始执行
START ; 主程序开始
LDR R0, =src ;从R0的地址(0x08000044)开始,先加载地址,在相应地址赋值,即在相应地址放入代码段里定义的值
LDR R1, =dst ;从R1的地址(0x2000000)开始,连续开辟一段空间(大小等于NUM),其值都为0
MOV R2, #NUM ;将立即数20放入R2(0x00000014)h
MOVS R3, R2, LSR #3 ;R3 <-(R2>>3) R3(0x00000002)h
BEQ COPYWORDS ;关系标志位(Z=1时跳转)R3(0x00000002)h
STMFD SP!, {R4-R11} ;//R4~R11全部为((0x00000000)h)
;从sp指针的位置,以地址递减储存的方式连续储存R4-R11 ,栈顶放的是LR
OCTCOPY
LDMIA.W R0!, {R4-R11} ; R4~R11 分别放入的是1~8
;从地址R0处读取多个字,并依次储存到R4-R11,每储存一个字后R0自增一次
STMIA.W R1!, {R4-R11} ; R4~R11的内容R1的地址(0x2000000)开始,依次放入
;从地址R1开始依次读取多个字,每次读取后R1自增一次
SUBS R3, R3, #1 ;R3=R3-1 并更新标志位
BNE OCTCOPY ; 条件:上一次操作时(z=0时跳转)
;第一次运行后R3(0x0000001)h;
;回到上部 OCTCOPY处从新执行,目的将剩余的数放入R4~R11中内容是9~16
;第二次运行后R3(0x0000000)h
LDMFD.W SP!, {R4-R11} ;将sp指针所指的内容赋值给R4~R11 目的将R4~R11清空
COPYWORDS
ANDS R2, R2, #7 ; number of odd words to copy
BEQ STOP ; 判断R2中的内容是否为1 此时R2(0x00000004)
WORDCOPY
LDR R3, [R0], #4; ; 【R0】赋值给R3; R0=R0+4; R3(0x0000012)h R0(0x0800008c)
STR R3, [R1], #4;0x20000040 ; store a word to the destination
SUBS R2, R2, #1 ; decrement the counter
bne WORDCOPY ; 循环完毕后从R1的地址连续储存三个数分别是 18 19 20
STOP
B . ; 工作完成后,进入无穷循环
;定义数据区
AREA mydata1, DATA, READONLY
src DCD 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
AREA mydata2, DATA, READWRITE
dst SPACE NUM
END ; 标记文件结束
LED闪烁:
#include "stm32f10x.h"
// pb5 led1
// pD6 led2
// pD3 led3
void rcc_configration()
{
SystemInit(); // 初始化系统硬件信息等
}
void led_configration()
{
GPIO_InitTypeDef GPIO_InitStructure; // 结构体声明
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD,ENABLE); // 使能
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOD,&GPIO_InitStructure);
}
int main()
{
rcc_configration() ;
led_configration();
while(1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_SetBits(GPIOD,GPIO_Pin_6);
GPIO_SetBits(GPIOD,GPIO_Pin_3);
GPIO_ResetBits(GPIOD,GPIO_Pin_3); // 清除端口为位
while(1);
}
}
系统滴答定时器:(注意定时器设置)
#include "stm32f10x.h"
void LED_Config(void){
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1 V6 配置为通用推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //口线翻转速度为