⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 massinit.c

📁 uCOS在PIC芯片中的移植:以PIC24HJ64GP210为例进行uCOS在Microchip芯片中的移植
💻 C
📖 第 1 页 / 共 2 页
字号:
//看門狗配置
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 + -