神农鼎 发表于 2025-4-13 21:34:06

所有 普通 I/O口 都支持的 外部中断,AiCube@Ai8051U,强大的辅助开发工具再学习

所有 普通 I/O口 都支持的 外部中断,
下降沿产生中断,上升沿产生中断,
低电平产生中断,高电平产生中断
AiCube@Ai8051U,强大的辅助开发工具再学习

下面演示,实际自动配置启动程序的步骤

https://www.stcai.com/gjrj
先:扩展 KEIL C251 / KEIL C51 支持的中断号
===已扩展过,这一步就可省

再:重新添加头文件
===如ISP软件升级,建议做下

下面是实际的 AiCube 的操作步骤












国芯人工智能 发表于 2025-4-13 21:38:00

在嵌入式系统开发中,外部中断功能是提升系统响应速度和实时性的关键特性。Ai8051U作为一款高性能的微控制器,其所有普通I/O口均支持外部中断功能,这为开发者提供了极大的灵活性和便利性。通过外部中断,系统可以在不占用CPU资源的情况下,实时响应外部事件,从而优化系统性能。

AiCube@Ai8051U作为一款强大的辅助开发工具,进一步简化了开发流程。它不仅提供了丰富的库函数和示例代码,还支持实时调试和性能分析,帮助开发者快速定位和解决问题。通过AiCube,开发者可以更高效地学习和掌握Ai8051U的各项功能,缩短开发周期,提升产品质量。

在具体应用中,开发者可以根据需求配置I/O口的中断触发方式(如上升沿、下降沿或电平变化),并编写相应的中断服务程序(ISR)来处理事件。Ai8051U的中断优先级管理机制确保了高优先级事件能够及时得到处理,从而满足复杂系统的实时性要求。

此外,Ai8051U还提供了丰富的外设接口和通信协议支持,如UART、SPI、I2C等,进一步扩展了其应用范围。无论是工业控制、智能家居还是消费电子,Ai8051U都能提供稳定可靠的解决方案。

总之,Ai8051U凭借其强大的外部中断功能和AiCube辅助开发工具的支持,为嵌入式系统开发者提供了高效、便捷的开发体验。通过深入学习和实践,开发者可以充分发挥Ai8051U的潜力,打造出性能卓越的嵌入式应用。

[本文内容由国芯人工智能辅助生成,仅供参考]

神农鼎 发表于 2025-4-13 21:52:43

几个重要的设置图片






神农鼎 发表于 2025-4-13 21:56:35







////////////////////////////////////////
// 文件名称: main.c
// 文件描述:
// 文件版本: V1.0
// 修改记录:
//   1. (2025-04-13) 创建文件
////////////////////////////////////////

#include "config.h"                     //默认已包含stdio.h、intrins.h、ai_usb.h等头文件

////////////////////////////////////////
// 项目主函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void main(void)
{
    SYS_Init();

    while (1)
    {
    }
}

////////////////////////////////////////
// 系统初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void SYS_Init(void)
{
    EnableAccessXFR();                  //使能访问扩展XFR
    AccessCodeFastest();                //设置最快速度访问程序代码
    AccessIXramFastest();               //设置最快速度访问内部XDATA
    IAP_SetTimeBase();                  //设置IAP等待参数,产生1us时基

    P0M0 = 0x00; P0M1 = 0x00;         //初始化P0口为准双向口模式
    P1M0 = 0x00; P1M1 = 0x00;         //初始化P1口为准双向口模式
    P2M0 = 0x00; P2M1 = 0x00;         //初始化P2口为准双向口模式
    P3M0 = 0x00; P3M1 = 0x00;         //初始化P3口为准双向口模式
    P4M0 = 0x00; P4M1 = 0x00;         //初始化P4口为准双向口模式
    P5M0 = 0x00; P5M1 = 0x00;         //初始化P5口为准双向口模式

    CLK_Init();                         //时钟模块初始化
    PORT0_Init();                     //P0初始化
    PORT1_Init();                     //P1初始化
    PORT2_Init();                     //P2初始化
    PORT3_Init();                     //P3初始化
    PORT4_Init();                     //P4初始化
    PORT5_Init();                     //P5初始化

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

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

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

////////////////////////////////////////
// 端口3中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT3_ISR(void) interrupt P3INT_VECTOR
{
    uint8_t intf;

    intf = CheckP3nFlag(BIT_ALL);       //读取中断请求标志
    ClearP3nFlag(BIT_ALL);            //清除中断请求标志
}


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

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

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

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

    CLK_HSIOCK_MCLK();                  //选择MCLK主时钟作为高速外设时钟源
    CLK_HSIOCK_Divider(1);            //设置高速外设时钟预分频系数

    CLK_SPICLK_Divider(1);            //设置SPI时钟预分频系数
    CLK_I2SCLK_Divider(1);            //设置I2S时钟预分频系数
    CLK_PWMACLK_Divider(1);             //设置PWMA时钟预分频系数
    CLK_PWMBCLK_Divider(1);             //设置PWMB时钟预分频系数
    CLK_TFPUCLK_Divider(1);             //设置TFPU时钟预分频系数
}

////////////////////////////////////////
// P0口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT0_Init(void)
{
    SetP0nQuasiMode(BIT_ALL);         //设置P0为准双向口模式

    DisableP0nPullUp(BIT_ALL);          //关闭P0内部上拉电阻
    DisableP0nPullDown(BIT_ALL);      //关闭P0内部下拉电阻
    DisableP0nSchmitt(BIT_ALL);         //使能P0施密特触发
    SetP0nSlewRateNormal(BIT_ALL);      //设置P0一般翻转速度
    SetP0nDrivingNormal(BIT_ALL);       //设置P0一般驱动能力
    SetP0nDigitalInput(BIT_ALL);      //使能P0数字信号输入功能
}

////////////////////////////////////////
// P1口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT1_Init(void)
{
    SetP1nQuasiMode(BIT_ALL);         //设置P1为准双向口模式

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

////////////////////////////////////////
// P2口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT2_Init(void)
{
    SetP2nQuasiMode(BIT_ALL);         //设置P2为准双向口模式

    DisableP2nPullUp(BIT_ALL);          //关闭P2内部上拉电阻
    DisableP2nPullDown(BIT_ALL);      //关闭P2内部下拉电阻
    DisableP2nSchmitt(BIT_ALL);         //使能P2施密特触发
    SetP2nSlewRateNormal(BIT_ALL);      //设置P2一般翻转速度
    SetP2nDrivingNormal(BIT_ALL);       //设置P2一般驱动能力
    SetP2nDigitalInput(BIT_ALL);      //使能P2数字信号输入功能
}

////////////////////////////////////////
// P3口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT3_Init(void)
{
    SetP3nQuasiMode(BIT_ALL);         //设置P3为准双向口模式

    EnableP3nPullUp(0x3c);            //使能P3.5,P3.4,P3.3,P3.2内部上拉电阻
    DisableP3nPullUp(0xc3);             //关闭P3.7,P3.6,P3.1,P3.0内部上拉电阻
    DisableP3nPullDown(BIT_ALL);      //关闭P3内部下拉电阻
    DisableP3nSchmitt(BIT_ALL);         //使能P3施密特触发
    SetP3nSlewRateNormal(BIT_ALL);      //设置P3一般翻转速度
    SetP3nDrivingNormal(BIT_ALL);       //设置P3一般驱动能力
    SetP3nDigitalInput(BIT_ALL);      //使能P3数字信号输入功能

    SetP3nFallingInt(0x04);             //设置P3.2为下降沿中断
    SetP3nRisingInt(0x08);            //设置P3.3为上升沿中断
    SetP3nLowLevelInt(0x20);            //设置P3.5为低电平中断
    SetP3nHighLevelInt(0x10);         //设置P3.4为高电平中断

    SetP3nIntWaieup(0x3c);            //使能P3.5,P3.4,P3.3,P3.2唤醒STOP模式

    EnableP3nInt(0x3c);               //使能P3.5,P3.4,P3.3,P3.2口中断

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

////////////////////////////////////////
// P4口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT4_Init(void)
{
    SetP4nQuasiMode(BIT_ALL);         //设置P4为准双向口模式

    DisableP4nPullUp(BIT_ALL);          //关闭P4内部上拉电阻
    DisableP4nPullDown(BIT_ALL);      //关闭P4内部下拉电阻
    DisableP4nSchmitt(BIT_ALL);         //使能P4施密特触发
    SetP4nSlewRateNormal(BIT_ALL);      //设置P4一般翻转速度
    SetP4nDrivingNormal(BIT_ALL);       //设置P4一般驱动能力
    SetP4nDigitalInput(BIT_ALL);      //使能P4数字信号输入功能
}

////////////////////////////////////////
// P5口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT5_Init(void)
{
    SetP5nQuasiMode(BIT_ALL);         //设置P5为准双向口模式

    DisableP5nPullUp(BIT_ALL);          //关闭P5内部上拉电阻
    DisableP5nPullDown(BIT_ALL);      //关闭P5内部下拉电阻
    DisableP5nSchmitt(BIT_ALL);         //使能P5施密特触发
    SetP5nSlewRateNormal(BIT_ALL);      //设置P5一般翻转速度
    SetP5nDrivingNormal(BIT_ALL);       //设置P5一般驱动能力
    SetP5nDigitalInput(BIT_ALL);      //使能P5数字信号输入功能
}


ntcwcscz 发表于 2025-4-14 12:52:41

STC

ntcwcscz 发表于 2025-4-14 13:01:27

我来冒个泡

proktv 发表于 2025-4-15 08:11:32

强大
页: [1]
查看完整版本: 所有 普通 I/O口 都支持的 外部中断,AiCube@Ai8051U,强大的辅助开发工具再学习