📄 massinit.c
字号:
//看門狗配置
static void WDT_Init(void)
{
_SWDTEN=0;//禁止看門狗
}
//振蕩器配置
static void Osc_Init(void)
{
_FRCDIV=0x1;//FRC後分頻比
_PLLPRE=0;//對外部時鐘輸入Fin=11.0592MHz進行2預分頻,以產生0.8~8MHz時鐘5.5296MHz
_PLLDIV=0x1A;//對預分頻後0.8~8MHz時鐘進行28倍頻,以產生100~200MHz時鐘154.8288MHz
_PLLPOST=0;//對100~200MHz時鐘進行2分頻,以產生12.5~80MHz時鐘Fosc=77.4144Mhz, 器件指令时钟FCY = FOSC/2=38.7072MHz
}
//與車架板通訊口配置
void UART1_Init (INT32U baud_rate)
{
INT32U Fcy;
Fcy = BSP_CPU_ClkFrq(); /* Get the Fcy frequency which drives the UART */
U1BRG = (INT16U)((Fcy / (16 * baud_rate)) - 1); //251 /* Compute divisor for desired baud rate */
U1MODE = UART_EN; /* Enable the UART with the parameters 8N1 */
U1STA = UTXEN | UTXISEL; /* Enable the transmitter, configure the Tx and Rx */
/* interrupt modes, but do not enable interrupts */
/* Tx Interrupt Mode is set for Tx Shift Reg Empty */
/* Rx Interrupt Mode is set to Interrupt for each Rx */
IFS0 &= ~(U1TXIF | U1RXIF); /* Clear pending interrupts */
IPC3 &= ~U1TXIP_MASK; /* Clear the UART1 Tx priority bits */
IPC2 &= ~U1RXIP_MASK; /* Clear the UART1 Rx priority bits */
IPC3 |= (OSVIEW_INT_PRIO << 0); /* Configure the UART1 Tx interrupt priorities */
IPC2 |= (OSVIEW_INT_PRIO << 12); /* Configure the UART1 Rx interrupt priorities */
IEC0 |= U1RXIE; /* Enable Receive Interrupts */
IEC0 |= U1TXIE; /* Enable Tx interrupts */
}
//與PC機通訊口配置
void UART2_Init (INT32U baud_rate)
{
INT32U Fcy;
Fcy = BSP_CPU_ClkFrq(); /* Get the Fcy frequency which drives the UART */
U2BRG = (INT16U)((Fcy / (16 * baud_rate)) - 1); /* Compute divisor for desired baud rate */
U2MODE = UART_EN; /* Enable the UART with the parameters 8N1 */
U2STA = UTXEN | UTXISEL; /* Enable the transmitter, configure the Tx and Rx */
/* interrupt modes, but do not enable interrupts */
/* Tx Interrupt Mode is set for Tx Shift Reg Empty */
/* Rx Interrupt Mode is set to Interrupt for each Rx */
IFS1 &= ~(U2TXIF | U2RXIF); /* Clear pending interrupts */
IPC7 &= ~U2TXIP_MASK; /* Clear the UART2 Tx priority bits */
IPC7 &= ~U2RXIP_MASK; /* Clear the UART2 Rx priority bits */
IPC7 |= (OSVIEW_INT_PRIO << 8) | (OSVIEW_INT_PRIO << 12); /* Configure the UART2 Rx and Tx interrupt priorities */
IEC1 |= U2RXIE; /* Enable Receive Interrupts */
IEC1 |= U2TXIE; /* Enable Tx interrupts */
}
//周期檢測捕捉口配置
static void ICInt_Init(void)
{
//定时器配置
_T2IE=0;//禁止T3中斷
T2CON = 0x0000;//關閉定時器
T2CONbits.T32=0;//T2,T3作為16位模式
PR2 = 0xFFFF;
TMR2 = 0;
T2CON = 0x8030;//預分頻比256:1,啟動時基計數,中断周期为433.439ms
_T2IP=5;//提高T2优先级,保证IC捕获准确度
_T2IE=1;//使能T2中斷
//发生捕捉事件时捕捉TMR2的内容;每次捕捉事件中断一次;每个上升沿捕捉一次
IC1CON=0x0083;
IC2CON=0x0083;
IC3CON=0x0083;
IC4CON=0x0083;
//使能捕获中断
_IC1IF=0;
_IC2IF=0;
_IC3IF=0;
_IC4IF=0;
_IC1IE=1;
_IC2IE=1;
_IC3IE=1;
_IC4IE=1;
}
//馬達驅動PWM口配置
static void PWM_Init(void)
{
//時基配置
_T3IE=0;//禁止T3中斷
T3CON = 0x0000;//關閉定時器
T2CONbits.T32=0;//T2,T3作為16位模式
PR3 = PWM_PERIOD*BSP_CPU_ClkFrq()/1000000L-1;//3095(0x0C17)
TMR3 = 0;
//初始化占空比
OC1R = 0;//159;
OC1RS = 0;//799;//159;
OC2R = 0;//318;
OC2RS = 0;//799;//318;
OC3R = 0;//477;
OC3RS = 0;//799;//477;
OC4R = PR3*8/10;// 80%占空比
OC4RS = 2476;//
OC5R = 0;//636;
OC5RS = 0;//799;//636;
OC6R = 0;//795;
OC6RS = 0;//799;//795;
OC7R = 0;//954;
OC7RS = 0;//799;//954;
OC8R = 0;//1113;
OC8RS = 0;//799;//1113;
//選擇PWM模式,選擇Timer3為PWM時基
OC1CON = 0x000e;
OC2CON = 0x000e;
OC3CON = 0x000e;
OC4CON = 0x000e;//test080521
OC5CON = 0x000e;
OC6CON = 0x000e;
OC7CON = 0x000e;
OC8CON = 0x000e;
T3CON = 0x8000;//預分頻比1:1,啟動時基計數
_T3IP=5;//提高T3优先级,保证PWM缓变可靠
_T3IE=1;//使能T3中斷
}
//定時器配置
static void Timer_Init(void)
{
//配置1ms公用定時器
T1CON=0x0000;//關閉定時器運行
IFS0&= ~T1IF_MASK;
//_T1IF=0;
_T1IP=4;
//_T1IP=4;
_T1IE=1;
PR1=PUBLIC_PERIOD*BSP_CPU_ClkFrq()/1000L-1;//設置1ms公用定時器周期,38706(0x9732)
TMR1 = 0;
T1CON=0x8000;//啟動定時器運行
}
//全局变量初始化
static void Var_Init(void)
{
INT8U i;
for(i=0;i<(CNT_PART_POINT_NUM-2)*CNT_PART_DIVIS_NUM+1;i++)
{
AllSurPstDist[i][0]=AllSurPstDistBak[i][0];
AllSurPstDist[i][1]=AllSurPstDistBak[i][1];
}
//初始化限位状态
SetLimit();
}
//中断控制初始化
static void IntCon_Init(void)
{
INTCON1=0x0000;//允许中断嵌套(否则对SR中IPL的写操作对用户中断无影响,从而无法关闭中断!IPL3位始终为只读,故也不能用以关闭中断)
INTCON2=0x0000;//外部中断采用上升沿触发
}
///////////////////////////////////////////////////
void System_Init(void)
{
IntCon_Init();
WDT_Init();
Osc_Init();
Port_Init();
CNInt_Init();
Counter_Init();
//CurrAD_Init();
UART1_Init(9600);
UART2_Init(9600); /* Initialize target specific code */
ICInt_Init();
PWM_Init();
Timer_Init();
Var_Init();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -