本帖最后由 STM32W108 于 2011-1-24 09:41 编辑
板子是老版的三合一实验板。
VTMR是我自己在C下写的一个简单的基于时间调度器,在C语言里面我经常使用。
现在开始学汇编,想在汇编里也使用这个调度器,
直接把C语言编译出来的代码放到汇编里面,在汇编调用。
程序用了两个VTMR,序号0,1,分别控制两个LED闪烁。
#include "proj_incs.h"
//IAR STM8寄存器使用规则:
//A,X,Y,?b0-?b7 草稿寄存器
//?b8-?b15 存储寄存器
#define LED_0 0 //LED_0,PD0
#define LED_1 2 //LED_1,PD2
PUBLIC main
EXTERN HS_TicksInit
EXTERN VTMR_Start
EXTERN VTMR_TicksClear
EXTERN VTMR_AllStop
EXTERN VTMR_IsExpiredAndStop
SECTION `.near_func.text`:CODE:NOROOT(0)
main:
//------------------------------------------------------------------------------
//时钟初始化
CLR A
LD CLK_CKDIVR, A // 主时钟 = 16MHZ
//------------------------------------------------------------------------------
//IO口初始化
LD A, #(1<<LED_0)|(1<<LED_1) //LED_0,LED_1设置成推挽输出
LD PD_DDR, A
LD PD_CR1, A
CLR A
LD PD_CR2, A
//------------------------------------------------------------------------------
//VTMR初始化
CALL VTMR_AllStop //所有VTMR停止
CALL HS_TicksInit //节拍初始化
//------------------------------------------------------------------------------
//打开全局中断
RIM //打开全局中断
//------------------------------------------------------------------------------
//启动VTMR0,VTMR1
LDW X, #500 //启动VTMR0,500ms
LD A,#0 //VTMR0
CALL VTMR_Start
LDW X, #250 //启动VTMR1,250ms
LD A,#1 //VTMR1
CALL VTMR_Start
//------------------------------------------------------------------------------
//主循环
main_loop:
//------------------------------------------------------------------------------
//VTMR0调度
proc_vtmr_0:
LD A,#0 //VTMR0
CALL VTMR_IsExpiredAndStop
TNZ A
JREQ proc_vtmr_0_end //如果VTMR0时间未到,跳转到 proc_vtmr_0_end
//----------------------------------------------------------------------
//VTMR0时间到,执行开始
BTJT PD_ODR, #LED_0 ,led_0_clr //如果LED_0为1,跳转到 led_0_clr
led_0_set:
BSET PD_ODR, #LED_0 //置位LED_0
JRA proc_vtmr_0_restart
led_0_clr:
BRES PD_ODR, #LED_0 //清位LED_0
proc_vtmr_0_restart:
LDW X, #500 //重新启动VTMR0,500ms
LD A,#0 //VTMR0
CALL VTMR_Start
//----------------------------------------------------------------------
//VTMR0时间到,执行结束
proc_vtmr_0_end:
//------------------------------------------------------------------------------
//VTMR1调度
proc_vtmr_1:
LD A,#1 //VTMR1
CALL VTMR_IsExpiredAndStop
TNZ A
JREQ proc_vtmr_1_end //如果VTMR0时间未到,跳转到 proc_vtmr_1_end
//----------------------------------------------------------------------
//VTMR1时间到,执行开始
BTJT PD_ODR, #LED_1 ,led_1_clr //如果LED_1为1,跳转到 led_1_clr
led_1_set:
BSET PD_ODR, #LED_1 //置位LED_1
JRA proc_vtmr_1_restart
led_1_clr:
BRES PD_ODR, #LED_1 //清位LED_1
proc_vtmr_1_restart:
LDW X, #250 //重新启动VTMR1,250ms
LD A, #1 //VTMR1
CALL VTMR_Start
//----------------------------------------------------------------------
//VTMR0时间到,执行结束
proc_vtmr_1_end:
//------------------------------------------------------------------------------
//主循环
JRA main_loop
END
|