dc32-retro-tech-addon/firmware/ch32v003_bootloader/user/main.c

120 lines
3.6 KiB
C

/********************************** (C) COPYRIGHT *******************************
* File Name : main.c
* Author : WCH
* Version : V1.0.0
* Date : 2023/12/25
* Description : Main program body.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
/*
*@Note
*IAP upgrade routine:
*Support serial port for FLASH burning
*
*1. Use the IAP download tool to realize the download PC0 floating (default pull-up input)
*2. After downloading the APP, connect PC0 to ground (low level input), and press the
*reset button to run the APP program.
*3. use WCH-LinkUtility.exe download to BOOT(adr-0x1FFFF000)
*
*/
#include "debug.h"
#include "string.h"
#include "iap.h"
#define RSTSCKR_RMVF_Set ((uint32_t)0x01000000) // from ch32v00x_rcc.c
/*********************************************************************
* @fn IAP_2_APP
*
* @brief IAP_2_APP program.
*
* @return none
*/
void IAP_2_APP(void)
{
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
*
* @brief Main program.
*
* @return none
*/
int main(void)
{
uint8_t w;
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();
}
}
}