# Assemblieren: riscv-none-elf-as -agl blink.s # Linken: riscv-none-elf-ld -o blink.o -Ttext 0 -e Reset_Entry a.out # Anschauen: riscv-none-elf-objdump -d -r blink.o # Binary bauen: riscv-none-elf-objcopy -O binary blink.o blink.bin .file "blinken.s" .section .text .balign 4 .global Reset_Entry .list .include "CH32V003_reg1.asm" .org 0x00000000 Reset_Entry: j Coldstart .org 0x00000098 TIM2_Vector: .dc.l Interrupt_Routine .org 0x00000100 Coldstart: nop li t0,0x00000003 # "Interrupt Vectortable Recognition Mode" und "Entry Address Mode" aktivieren csrw mtvec,t0 li t0,0x00000008 # Global Interrupts freigeben csrw mstatus,t0 Port_Setup_Clock: li x10,R32_RCC_APB2PCENR # Takt für Port D einschalten lw x11,0(x10) li x7,(1<<5) or x11,x11,x7 sw x11,0(x10) Port_Setup_Direction: li x10,R32_GPIOD_CFGLR lw x11,0(x10) li x7,0xfff0ffff and x11,x11,x7 li x7,0x00030000 or x11,x11,x7 sw x11,0(x10) Port_Setup_LED_off: li x10,R32_GPIOD_OUTDR lw x11,0(x10) ori x11,x11,0x0010 sw x11,0(x10) Timer_Setup: li x10,R32_RCC_APB1PCENR # Takt für Timer 2 einschalten lw x11,0(x10) ori x11,x11,0x00000001 sw x11,0(x10) li x10,R16_TIM2_PSC # Prescaler auf 7999 (0x1F3F) setzen: 24MHz/(3*8000) => Taktfrequenz=1000Hz li x11,7999 sw x11,0(x10) li x10,R16_TIM2_BASE # Reload-Value und Counter-Value setzen (bestimmt die Interrupt-Frequenz) li x11,250 sw x11,44(x10) # speichern in R16_TIM2_ATRLR sw x11,36(x10) # speichern in R16_TIM2_CNT li x10,R16_TIM2_CTLR1 # Reload-Funktion einschalten und rückwärts zählen lw x11,0(x10) ori x11,x11,0x0090 sw x11,0(x10) li x10,R16_TIM2_DMAINTENR # Interrupts einrichten (1) li x11,0x0001 sw x11,0(x10) li x10,R32_PFIC_IENR2 # Interrupts einrichten (2) li x11,0x00000040 sw x11,0(x10) li x10,R16_TIM2_CTLR1 # Timer 2 aktivieren lw x11,0(x10) ori x11,x11,0x0001 sw x11,0(x10) Endless_Loop: j Endless_Loop Interrupt_Routine: li x10,R32_GPIOD_OUTDR lw x11,0(x10) xori x11,x11,0x00000010 sw x11,0(x10) li x10,R16_TIM2_INTFR li x11,0x00000000 sw x11,0(x10) mret