diff --git a/ch32v003fun/ch32v003fun.c b/ch32v003fun/ch32v003fun.c index 137455e00b6ff83a5db7a2edc71de46b6ad379f1..77e1e34f66d72e5a3922124e217c8f22e66dfd01 100644 --- a/ch32v003fun/ch32v003fun.c +++ b/ch32v003fun/ch32v003fun.c @@ -771,10 +771,10 @@ void handle_reset() // Setup the interrupt vector, processor status and INTSYSCR. " li a0, 0x80\n\ csrw mstatus, a0\n\ - c.li a3, 0x3\n\ + li a3, 0x3\n\ csrw 0x804, a3\n\ la a0, InterruptVector\n\ - c.or a0, a3\n\ + or a0, a0, a3\n\ csrw mtvec, a0\n" ); // Careful: Use registers to prevent overwriting of self-data. @@ -782,10 +782,10 @@ void handle_reset() asm volatile( " la a0, _sbss\n\ la a1, _ebss\n\ - c.li a2, 0\n\ + li a2, 0\n\ bge a0, a1, 2f\n\ -1: c.sw a2, 0(a0)\n\ - c.addi a0, 4\n\ +1: sw a2, 0(a0)\n\ + addi a0, a0, 4\n\ blt a0, a1, 1b\n\ 2:" // This loads DATA from FLASH to RAM. @@ -793,10 +793,10 @@ asm volatile( la a1, _data_vma\n\ la a2, _edata\n\ 1: beq a1, a2, 2f\n\ - c.lw a3, 0(a0)\n\ - c.sw a3, 0(a1)\n\ - c.addi a0, 4\n\ - c.addi a1, 4\n\ + lw a3, 0(a0)\n\ + sw a3, 0(a1)\n\ + addi a0, a0, 4\n\ + addi a1, a1, 4\n\ bne a1, a2, 1b\n\ 2:\n" ); @@ -875,7 +875,7 @@ int _write(int fd, const char *buf, int size) remain =- tosend; } } - +#endif void SetupDebugPrintf() { @@ -884,8 +884,6 @@ void SetupDebugPrintf() } -#endif - void DelaySysTick( uint32_t n ) { SysTick->SR &= ~(1 << 0); diff --git a/examples/blink/blink.bin b/examples/blink/blink.bin index 94a16b43785731553baa6a65a8ab89e0914b9772..b1c36a5c828db912241513fd46ac9f0fae76f4d5 100755 Binary files a/examples/blink/blink.bin and b/examples/blink/blink.bin differ diff --git a/examples/blink/blink.c b/examples/blink/blink.c index ea936900bafe0447bad995a5d187431f8ddea486..408b02f49809ac1de1ce03d4bb50e1317a9cb972 100644 --- a/examples/blink/blink.c +++ b/examples/blink/blink.c @@ -19,11 +19,15 @@ int main() GPIOD->CFGLR &= ~(0xf<<(4*0)); GPIOD->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP)<<(4*0); + // GPIO D0 Push-Pull, 10MHz Output + GPIOD->CFGLR &= ~(0xf<<(4*4)); + GPIOD->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP)<<(4*4); + while(1) { - GPIOD->BSHR = 1; // Turn on GPIOD0 + GPIOD->BSHR = 1 | (1<<4); // Turn on GPIOD0 Delay_Ms( 200 ); - GPIOD->BSHR = 1<<16; // Turn off GPIOD0 + GPIOD->BSHR = (1<<16) | (1<<(16+4)); // Turn off GPIOD0 Delay_Ms( 200 ); count++; } diff --git a/minichlink/minichlink.exe b/minichlink/minichlink.exe index 5c187f5e3995cdace9814183aecea6eedf6fc83d..05e4ddbc24be74047c668bd55ffc4e90bf9ca2e8 100644 Binary files a/minichlink/minichlink.exe and b/minichlink/minichlink.exe differ diff --git a/minichlink/pgm-wch-linke.c b/minichlink/pgm-wch-linke.c index da38118989beacf961d29edde9fc8ed4b830eaf3..e3037dbe296f1bf2ac4331d0513b476e7f8dca01 100644 --- a/minichlink/pgm-wch-linke.c +++ b/minichlink/pgm-wch-linke.c @@ -13,6 +13,7 @@ struct LinkEProgrammerStruct { void * internal; libusb_device_handle * devh; + int lasthaltmode; }; #define WCHTIMEOUT 5000 @@ -203,7 +204,10 @@ static int LEUnbrick( void * dev ) static int LEHaltMode( void * d, int mode ) { libusb_device_handle * dev = ((struct LinkEProgrammerStruct*)d)->devh; - + if( mode == ((struct LinkEProgrammerStruct*)d)->lasthaltmode ) + return; + ((struct LinkEProgrammerStruct*)d)->lasthaltmode = mode; + if( mode == 0 ) { printf( "Holding in reset\n" ); @@ -380,6 +384,7 @@ void * TryInit_WCHLinkE() struct LinkEProgrammerStruct * ret = malloc( sizeof( struct LinkEProgrammerStruct ) ); memset( ret, 0, sizeof( *ret ) ); ret->devh = wch_linke_devh; + ret->lasthaltmode = 0; MCF.WriteReg32 = 0; MCF.ReadReg32 = 0;