From d8bf688001ac6780dc7bd3c005afc7fb5110dac4 Mon Sep 17 00:00:00 2001 From: true Date: Sun, 4 Aug 2024 06:39:10 -0700 Subject: [PATCH] bootloader now functions several issues with the bootloader, from gpio config, UART baud, etc. bootloader now does the following: - enters bootloader mode upon holding BTN2 at power-up - flashes LED4 rapidly to indicate in bootloader mode - operates WCH ISP bootloader at 115200 baud on the UART pins on GAT header --- firmware/bootloader_utility/CH375DLL.DLL | Bin 0 -> 21072 bytes .../bootloader_utility/WCHMcuIAP_WinAPP.exe | Bin 0 -> 69632 bytes firmware/ch32v003_bootloader/.cproject | 2 +- .../.settings/language.settings.xml | 2 +- .../org.eclipse.core.resources.prefs | 9 +++ .../bin/ch32v003_bootloader_factory.bin | Bin 0 -> 1920 bytes firmware/ch32v003_bootloader/user/iap.c | 40 +++-------- firmware/ch32v003_bootloader/user/iap.h | 2 +- firmware/ch32v003_bootloader/user/main.c | 64 ++++++++++++++++-- 9 files changed, 82 insertions(+), 37 deletions(-) create mode 100644 firmware/bootloader_utility/CH375DLL.DLL create mode 100644 firmware/bootloader_utility/WCHMcuIAP_WinAPP.exe create mode 100644 firmware/ch32v003_bootloader/bin/ch32v003_bootloader_factory.bin diff --git a/firmware/bootloader_utility/CH375DLL.DLL b/firmware/bootloader_utility/CH375DLL.DLL new file mode 100644 index 0000000000000000000000000000000000000000..0ed0693fe51b2e4330a37fb9344d56baf4bd1084 GIT binary patch literal 21072 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 literal 0 HcmV?d00001 diff --git a/firmware/bootloader_utility/WCHMcuIAP_WinAPP.exe b/firmware/bootloader_utility/WCHMcuIAP_WinAPP.exe new file mode 100644 index 0000000000000000000000000000000000000000..82977d9e966e9b449a7944593fdb22a1c121889a GIT binary patch literal 69632 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

qMhRy5f_>mFhw~68Km*u*OQaja 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 literal 0 HcmV?d00001 diff --git a/firmware/ch32v003_bootloader/.cproject b/firmware/ch32v003_bootloader/.cproject index 6e64a62..922d3cd 100644 --- a/firmware/ch32v003_bootloader/.cproject +++ b/firmware/ch32v003_bootloader/.cproject @@ -147,5 +147,5 @@ - + diff --git a/firmware/ch32v003_bootloader/.settings/language.settings.xml b/firmware/ch32v003_bootloader/.settings/language.settings.xml index 5f28acd..79aa547 100644 --- a/firmware/ch32v003_bootloader/.settings/language.settings.xml +++ b/firmware/ch32v003_bootloader/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + diff --git a/firmware/ch32v003_bootloader/.settings/org.eclipse.core.resources.prefs b/firmware/ch32v003_bootloader/.settings/org.eclipse.core.resources.prefs index 4a4dadb..604df55 100644 --- a/firmware/ch32v003_bootloader/.settings/org.eclipse.core.resources.prefs +++ b/firmware/ch32v003_bootloader/.settings/org.eclipse.core.resources.prefs @@ -3,12 +3,21 @@ encoding//core/core_riscv.h=GBK encoding//ld/ch32v003_bl.ld=GBK encoding//periph/inc/ch32v00x.h=GBK encoding//periph/inc/ch32v00x_gpio.h=GBK +encoding//periph/inc/ch32v00x_rcc.h=GBK +encoding//periph/inc/ch32v00x_tim.h=GBK encoding//periph/inc/ch32v00x_usart.h=GBK encoding//periph/src/ch32v00x_adc.c=GBK +encoding//periph/src/ch32v00x_flash.c=GBK encoding//periph/src/ch32v00x_gpio.c=GBK encoding//periph/src/ch32v00x_pwr.c=GBK encoding//periph/src/ch32v00x_rcc.c=GBK +encoding//periph/src/ch32v00x_tim.c=GBK encoding//periph/src/ch32v00x_usart.c=GBK +encoding//startup/startup_ch32v00x.S=GBK +encoding//user/ch32v00x_conf.h=GBK +encoding//user/ch32v00x_it.c=GBK +encoding//user/ch32v00x_it.h=GBK +encoding//user/flash.c=GBK encoding//user/iap.c=GBK encoding//user/iap.h=GBK encoding//user/main.c=GBK diff --git a/firmware/ch32v003_bootloader/bin/ch32v003_bootloader_factory.bin b/firmware/ch32v003_bootloader/bin/ch32v003_bootloader_factory.bin new file mode 100644 index 0000000000000000000000000000000000000000..8522877c7bdb9953d844c2fd48838ca7bc5af635 GIT binary patch literal 1920 zcma)7eQZ-z8-MQiB)n_aGd3|0O0Q01lsF1&*vpbaw|g}Uiot12_(Q$Aib@2eB_yJ^ zExmmwj&+{WT?Qm8#rct7oF&{0gWFoRnl#3*jm|`cr84x7_rE4^ zha{_aGB^I^1w)u~m0Qp`;`>8Ts`Hi=953!NQBpsI}{>r8B&1?3`C9X}?QDDXv z*0241Y1&iEdbe-0M3~!Dg^Uq>rfcmmS=lwScq^@x@cq=A$R&Jux&{)t?LJ&C|F}IT z#~3}V%DMzrd0|!LqW@(}0;jAOVZ}q;?bs06iLMo&TI!kmJ++J%$JA!oS@vQHc=@if zm-0js{6kJ$)o=0FOLFq6Zh3&lD&@Yb!&VtCPx|&Bo6LE7&MiTbwAC!grz9|a$Y0Bv zxv*-=xHiU2#k4$S0GGe^MGr*_H|r@;w3638!N%F%L{T`jJ749W%v;j6k33i5GLA_V z8}pP!r1)o-Sgk{H{LqA@U4m9U;}{{{`%AP{Gxo36JUJ6WaT$ zO%9#n88tFi&1=2W;{GP>)>D<-Xfw}^J;Fyu*YPf4v$*yMH}*8|A^haqC3s3)bA(2C zo@OmqkvJ=)jVV1H<^jddE}-D7ZKaRs%Z3hqu4~WbHZBnn=iPf-(!QBBSe10|`igXw zwc5XOs4=^Ky+ge_L78NX??8~!p?;p`p0_+AK)=Bdd?h&2;uiA2%%Kx)ycDj+!x1`O@s3FDf z)Sk?*YluGn&(nSnnHY|}_3nyX^t^`yC*C*1)fpiLN0|`fe1LzMwF#p3pAt{>mn>4 z!odJ&N5wj8c43tkn5g5%rgR+K2RJ&Ve|}gyF5XT!S6D1K+dAtajDo|P0Tafhnd$2% zUP~q;z6hUi30!6@2pMh^CnV3^9B8B; zM~3g?>$}VW)KdfJlKn|8-@sGU`p%5E1}NT!!;4D!S1KJ^28~DLZ~#6V_d! zs>N-50d`kZT-!qxSUP%ko=!YXI(;BBpsZF0tkcTBhfXUi)eh?&;=QSSL*C`;vY`}N zrIcmrz19iho#;4mD&9hsy(&NVO@>xSP)prc$O%lD{I#x|>Fy87ylqCFGLR = 0x48B44444; // Set GPIOD Mode, Speed - GPIOD->BCR = (((uint32_t)0x01) << 6); + GPIOD->BCR = (((uint32_t)0x01) << 6); // pull down RX line + w = GPIOD->CFGLR & ~(0x0ff00000); + GPIOD->CFGLR = w | 0x08a00000; // Set GPIOD Mode, Speed // configure USART - USART1->CTLR2 |= USART_StopBits_1; + USART1->CTLR2 = USART_StopBits_1; USART1->CTLR1 = USART_Parity_No | USART_Mode_Rx | USART_Mode_Tx; // Set USART mode, Parity - USART1->CTLR3 |= USART_HardwareFlowControl_None; + USART1->CTLR3 = USART_HardwareFlowControl_None; - USART1->BRR = (8 << 4) | 11; // 115200; use 0x34 for 460800 + USART1->BRR = (13 << 4); // 115200; was originally 0x34 for 460800 supposedly? USART1->CTLR1 |= ((uint16_t)0x2000); // enable USART } @@ -151,27 +152,6 @@ void GPIO_Cfg_init(void) } -/********************************************************************* - * @fn PC0_Check - * - * @brief Check PC0 state - * - * @return 1 - IAP - * 0 - APP - */ -u8 btn2_pushed(void) -{ - // configure GPIOC - GPIOC->BCR = GPIO_Pin_4; // configure pull-down - GPIOC->CFGLR &= ~(0x04 << (4 * 4)); // clear PC4 config - GPIOC->CFGLR |= 0x08 << (4 * 4); // configure PC4 as pullup/down input - // GPIOC->BSHR = ((uint32_t)0x01); - - // is button pushed (active high)? - return (GPIOC->INDR & GPIO_Pin_4); // ^ GPIO_Pin_4; -} - - /********************************************************************* * @fn UART3_SendMultiyData * @@ -218,8 +198,10 @@ void UART1_SendData(u8 data) */ u8 Uart1_Rx(void) { - while( USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); - return USART_ReceiveData( USART1); + // todo: rewrite the whole receive routine to not depend + // on this easily breakable code. + while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); + return USART_ReceiveData(USART1); } /********************************************************************* diff --git a/firmware/ch32v003_bootloader/user/iap.h b/firmware/ch32v003_bootloader/user/iap.h index d59e2f6..2ad537c 100644 --- a/firmware/ch32v003_bootloader/user/iap.h +++ b/firmware/ch32v003_bootloader/user/iap.h @@ -52,7 +52,7 @@ void GPIO_Cfg_init(void); void USART1_CFG(u32 baudrate); void UART_Rx_Deal(void); -u8 btn2_pushed(void); + #endif diff --git a/firmware/ch32v003_bootloader/user/main.c b/firmware/ch32v003_bootloader/user/main.c index 30589fb..1dfe74e 100644 --- a/firmware/ch32v003_bootloader/user/main.c +++ b/firmware/ch32v003_bootloader/user/main.c @@ -25,6 +25,8 @@ #include "string.h" #include "iap.h" +#define RSTSCKR_RMVF_Set ((uint32_t)0x01000000) // from ch32v00x_rcc.c + /********************************************************************* * @fn IAP_2_APP * @@ -34,11 +36,46 @@ */ void IAP_2_APP(void) { - RCC_ClearFlag(); + RCC->RSTSCKR |= RSTSCKR_RMVF_Set; // RCC_ClearFlag(); + SystemReset_StartMode(Start_Mode_USER); + + //TIM1->BDTR = 0; // disable PWM outputs + //TIM1->CCER = 0; // disable PWM selects + //TIM1->CHCTLR1 = 0; // disable PWM mappings + //TIM1->CTLR1 = 0; // disable TIM1 + + //RCC->APB2PCENR = 0; // disable peripheral clocks + NVIC_SystemReset(); } +static inline void bootloader_led_flash() +{ + uint32_t w; + + // configure bootloader LED pins + GPIOA->BCR = GPIO_Pin_2; // LSENS_K + GPIOD->BSHR = GPIO_Pin_0; // LSENS_A + + w = GPIOA->CFGLR & ~(0x0f << (4 * 2)); // clear PA2 config + GPIOA->CFGLR = w | 0x0a << (4 * 2); // and configure as AF_PP output + + w = GPIOD->CFGLR & ~(0x0f << (4 * 0)); // clear PD0 config + GPIOD->CFGLR = w | 0x02 << (4 * 0); // and configure as PP output + + TIM1->ATRLR = 40 - 1; // period + TIM1->PSC = 65535; // prescaler + TIM1->SWEVGR = TIM_PSCReloadMode_Immediate; + + TIM1->CCER = TIM_CC2NE; + TIM1->CH2CVR = 30; + TIM1->CHCTLR1 = 0x60 << 8; // output enabled, PWM mode 1 + + TIM1->BDTR = TIM_MOE; // enable PWM outputs + TIM1->CTLR1 = TIM_CKD_1 | TIM_ARPE | TIM_CEN; +} + /********************************************************************* * @fn main * @@ -48,15 +85,32 @@ void IAP_2_APP(void) */ int main(void) { - // Enable GPIOD,USART1, GPIOC clock - RCC->APB2PCENR |= (RCC_APB2Periph_GPIOD | RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOC); - USART1_CFG(115200); + uint8_t w; - if(!btn2_pushed()) { + RCC->APB2PCENR = RCC_APB2Periph_GPIOC; + + // configure GPIOC + GPIOC->BCR = GPIO_Pin_4; // configure pull-down + w = GPIOC->CFGLR & ~(0x0f << (4 * 4)); // clear PC4 config + GPIOC->CFGLR = w | 0x08 << (4 * 4); // configure PC4 as input with PU/PD + + // had some issues with spurious activation happening, + // so spin a little bit. seems to help? + while (TIM1->CNT) __asm("nop"); + + // is button NOT pushed (active high)? + if (!(GPIOC->INDR & GPIO_Pin_4)) { IAP_2_APP(); while(1); } + RCC->APB2PCENR = (RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | + RCC_APB2Periph_GPIOD | RCC_APB2Periph_TIM1 | + RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1); + + bootloader_led_flash(); + USART1_CFG(115200); + while(1) { if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET) { UART_Rx_Deal();