猪头煮不烂 发表于 2026-1-25 14:39:56

AiCube生成STC8H8K64U一个中断框架编译报错 提示向量超出

<p>AiCube生成STC8H8K64U一个中断框架编译报错 提示向量超出</p>
<p>我现在需要用四个引脚触发中断,触发后的执行的代码是一样,触发后读取四个引脚的电平状态打印输出。并且存在多个同时触发的情况,请教该怎么做比较好</p>
<pre><code>//&lt;&lt;AICUBE_USER_HEADER_REMARK_BEGIN&gt;&gt;
////////////////////////////////////////
// 在此添加用户文件头说明信息
// 文件名称: main.c
// 文件描述:
// 文件版本: V1.0
// 修改记录:
//   1. (2026-01-25) 创建文件
////////////////////////////////////////
//&lt;&lt;AICUBE_USER_HEADER_REMARK_END&gt;&gt;


#include &quot;config.h&quot;                     //默认已包含stdio.h、intrins.h等头文件


//&lt;&lt;AICUBE_USER_INCLUDE_BEGIN&gt;&gt;
// 在此添加用户头文件包含
//&lt;&lt;AICUBE_USER_INCLUDE_END&gt;&gt;


//&lt;&lt;AICUBE_USER_GLOBAL_DEFINE_BEGIN&gt;&gt;
// 在此添加用户全局变量定义、用户宏定义以及函数声明
//&lt;&lt;AICUBE_USER_GLOBAL_DEFINE_END&gt;&gt;




////////////////////////////////////////
// 项目主函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void main(void)
{
    //&lt;&lt;AICUBE_USER_MAIN_INITIAL_BEGIN&gt;&gt;
    // 在此添加用户主函数初始化代码
    //&lt;&lt;AICUBE_USER_MAIN_INITIAL_END&gt;&gt;

    SYS_Init();

    //&lt;&lt;AICUBE_USER_MAIN_CODE_BEGIN&gt;&gt;
    // 在此添加主函数中运行一次的用户代码
    //&lt;&lt;AICUBE_USER_MAIN_CODE_END&gt;&gt;

    while (1)
    {
      USBLIB_OUT_Done();            //查询方式处理USB接收的数据

      //&lt;&lt;AICUBE_USER_MAIN_LOOP_BEGIN&gt;&gt;
      // 在此添加主函数中用户主循环代码
      //&lt;&lt;AICUBE_USER_MAIN_LOOP_END&gt;&gt;
    }
}

////////////////////////////////////////
// 系统初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void SYS_Init(void)
{
    EnableAccessXFR();                  //使能访问扩展XFR
    IAP_SetTimeBase();                  //设置IAP等待参数,产生1us时基

    //&lt;&lt;AICUBE_USER_PREINITIAL_CODE_BEGIN&gt;&gt;
    // 在此添加用户预初始化代码
    //&lt;&lt;AICUBE_USER_PREINITIAL_CODE_END&gt;&gt;

    PORT1_Init();                     //P1口初始化
    PORT3_Init();                     //P3口初始化
    CLK_Init();                         //时钟模块初始化
    delay_ms(1);
    USBLIB_Init();                      //USB库初始化
    delay_ms(1);

    //&lt;&lt;AICUBE_USER_INITIAL_CODE_BEGIN&gt;&gt;
    // 在此添加用户初始化代码
    //&lt;&lt;AICUBE_USER_INITIAL_CODE_END&gt;&gt;

    EnableGlobalInt();                  //使能全局中断
}

////////////////////////////////////////
// 微秒延时函数
// 入口参数: us (设置延时的微秒值)
// 函数返回: 无
////////////////////////////////////////
void delay_us(uint16_t us)
{
    do
    {
      NOP(14);                        //(MAIN_Fosc + 500000) / 1000000 - 10
    } while (--us);
}


////////////////////////////////////////
// 毫秒延时函数
// 入口参数: ms (设置延时的毫秒值)
// 函数返回: 无
////////////////////////////////////////
void delay_ms(uint16_t ms)
{
    uint16_t i;

    do
    {
      i = MAIN_Fosc / 10000;
      while (--i);
    } while (--ms);
}

////////////////////////////////////////
// P1口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT1_Init(void)
{
    SetP1nInitLevelLow(PIN_ALL);      //设置P1初始化电平
    SetP1nHighZInputMode(PIN_ALL);      //设置P1为高阻输入模式

    DisableP1nPullUp(PIN_ALL);          //关闭P1内部上拉电阻
    DisableP1nSchmitt(PIN_ALL);         //使能P1施密特触发
    SetP1nSlewRateNormal(PIN_ALL);      //设置P1一般翻转速度
    SetP1nDrivingNormal(PIN_ALL);       //设置P1一般驱动能力
    SetP1nDigitalInput(PIN_ALL);      //使能P1数字信号输入功能

    SetP1nRisingInt(PIN_7 | PIN_6 | PIN_5 | PIN_3); //设置P1.7,P1.6,P1.5,P1.3为上升沿中断

    EnableP1nInt(PIN_7 | PIN_6 | PIN_5 | PIN_3); //使能P1.7,P1.6,P1.5,P1.3口中断

    SetP1IntPriority(0);                //设置中断为最低优先级

    //&lt;&lt;AICUBE_USER_PORT1_INITIAL_BEGIN&gt;&gt;
    // 在此添加用户初始化代码
    //&lt;&lt;AICUBE_USER_PORT1_INITIAL_END&gt;&gt;
}

////////////////////////////////////////
// P3口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT3_Init(void)
{
    SetP3nInitLevelHigh(PIN_ALL);       //设置P3初始化电平
    SetP3nQuasiMode(PIN_7 | PIN_6 | PIN_5 | PIN_4 | PIN_3 | PIN_2); //设置P3.7,P3.6,P3.5,P3.4,P3.3,P3.2为准双向口模式
    SetP3nHighZInputMode(PIN_1 | PIN_0); //设置P3.1,P3.0为高阻输入模式

    DisableP3nPullUp(PIN_ALL);          //关闭P3内部上拉电阻
    DisableP3nSchmitt(PIN_ALL);         //使能P3施密特触发
    SetP3nSlewRateNormal(PIN_ALL);      //设置P3一般翻转速度
    SetP3nDrivingNormal(PIN_ALL);       //设置P3一般驱动能力
    SetP3nDigitalInput(PIN_ALL);      //使能P3数字信号输入功能

    //&lt;&lt;AICUBE_USER_PORT3_INITIAL_BEGIN&gt;&gt;
    // 在此添加用户初始化代码
    //&lt;&lt;AICUBE_USER_PORT3_INITIAL_END&gt;&gt;
}

////////////////////////////////////////
// 时钟初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void CLK_Init(void)
{
    CLK_SYSCLK_Divider(10);             //切换主时钟前先将系统时钟降频

    HIRC_24M();                         //选择内部预置的频率

    CLK_MCLK_HIRC();                  //选择内部高精度HIRC作为主时钟
    CLK_MCLK2_BYPASS();               //旁路MCLK2,直接使用MCLK选择

    CLK_SYSCLK_Divider(1);            //设置系统时钟分频系数

    //&lt;&lt;AICUBE_USER_CLOCK_INITIAL_BEGIN&gt;&gt;
    // 在此添加用户初始化代码
    //&lt;&lt;AICUBE_USER_CLOCK_INITIAL_END&gt;&gt;
}

////////////////////////////////////////
// USB库初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void USBLIB_Init(void)
{
    usb_init();                         //初始化USB模块
    USB_SetIntPriority(0);            //设置中断为最低优先级
    set_usb_ispcmd(&quot;@STCISP#&quot;);         //设置USB不停电下载命令

    //&lt;&lt;AICUBE_USER_USBLIB_INITIAL_BEGIN&gt;&gt;
    // 在此添加用户初始化代码
    //&lt;&lt;AICUBE_USER_USBLIB_INITIAL_END&gt;&gt;
}

////////////////////////////////////////
// 等待USB配置完成函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void USBLIB_WaitConfiged(void)
{
    while (DeviceState != DEVSTATE_CONFIGURED) //等待USB完成配置
      WDT_Clear();                  //清看门狗定时器 (防止硬件自动使能看门狗)
}

////////////////////////////////////////
// USB设备接收数据处理程序
// 入口参数: 无
// 函数返回: 无
// bUsbOutReady:USB设备接收数据标志位
// OutNumber:USB设备接收到的数据长度
// UsbOutBuffer:保存USB设备接收到的数据
////////////////////////////////////////
void USBLIB_OUT_Done(void)
{
    if (bUsbOutReady)                   //查询是否有接收到USB主机发送数据
    {
      //&lt;&lt;AICUBE_USER_USBLIB_ISR_CODE1_BEGIN&gt;&gt;
      // 在此添加中断函数用户代码
      USB_SendData(UsbOutBuffer, OutNumber); //原路返回, 用于测试
      // 在此处添加用户处理接收数据的代码
      //&lt;&lt;AICUBE_USER_USBLIB_ISR_CODE1_END&gt;&gt;
      usb_OUT_done();               //当前包的数据处理完成,通知USB主机可以发送下一包数据
    }
}


////////////////////////////////////////
// P1中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT1_ISR(void) interrupt P1INT_VECTOR
{
    //&lt;&lt;AICUBE_USER_PORT1_ISR_CODE1_BEGIN&gt;&gt;
    // 在此添加中断函数用户代码
    uint8_t intf;

    intf = CheckP1nFlag(PIN_ALL);       //读取中断请求标志
    ClearP1nFlag(PIN_ALL);            //清除中断请求标志
    //&lt;&lt;AICUBE_USER_PORT1_ISR_CODE1_END&gt;&gt;
}


//&lt;&lt;AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN&gt;&gt;
// 在此添加用户函数实现代码
//&lt;&lt;AICUBE_USER_FUNCTION_IMPLEMENT_END&gt;&gt;



</code></pre>

angmall 发表于 2026-1-25 14:55:09

Keil 中断拓展插件

Keil C51, Keil C251 中断号的 拓展:0 ~ 254,BL51/LX51/L251链接器, 说明

神农鼎 发表于 2026-1-25 15:01:16


页: [1]
查看完整版本: AiCube生成STC8H8K64U一个中断框架编译报错 提示向量超出