2026-01-05 09:40:42 +08:00
|
|
|
|
/********************************** (C) COPYRIGHT *******************************
|
|
|
|
|
|
* File Name : main.c
|
|
|
|
|
|
* Author : WCH
|
|
|
|
|
|
* Version : V1.0.0
|
|
|
|
|
|
* Date : 2024/05/05
|
|
|
|
|
|
* 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.
|
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
#include "includes.h"
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
2026-01-19 16:39:22 +08:00
|
|
|
|
const char Prject_File_Name[] __attribute__((section(".project_info"))) = Project_Version;
|
|
|
|
|
|
|
2026-01-05 09:40:42 +08:00
|
|
|
|
uint32_t test_tick = 0;
|
|
|
|
|
|
|
|
|
|
|
|
/*********************************************************************
|
|
|
|
|
|
* @fn main
|
|
|
|
|
|
*
|
|
|
|
|
|
* @brief Main program.
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return none
|
|
|
|
|
|
*/
|
|
|
|
|
|
int main(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint8_t sys_reset = 0;
|
|
|
|
|
|
unsigned char Buffer;
|
|
|
|
|
|
|
2026-01-19 16:39:22 +08:00
|
|
|
|
/* - <20>ϵ<EFBFBD>ǰ<EFBFBD><C7B0>Ҫ<EFBFBD>رտ<D8B1><D5BF>Ź<EFBFBD>
|
|
|
|
|
|
* - ԭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ź<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>и<EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ź<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><EFBFBD><EFBFBD>һֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
|
|
|
|
|
* */
|
|
|
|
|
|
WDT_Reinit();
|
2026-01-05 09:40:42 +08:00
|
|
|
|
SystemCoreClockUpdate(); //ϵͳ<CFB5><CDB3>ʼ<EFBFBD><CABC>
|
|
|
|
|
|
Systick_Init();
|
|
|
|
|
|
|
2026-02-10 17:48:22 +08:00
|
|
|
|
UARTx_Init(UART_1,512000);
|
2026-01-05 09:40:42 +08:00
|
|
|
|
UARTx_Init(UART_2,512000);
|
|
|
|
|
|
|
|
|
|
|
|
SYS_LED_Init();
|
|
|
|
|
|
|
|
|
|
|
|
SPI_SRAM_Init();
|
|
|
|
|
|
|
|
|
|
|
|
SPI_FLASH_Init();
|
|
|
|
|
|
|
|
|
|
|
|
Get_Flash_Size(&Buffer);
|
|
|
|
|
|
|
|
|
|
|
|
if(Buffer){
|
2026-01-19 16:39:22 +08:00
|
|
|
|
DBG_SYS_Printf("CH564 ROMA :0x0 - 0x6FFFF");
|
|
|
|
|
|
DBG_SYS_Printf("CH564 EEPROM :0x70000 - 0x77FFF");
|
2026-01-05 09:40:42 +08:00
|
|
|
|
}else {
|
2026-01-19 16:39:22 +08:00
|
|
|
|
DBG_SYS_Printf("CH564 ROMA :0x0 - 0x2FFFF");
|
|
|
|
|
|
DBG_SYS_Printf("CH564 EEPROM :0x30000 - 0x37FFF");
|
2026-01-05 09:40:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
EEPROM_Init();
|
|
|
|
|
|
|
|
|
|
|
|
memset((uint8_t *)&g_app_feature,0,sizeof(G_SYS_FEATURE_T));
|
|
|
|
|
|
memset((uint8_t *)&g_mcu_app_feature,0,sizeof(G_SYS_FEATURE_T));
|
|
|
|
|
|
memset((uint8_t *)&g_update_recode,0,sizeof(UPDATE_RECORD_T));
|
|
|
|
|
|
|
2026-01-19 16:39:22 +08:00
|
|
|
|
DBG_SYS_Printf("Project Name:%s",Prject_File_Name);
|
2026-01-05 09:40:42 +08:00
|
|
|
|
|
2026-02-10 17:48:22 +08:00
|
|
|
|
DBG_SYS_Printf("Project - SYSCLK_FREQ_120MHz_HSI");
|
|
|
|
|
|
|
2026-01-19 16:39:22 +08:00
|
|
|
|
sys_reset = RCC_GET_GLOB_RST_KEEP(); //<2F><>λ<EFBFBD><CEBB><EFBFBD>ּĴ<D6BC><C4B4><EFBFBD>
|
2026-01-05 09:40:42 +08:00
|
|
|
|
if(sys_reset == 0x00)
|
|
|
|
|
|
{
|
|
|
|
|
|
DBG_SYS_Printf("<EFBFBD>ϵ縴λ \r\n");
|
2026-01-19 16:39:22 +08:00
|
|
|
|
g_Boot_Time = 10000;
|
2026-02-10 17:48:22 +08:00
|
|
|
|
|
2026-01-05 09:40:42 +08:00
|
|
|
|
}else if(sys_reset == 0x02){
|
2026-01-19 16:39:22 +08:00
|
|
|
|
DBG_SYS_Printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ \r\n");
|
2026-02-10 17:48:22 +08:00
|
|
|
|
g_Boot_Time = 10000;
|
2026-01-19 16:39:22 +08:00
|
|
|
|
|
|
|
|
|
|
}else if(sys_reset == 0x03){
|
|
|
|
|
|
DBG_SYS_Printf("MCU Flash<73><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ \r\n");
|
|
|
|
|
|
g_Boot_Time = 3000;
|
2026-01-05 09:40:42 +08:00
|
|
|
|
|
|
|
|
|
|
}else {
|
2026-01-19 16:39:22 +08:00
|
|
|
|
DBG_SYS_Printf("<EFBFBD>쳣<EFBFBD><EFBFBD>λ \r\n");
|
2026-02-10 17:48:22 +08:00
|
|
|
|
g_Boot_Time = 10000;
|
2026-01-05 09:40:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
RCC_SET_GLOB_RST_KEEP(0x01);
|
2026-02-10 17:48:22 +08:00
|
|
|
|
SPIFLASH_Read_Update_Recode(&g_update_recode); //<2F><>ȡAPPд<50><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
2026-01-05 09:40:42 +08:00
|
|
|
|
g_jump_flag = Read_APP_Feature();
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
|
|
|
|
|
|
if(g_jump_flag == 2) {
|
|
|
|
|
|
MCU_APP_Write(); //MCU<43><55>Ҫд<D2AA><D0B4>
|
2026-01-19 16:39:22 +08:00
|
|
|
|
|
|
|
|
|
|
DBG_SYS_Printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>MCU Flash<73><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ \r\n");
|
|
|
|
|
|
|
2026-02-10 17:48:22 +08:00
|
|
|
|
RCC_SET_GLOB_RST_KEEP(0x03);
|
2026-01-19 16:39:22 +08:00
|
|
|
|
Delay_Ms(1000);
|
|
|
|
|
|
|
|
|
|
|
|
// - <20><><EFBFBD><EFBFBD>ȫ<EFBFBD>ָ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>оƬ<D0BE><C6AC><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Code Flash
|
2026-02-10 17:48:22 +08:00
|
|
|
|
//RCC_GlobleRstCFG(RB_GLOB_FORCE_RST, ENABLE);
|
|
|
|
|
|
|
|
|
|
|
|
// - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>оƬ<D0BE><C6AC><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Code Flash,<2C><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>е<EFBFBD>LD<4C>ļ<EFBFBD> .vector<6F>ֶ<EFBFBD><D6B6>м<EFBFBD><D0BC><EFBFBD> KEEP,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
|
|
|
|
|
|
NVIC_SystemReset();
|
2026-01-19 16:39:22 +08:00
|
|
|
|
while(1);
|
2026-01-05 09:40:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-10 17:48:22 +08:00
|
|
|
|
//Dbg_Switch = 0x00;
|
2026-01-19 16:39:22 +08:00
|
|
|
|
WDT_Init();
|
|
|
|
|
|
|
2026-01-05 09:40:42 +08:00
|
|
|
|
while (1)
|
|
|
|
|
|
{
|
2026-01-19 16:39:22 +08:00
|
|
|
|
WDT_Feed();
|
|
|
|
|
|
|
2026-01-05 09:40:42 +08:00
|
|
|
|
SYS_LED_Task();
|
|
|
|
|
|
|
2026-02-10 17:48:22 +08:00
|
|
|
|
Uart1_Task();
|
2026-01-05 09:40:42 +08:00
|
|
|
|
|
2026-01-19 16:39:22 +08:00
|
|
|
|
Uart2_Task();
|
2026-01-05 09:40:42 +08:00
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
|
2026-01-19 16:39:22 +08:00
|
|
|
|
if(g_jump_flag == 0x00)
|
2026-01-05 09:40:42 +08:00
|
|
|
|
{
|
2026-02-10 17:48:22 +08:00
|
|
|
|
if(SysTick_1ms - g_Boot_Tick >= g_Boot_Time)
|
2026-01-05 09:40:42 +08:00
|
|
|
|
{
|
2026-01-19 16:39:22 +08:00
|
|
|
|
g_Boot_Tick = SysTick_1ms;
|
|
|
|
|
|
|
|
|
|
|
|
DBG_SYS_Printf("Jump APP 2\r\n");
|
2026-01-05 09:40:42 +08:00
|
|
|
|
|
|
|
|
|
|
Delay_Ms(1000);
|
|
|
|
|
|
|
2026-01-19 16:39:22 +08:00
|
|
|
|
WDT_Reinit();
|
|
|
|
|
|
|
2026-01-05 09:40:42 +08:00
|
|
|
|
NVIC_EnableIRQ( Software_IRQn );
|
|
|
|
|
|
Delay_Ms( 20 );
|
2026-01-19 16:39:22 +08:00
|
|
|
|
HSI_ON();
|
|
|
|
|
|
CLKSEL_HSI();
|
|
|
|
|
|
SYSCLK_SOURCE_SELECT(SYSCLK_SOURCE_HSI_HSE);
|
|
|
|
|
|
RCC_UNLOCK_SAFE_ACCESS();
|
|
|
|
|
|
BITS_CFG( R32_EXTEN_CTLR0 , RB_FLASH_PRE_EN , DISABLE );
|
|
|
|
|
|
RCC_LOCK_SAFE_ACCESS();
|
2026-01-05 09:40:42 +08:00
|
|
|
|
NVIC_SetPendingIRQ( Software_IRQn );
|
|
|
|
|
|
}
|
2026-01-19 16:39:22 +08:00
|
|
|
|
}else {
|
|
|
|
|
|
if(SysTick_1ms - g_Boot_Tick >= g_Boot_Time)
|
|
|
|
|
|
{
|
|
|
|
|
|
DBG_SYS_Printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ ....");
|
|
|
|
|
|
RCC_SET_GLOB_RST_KEEP(0x02);
|
|
|
|
|
|
|
|
|
|
|
|
Delay_Ms(1000);
|
|
|
|
|
|
|
2026-02-10 17:48:22 +08:00
|
|
|
|
//<2F><>ʽ1<CABD><31>
|
|
|
|
|
|
//RCC_GlobleRstCFG(RB_GLOB_FORCE_RST, ENABLE);
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><>ʽ2<CABD><32>
|
|
|
|
|
|
NVIC_SystemReset();
|
2026-01-19 16:39:22 +08:00
|
|
|
|
while(1);
|
|
|
|
|
|
}
|
2026-01-05 09:40:42 +08:00
|
|
|
|
}
|
2026-01-19 16:39:22 +08:00
|
|
|
|
|
2026-01-05 09:40:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void NMI_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
|
|
|
|
|
|
void HardFault_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
|
|
|
|
|
|
|
|
|
|
|
|
/*********************************************************************
|
|
|
|
|
|
* @fn NMI_Handler
|
|
|
|
|
|
*
|
|
|
|
|
|
* @brief This function handles NMI exception.
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return none
|
|
|
|
|
|
*/
|
|
|
|
|
|
void NMI_Handler(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
while (1)
|
|
|
|
|
|
{
|
2026-01-19 16:39:22 +08:00
|
|
|
|
|
2026-01-05 09:40:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*********************************************************************
|
|
|
|
|
|
* @fn HardFault_Handler
|
|
|
|
|
|
*
|
|
|
|
|
|
* @brief This function handles Hard Fault exception.
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return none
|
|
|
|
|
|
*/
|
|
|
|
|
|
void HardFault_Handler(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
/* MRS_<53><5F><EFBFBD><EFBFBD>HardFault<6C><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˼· : https://www.cnblogs.com/wchmcu/p/17545931.html */
|
|
|
|
|
|
uint32_t v_mepc,v_mcause,v_mtval;
|
|
|
|
|
|
//Dbg_Println(DBG_BIT_SYS_STATUS_bit,"hardfault\n");
|
|
|
|
|
|
|
|
|
|
|
|
v_mepc = __get_MEPC();
|
|
|
|
|
|
v_mcause = __get_MCAUSE();
|
|
|
|
|
|
v_mtval = __get_MTVAL();
|
|
|
|
|
|
|
|
|
|
|
|
printf("boot mepc:%x\n",v_mepc);
|
|
|
|
|
|
printf("boot mcause:%x\n",v_mcause);
|
|
|
|
|
|
printf("boot mtval:%x\n",v_mtval);
|
|
|
|
|
|
|
|
|
|
|
|
while(1);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-19 16:39:22 +08:00
|
|
|
|
/* - <20><>תAPP <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SW_Handler<65>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>ת
|
|
|
|
|
|
* - <EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>SW_Handler<EFBFBD>жϺ<EFBFBD><EFBFBD><EFBFBD>оƬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>תAPP */
|
2026-01-05 09:40:42 +08:00
|
|
|
|
void SW_Handler(void) {
|
|
|
|
|
|
|
2026-01-19 16:39:22 +08:00
|
|
|
|
__asm volatile("li a6, 0x01000");
|
2026-01-05 09:40:42 +08:00
|
|
|
|
__asm volatile("jr a6");
|
|
|
|
|
|
while(1);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|