打印
[PIC32/SAM]

PIC32初始化、中断

[复制链接]
2487|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nawu|  楼主 | 2021-9-1 16:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、初始化

// 设置系统时钟和外设总线时钟 SYSCLK=80MHz PBCLK=80MHz
void SetupHardware(void) //时钟初始化
{
        SYSTEMConfigPerformance( configCPU_CLOCK_HZ - 1 );         //SysCLK主频80M
        INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR);  //多向量中断模式
       
    AD1PCFGSET = 0xFFFFFFFF;                                  //数字模式,关闭模拟模式
        mJTAGPortEnable(DEBUG_JTAGPORT_OFF);         //关闭JTAG
       
    INTDisableInterrupts();                                  //关闭中断  
}

void __inline__ IOPortIni(void)  //IO初始化
{
    PORTSetPinsDigitalIn(IOPORT_B,BIT_14);         //        CAN_RX_VCU2              
    PORTSetPinsDigitalOut(IOPORT_B, BIT_8   //        CAN_TX_VCU2
                          | BIT_12          //        LED绿
                          | BIT_13);         //        LED红

        PORTSetPinsDigitalIn( IOPORT_D, BIT_9 );//        RTCC数据
        PORTSetPinsDigitalOut(IOPORT_D, BIT_10 );//        RTCC时钟

    PORTSetPinsDigitalIn(IOPORT_F, BIT_0);   //        CAN_RX_LMU1
    PORTSetPinsDigitalOut(IOPORT_F, BIT_1);  //        CAN_TX_LMU1

    mJTAGPortEnable(DEBUG_JTAGPORT_OFF);    //        关闭JTAG复用功能,等同于DDPCONbits.JTAGEN = 0 ;
}

//---------------------------------------------------------------------------------
//  main
//---------------------------------------------------------------------------------
int main (void)
{
        SetupHardware(); //时钟初始化
        IOPortIni();         //IO初始化
        EnableWDT();        //打开看门狗
    while(1)
    {        
    }
}



//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//                    延时微秒,单位:5 微秒
//        实际的工作频率为时钟频率/4,执行指令采用流水线方式,指令周期=1/(80M/4)*5级流水线=0.25微秒        
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~       
void mDelay5uS(UINT16 us)
{
#if     (GetSystemClock()==16000000)    //  2*us*2*1.25=5us
    us *= 2;
#elif        (GetSystemClock()==80000000)    //  10*us*2*0.25=5us
    us *= 10;
#endif   
    do                        
    { us--;}                  //1指令周期
    while (us);               //1
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//                    延时毫秒时间, 单位:1 毫秒
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~       
void mDelaymS(UINT16 ms)
{
    do
    {
        mDelayuS(200);           //  200 * 5us 为 1ms
    }
    while (--ms);
}



使用特权

评论回复
沙发
nawu|  楼主 | 2021-9-1 16:52 | 只看该作者
二、中断

多向量模式和单向量模式
每个向量编号都会分配一个中断优先级和一个影子集编号。优先级由关联向量的 IPCx
寄存器设置决定。在多向量模式下,用户可以对接收专用影子寄存器集选择优先级。在单向量模式下,所有中断都可能接收到专用影子集。

PIC32 的中断控制器可以配置为工作于以下模式之一:
• 单向量模式 —— 在一个向量地址处处理所有中断请求 (复位之后的模式)
• 多向量模式 —— 在所计算的向量地址处处理中断请求

特定中断的向量地址取决于中断控制器的配置方式。如果中断控制器配置为单向量模式,则所有中断向量使用同一向量地址。如果配置为多向量模式,则每个中断向量具有唯一的向量地址。
给定中断的向量地址使用异常基址寄存器 (EBase<31:12>)进行计算,该寄存器提供一个位于内核段 (KSEG)地址空间中的 4 KB页对齐的基址值。

        INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR);  //多向量中断模式


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

72

主题

3307

帖子

3

粉丝