Files
RCU_BUS485_PLC_MASTER/Source/mcu_initial.c
yanghongfeng f25132cbe3 修复开关控制组控的控制异常问题
修改PB开关状态组控处理,解决后32路的开关状态会复用上前32个回路的数据
2026-01-19 15:35:56 +08:00

320 lines
14 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "includes.h"
/*************************************************************/
//software delay
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/
void delay_nms(unsigned int t)
{
volatile unsigned int i,j ,k=0;
j = 50* t;
for ( i = 0; i < j; i++ )
{
k++;
SYSCON_IWDCNT_Reload();
}
}
void delay_nus(unsigned int t)
{
volatile unsigned int i,j ,k=0;
j = 1* t;
for ( i = 0; i < j; i++ )
{
k++;
}
}
/*************************************************************/
//GPIO Initial
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/
void GPIO_CONFIG(void)
{
//外部中断初始化
GPIO_IntGroup_Set(PB0,1,Selete_EXI_PIN1); //PB0.0 set as EXI18
GPIO_Init(GPIOB0,1,1); //PB0.0 set as input
EXTI_trigger_CMD(ENABLE,EXI_PIN1,_EXIRT); //ENABLE falling edge
EXTI_interrupt_CMD(ENABLE,EXI_PIN1); //enable EXI
GPIO_EXTI_interrupt(GPIOB0,0b0000000000000010); //enable GPIOB0.0 as EXI
Set_INT_Priority(EXI1_IRQ,0); //0:set int priority 1st
EXI1_Int_Enable(); //EXI1 / EXI17 INT Vector
//GPIO初始化
GPIO_Init(GPIOB0,4,0); //PB0.4 set as output
GPIO_Init(GPIOA0,12,0); //PA0.12 set as output
GPIO_Init(GPIOA0,14,0); //PA0.14 set as output
GPIO_DriveStrength_EN(GPIOB0,4);
GPIO_DriveStrength_EN(GPIOA0,12);
GPIO_DriveStrength_EN(GPIOA0,14);
GPIO_Write_Low(GPIOB0,4); //上电默认为低电平
GPIO_Write_Low(GPIOA0,12);
GPIO_Write_Low(GPIOA0,14);
}
/*************************************************************/
//ETP0 Functions
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/
void EPT0_CONFIG(void)
{
//4路 PWM初始化
EPT_Software_Prg(); //EPT software reset
//------------ EPT GPIO Setting --------------------------------/
EPT_IO_SET(EPT_IO_CHAX,IO_NUM_PA10); //AX channel selection
EPT_IO_SET(EPT_IO_CHBX,IO_NUM_PA11); //BX channel selection
EPT_IO_SET(EPT_IO_CHCX,IO_NUM_PB05); //CX channel selection
EPT_IO_SET(EPT_IO_CHD,IO_NUM_PA08); //D channel selection
//------------ EPT Control --------------------------------/
EPT_PWM_Config(EPT_Selecte_PCLK,EPT_CNTMD_increase,EPT_OPM_Continue,0);//PCLK as clockincreasing mode,continuous mode,TCLK=PCLK/(0+1)
EPT_PWMX_Output_Control(EPT_PWMA,EPT_CA_Selecte_CMPA,EPT_CB_Selecte_CMPA,EPT_PWM_ZRO_Event_OutLow,EPT_PWM_PRD_Event_Nochange,
EPT_PWM_CAU_Event_OutHigh,EPT_PWM_CAD_Event_OutHigh,
EPT_PWM_CBU_Event_Nochange,EPT_PWM_CBD_Event_Nochange,
EPT_PWM_T1U_Event_Nochange,EPT_PWM_T1D_Event_Nochange,
EPT_PWM_T2U_Event_Nochange,EPT_PWM_T2D_Event_Nochange);
EPT_PWMX_Output_Control(EPT_PWMB,EPT_CA_Selecte_CMPB,EPT_CB_Selecte_CMPB,EPT_PWM_ZRO_Event_OutLow,EPT_PWM_PRD_Event_Nochange,
EPT_PWM_CAU_Event_OutHigh,EPT_PWM_CAD_Event_OutHigh,
EPT_PWM_CBU_Event_Nochange,EPT_PWM_CBD_Event_Nochange,
EPT_PWM_T1U_Event_Nochange,EPT_PWM_T1D_Event_Nochange,
EPT_PWM_T2U_Event_Nochange,EPT_PWM_T2D_Event_Nochange);
EPT_PWMX_Output_Control(EPT_PWMC,EPT_CA_Selecte_CMPC,EPT_CB_Selecte_CMPC,EPT_PWM_ZRO_Event_OutLow,EPT_PWM_PRD_Event_Nochange,
EPT_PWM_CAU_Event_OutHigh,EPT_PWM_CAD_Event_OutHigh,
EPT_PWM_CBU_Event_Nochange,EPT_PWM_CBD_Event_Nochange,
EPT_PWM_T1U_Event_Nochange,EPT_PWM_T1D_Event_Nochange,
EPT_PWM_T2U_Event_Nochange,EPT_PWM_T2D_Event_Nochange);
EPT_PWMX_Output_Control(EPT_PWMD,EPT_CA_Selecte_CMPD,EPT_CB_Selecte_CMPD,EPT_PWM_ZRO_Event_OutLow,EPT_PWM_PRD_Event_Nochange,
EPT_PWM_CAU_Event_OutHigh,EPT_PWM_CAD_Event_OutHigh,
EPT_PWM_CBU_Event_Nochange,EPT_PWM_CBD_Event_Nochange,
EPT_PWM_T1U_Event_Nochange,EPT_PWM_T1D_Event_Nochange,
EPT_PWM_T2U_Event_Nochange,EPT_PWM_T2D_Event_Nochange);
EPT_PRDR_CMPA_CMPB_CMPC_CMPD_Config(PWM_OUT_VAL_MAX,0,0,0,0);//PRDR=2400,CMPA=1200,CMPB=600,CMPC=2400,CMPD=0
//------------ EPT start --------------------------------/
EPT_Start();
}
/*************************************************************/
//BT Initial
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/
void BT_CONFIG(void)
{
//PB 保护电流PWM_CURR_LMT
BT_DeInit(BT0);
BT_IO_Init(BT0_PA15);
BT_Configure(BT0,BTCLK_EN,7,BT_IMMEDIATE,BT_CONTINUOUS,BT_PCLKDIV);//TCLK=PCLK/(0+1)
BT_ControlSet_Configure(BT0,BT_START_HIGH,BT_IDLE_LOW,BT_SYNC_DIS,BT_SYNCMD_DIS,BT_OSTMDX_ONCE,BT_AREARM_DIS,BT_CNTRLD_EN);
//BT_ControlSet_Configure(BT0,BT_START_HIGH,BT_IDLE_LOW,BT_SYNC_EN,BT_SYNCMD_DIS,BT_OSTMDX_ONCE,BT_AREARM_DIS,BT_CNTRLD_EN);
//BT_Trigger_Configure(BT0,BT_TRGSRC_PEND,BT_TRGOE_EN);
BT_Period_CMP_Write(BT0,4095,4000);
BT_Start(BT0);
// BT_ConfigInterrupt_CMD(BT0,ENABLE,BT_PEND);
// BT0_INT_ENABLE();
//100us 定时器初始化
BT_DeInit(BT1);
BT_Configure(BT1,BTCLK_EN,0,BT_IMMEDIATE,BT_CONTINUOUS,BT_PCLKDIV);
BT_ControlSet_Configure(BT1,BT_START_HIGH,BT_IDLE_LOW,BT_SYNC_DIS,BT_SYNCMD_DIS,BT_OSTMDX_ONCE,BT_AREARM_DIS,BT_CNTRLD_EN);
BT_Period_CMP_Write(BT1,4780,1);
BT_Start(BT1);
BT_ConfigInterrupt_CMD(BT1,ENABLE,BT_CMP);
BT1_INT_ENABLE();
}
/*************************************************************/
//UART0 CONFIG
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/
void UART0_CONFIG(void)
{
UART0_DeInit(); //clear all UART Register
UART_IO_Init(IO_UART0,0); //use PA0.1->RXD0, PA0.0->TXD0
UARTInit(UART0,416,UART_PAR_NONE); //baudrate=sysclock 48M/416=115200
UARTInitRxTxIntEn(UART0,416,UART_PAR_NONE); //baudrate=sysclock 48M/416=115200,tx rx int enabled
UART0_Int_Enable();
}
/*************************************************************/
//UART1 CONFIG
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/
void UART1_CONFIG(void)
{
UART1_DeInit(); //clear all UART Register
UART_IO_Init(IO_UART1,0); //use PA0.13->RXD1, PB0.0->TXD1
UARTInit(UART1,416,UART_PAR_NONE); //baudrate=sysclock 48M/416=115200
UARTInitRxTxIntEn(UART1,416,UART_PAR_NONE); //baudrate=sysclock 48M/416=115200 tx rx int enabled
UART1_Int_Enable();
}
/*************************************************************/
//UART2 CONFIG
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/
void UART2_CONFIG(void)
{
UART2_DeInit(); //clear all UART Register
UART_IO_Init(IO_UART2,2); //use PA0.7->RXD2, PA0.6->TXD2
UARTInit(UART2,416,UART_PAR_NONE); //baudrate=sysclock 48M/416=115200
//UARTInitRxTxIntEn(UART2,416,UART_PAR_NONE); //baudrate=sysclock 48M/416=115200 tx rx int enabled
//UART2_Int_Enable();
}
/*************************************************************/
//adc config
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/
void ADC12_CONFIG(void)
{
ADC12_RESET_VALUE(); //ADC所有寄存器复位
ADC12_Software_Reset(); //ADC软件复位
ADC12_CLK_CMD(ADC_CLK_CR,ENABLE); //使能ADC CLK
ADC12_Configure_Mode(ADC12_12BIT,Continuous_mode,0,6,2,4);
ADC12_Configure_VREF_Selecte(ADC12_VREFP_VDD_VREFN_VSS);
ADC12_ConversionChannel_Config(ADC12_ADCIN4,ADC12_CV_RepeatNum1,ADC12_AVGDIS,0);
ADC12_ConversionChannel_Config(ADC12_ADCIN7,ADC12_CV_RepeatNum1,ADC12_AVGDIS,1);
ADC12_ConversionChannel_Config(ADC12_ADCIN8,ADC12_CV_RepeatNum1,ADC12_AVGDIS,2);
ADC12_ConversionChannel_Config(ADC12_ADCIN10,ADC12_CV_RepeatNum1,ADC12_AVGDIS,3);
ADC12_CMD(ENABLE);
ADC12_ready_wait();
ADC12_Control(ADC12_START);
}
/*************************************************************/
//GPT0 Functions
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/
void GPT0_CONFIG(void)
{
GPT_Configure(GPTCLK_EN,GPT_PCLK,GPT_IMMEDIATE,1);
GPT_WaveCtrl_Configure(GPT_INCREASE,GPT_SWSYNDIS,GPT_IDLE_LOW,GPT_PRDLD_PEND,GPT_OPM_CONTINUOUS,GPT_BURST_DIS,GPT_CKS_PCLK,GPT_CG_CHAX,GPT_CGFLT_00,GPT_PRDLD_ZERO);
GPT_Period_CMP_Write(24000,1,1000);
//GPT_WaveLoad_Configure(GPT_WAVEA_IMMEDIATE,GPT_WAVEB_SHADOW,GPT_AQLDA_ZERO,GPT_AQLDB_ZERO);
//GPT_SyncSet_Configure(GPT_SYNCUSR0_EN,GPT_OST_CONTINUOUS,GPT_TXREARM_DIS,GPT_TRGO0SEL_SR0,GPT_TRG10SEL_SR0,GPT_AREARM_DIS);
//GPT_Trigger_Configure(GPT_SRCSEL_TRGUSR0EN,GPT_BLKINV_DIS,GPT_ALIGNMD_PRD,GPT_CROSSMD_DIS,5,5);
//GPT_EVTRG_Configure(GPT_TRGSRC0_PRD,GPT_TRGSRC1_PRD,GPT_ESYN0OE_EN,GPT_ESYN1OE_EN,GPT_CNT0INIT_EN,GPT_CNT1INIT_EN,3,3,3,3);
GPT_Start();
GPT_ConfigInterrupt_CMD(ENABLE,GPT_INT_PEND);
GPT_INT_ENABLE();
}
/*************************************************************/
//syscon Functions
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/
void SYSCON_CONFIG(void)
{
//------SYSTEM CLK AND PCLK FUNTION---------------------------/
SYSCON_RST_VALUE(); //SYSCON all register clr
SYSCON_General_CMD(ENABLE,ENDIS_ISOSC); //SYSCON enable/disable clock source
//EMOSC_OSTR_Config(0XAD,0X1f,EM_LFSEL_EN,EM_FLEN_EN,EM_FLSEL_10ns); //EM_CNT=0X3FF,0xAD(36K),EM_GM=0,Low F modedisable,EM filter disable,if enable,cont set 5ns
//SYSCON_General_CMD(ENABLE,ENDIS_EMOSC);
SYSCON_HFOSC_SELECTE(HFOSC_SELECTE_48M); //HFOSC selected 48MHz
SystemCLK_HCLKDIV_PCLKDIV_Config(SYSCLK_HFOSC,HCLK_DIV_1,PCLK_DIV_1,HFOSC_48M);//system clock set, Hclk div ,Pclk div set system clock=SystemCLK/Hclk div/Pclk div
//------------ WDT FUNTION --------------------------------/
SYSCON_IWDCNT_Config(IWDT_TIME_4S,IWDT_INTW_DIV_7); //WDT TIME 1s,WDT alarm interrupt time=1s-1s*1/8=0.875S
SYSCON_WDT_CMD(ENABLE); //enable/disable WDT
SYSCON_IWDCNT_Reload(); //reload WDT
IWDT_Int_Enable();
//------------ WWDT FUNTION --------------------------------/
WWDT_CNT_Load(0xFF);
WWDT_CONFIG(PCLK_4096_DIV0,0xFF,WWDT_DBGDIS);
WWDT_Int_Config(DISABLE);
//WWDT_CMD(ENABLE); //enable wwdt
//------------ CLO Output --------------------------------/
//SYSCON_CLO_CONFIG(CLO_PA08); //CLO output setting
//SYSCON_CLO_SRC_SET(CLO_HFCLK,CLO_DIV16); //CLO output clock and div
//------------ LVD FUNTION --------------------------------/
SYSCON_LVD_Config(ENABLE_LVDEN,INTDET_LVL_3_9V,RSTDET_LVL_1_9V,ENABLE_LVD_INT,INTDET_POL_fall); //LVD LVR Enable/Disable
LVD_Int_Enable();
//------------ SYSCON Vector --------------------------------/
SYSCON_Int_Enable(); //SYSCON VECTOR
//SYSCON_WakeUp_Enable(); //Enable WDT wakeup INT
//------------------------------------------------------------/
//OSC CLOCK Calibration
//------------------------------------------------------------/
std_clk_calib(CLK_HFOSC_48M); //Select the same clock source as the system
}
/*********************************************************************************/
/*********************************************************************************/
//APT32F102_init /
//EntryParameter:NONE /
//ReturnValue:NONE /
/*********************************************************************************/
/*********************************************************************************/
/*********************************************************************************/
void APT32F102_init(void)
{
//------------------------------------------------------------/
//Peripheral clock enable and disable
//EntryParameter:NONE
//ReturnValue:NONE
//------------------------------------------------------------/
SYSCON->PCER0=0xFFFFFFF; //PCLK Enable
SYSCON->PCER1=0xFFFFFFF; //PCLK Enable
while(!(SYSCON->PCSR0&0x1)); //Wait PCLK enabled
//------------------------------------------------------------/
//ISOSC/IMOSC/EMOSC/SYSCLK/IWDT/LVD/EM_CMFAIL/EM_CMRCV/CMD_ERR OSC stable interrupt
//EntryParameter:NONE
//ReturnValue:NONE
//------------------------------------------------------------/
SYSCON_CONFIG(); //syscon initial
CK_CPU_EnAllNormalIrq(); //enable all IRQ
SYSCON_INT_Priority(); //initial all Priority=0xC0
Set_INT_Priority(EXI1_IRQ,0);
Set_INT_Priority(UART1_IRQ,1);
Set_INT_Priority(BT1_IRQ,1);
Set_INT_Priority(UART0_IRQ,2);
//------------------------------------------------------------/
//Other IP config
//------------------------------------------------------------/
GPIO_CONFIG(); //GPIO initial
EPT0_CONFIG(); //EPT0 initial
BT_CONFIG(); //BT initial
GPT0_CONFIG(); //2024-06-16 修改 单独用于PWM 1ms定时控制
UARTx_Init(UART_0,NULL);
UARTx_Init(UART_1,BLV_PB_Control_Protocol_Processing);
EEPROM_Init();
ADC12_CONFIG(); //ADC initial
}
/******************* (C) COPYRIGHT 2019 APT Chip *****END OF FILE****/