找回密码
 立即注册
查看: 213|回复: 5

AiCube工具再学习 !

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:248
  • 最近打卡:2025-04-27 09:57:01
已绑定手机

24

主题

756

回帖

3315

积分

超级版主

积分
3315
QQ
发表于 2025-3-31 16:02:12 | 显示全部楼层 |阅读模式
定时器T0 / T1 / T2 / T3 / T4, T11,1S, 500ms,10ms,200us,5us,2s
截图202503311559477249.jpg 截图202503311600046244.jpg 截图202503311600162904.jpg 截图202503311600271852.jpg 截图202503311600379615.jpg 截图202503311600504761.jpg 截图202503311601015373.jpg 截图202504021346297580.jpg


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

#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时基

    P0=0xFF;
        P40=0;

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

    TIMER0_Init();                      //定时器0初始化
    TIMER1_Init();                      //定时器1初始化
    TIMER2_Init();                      //定时器2初始化
    TIMER3_Init();                      //定时器3初始化
    TIMER4_Init();                      //定时器4初始化
    TIMER11_Init();                     //定时器11初始化

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

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

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

////////////////////////////////////////
// 定时器0中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER0_ISR(void) interrupt TMR0_VECTOR
{
        P00=!P00;
}

////////////////////////////////////////
// 定时器1中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER1_ISR(void) interrupt TMR1_VECTOR
{
        P01=!P01;
}

////////////////////////////////////////
// 定时器2中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER2_ISR(void) interrupt TMR2_VECTOR
{
        P02=!P02;
}

////////////////////////////////////////
// 定时器3中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER3_ISR(void) interrupt TMR3_VECTOR
{
        P03=!P03;
}

////////////////////////////////////////
// 定时器4中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER4_ISR(void) interrupt TMR4_VECTOR
{
        P04=!P04;
}

////////////////////////////////////////
// 定时器11中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER11_ISR(void) interrupt TMR11_VECTOR
{
        P05=!P05;
}


////////////////////////////////////////
// 定时器0初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER0_Init(void)
{
#define T0_PSCR         102
#define T0_RELOAD       (65536 - SYSCLK / 12 / (T0_PSCR + 1) * 2 / 1)

    TIMER0_TimerMode();                 //设置定时器0为定时模式
    TIMER0_12TMode();                   //设置定时器0为12T模式
    TIMER0_Mode0();                     //设置定时器0为模式0 (16位自动重载模式)
    TIMER0_DisableGateINT0();           //禁止定时器0门控
    TIMER0_SetIntPriority(0);           //设置中断为最低优先级
    TIMER0_EnableInt();                 //使能定时器0中断
    TIMER0_SetPrescale(T0_PSCR);        //设置定时器0的8位预分频
    TIMER0_SetReload16(T0_RELOAD);      //设置定时器0的16位重载值
    TIMER0_Run();                       //定时器0开始运行
}

////////////////////////////////////////
// 定时器1初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER1_Init(void)
{
#define T1_PSCR         25
#define T1_RELOAD       (65536 - SYSCLK / 12 / (T1_PSCR + 1) * 500 / 1000)

    TIMER1_TimerMode();                 //设置定时器1为定时模式
    TIMER1_12TMode();                   //设置定时器1为12T模式
    TIMER1_Mode0();                     //设置定时器1为模式0 (16位自动重载模式)
    TIMER1_DisableGateINT1();           //禁止定时器1门控
    TIMER1_SetIntPriority(0);           //设置中断为最低优先级
    TIMER1_EnableInt();                 //使能定时器1中断
    TIMER1_SetPrescale(T1_PSCR);        //设置定时器1的8位预分频
    TIMER1_SetReload16(T1_RELOAD);      //设置定时器1的16位重载值
    TIMER1_Run();                       //定时器1开始运行
}

////////////////////////////////////////
// 定时器2初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER2_Init(void)
{
#define T2_PSCR         5
#define T2_RELOAD       (65536 - SYSCLK / 12 / (T2_PSCR + 1) * 100 / 1000)

    TIMER2_TimerMode();                 //设置定时器2为定时模式
    TIMER2_12TMode();                   //设置定时器2为12T模式
    TIMER2_EnableInt();                 //使能定时器2中断
    TIMER2_SetPrescale(T2_PSCR);        //设置定时器2的8位预分频
    TIMER2_SetReload16(T2_RELOAD);      //设置定时器2的16位重载值
    TIMER2_Run();                       //定时器2开始运行
}

////////////////////////////////////////
// 定时器3初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER3_Init(void)
{
#define T3_PSCR         1
#define T3_RELOAD       (65536 - SYSCLK / 12 / (T3_PSCR + 1) * 20 / 1000)

    TIMER3_TimerMode();                 //设置定时器3为定时模式
    TIMER3_12TMode();                   //设置定时器3为12T模式
    TIMER3_EnableInt();                 //使能定时器3中断
    TIMER3_SetPrescale(T3_PSCR);        //设置定时器3的8位预分频
    TIMER3_SetReload16(T3_RELOAD);      //设置定时器3的16位重载值
    TIMER3_Run();                       //定时器3开始运行
}

////////////////////////////////////////
// 定时器4初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER4_Init(void)
{
#define T4_PSCR         0
#define T4_RELOAD       (65536 - SYSCLK / 12 / (T4_PSCR + 1) * 2 / 1000)

    TIMER4_TimerMode();                 //设置定时器4为定时模式
    TIMER4_12TMode();                   //设置定时器4为12T模式
    TIMER4_EnableInt();                 //使能定时器4中断
    TIMER4_SetPrescale(T4_PSCR);        //设置定时器4的8位预分频
    TIMER4_SetReload16(T4_RELOAD);      //设置定时器4的16位重载值
    TIMER4_Run();                       //定时器4开始运行
}

////////////////////////////////////////
// 定时器11初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER11_Init(void)
{
#define T11_PSCR            0
#define T11_RELOAD      (65536 - SYSCLK / 12 / (T11_PSCR + 1) * 1 / 1000000)

    TIMER11_TimerMode();                //设置定时器11为定时模式
    TIMER11_12TMode();                  //设置定时器11为12T模式
    TIMER11_EnableInt();                //使能定时器11中断
    TIMER11_SetPrescale(T11_PSCR);      //设置定时器11的8位预分频
    TIMER11_SetReload16(T11_RELOAD);    //设置定时器11的16位重载值
    TIMER11_Run();                      //定时器11开始运行
}



定时器中断.zip

123 KB, 下载次数: 1

回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-3-31 16:03:00 | 显示全部楼层
AiCube工具再学习:定时器配置与应用

在嵌入式系统开发中,定时器(Timer)是至关重要的硬件资源,用于实现精确的时间控制、任务调度和事件触发。AiCube工具提供了多种定时器配置选项,包括T0、T1、T2、T3、T4以及T11,支持从微秒级到秒级的时间间隔。本文将详细介绍这些定时器的配置方法及其应用场景。

1. 定时器概述

定时器是嵌入式系统中用于计时的硬件模块,通常通过计数时钟周期来实现时间测量。AiCube工具支持的定时器包括:
T0 / T1 / T2 / T3 / T4:通用定时器,适用于大多数时间控制任务。
T11:高精度定时器,适用于需要更高时间分辨率的应用。

2. 定时器配置

AiCube工具允许用户根据需求配置定时器的时间间隔,常见的配置包括:
1秒(1S):适用于长时间间隔的任务调度。
500毫秒(500ms):适用于中等时间间隔的任务调度。
10毫秒(10ms):适用于较短时间间隔的任务调度。
200微秒(200us):适用于高频率事件触发。
5微秒(5us):适用于极高频率事件触发。
2秒(2s):适用于长时间间隔的任务调度。

3. 定时器应用场景

不同的定时器配置适用于不同的应用场景:
1秒(1S):适用于系统状态监控、数据采集等低频任务。
500毫秒(500ms):适用于中等频率的任务调度,如传感器数据读取。
10毫秒(10ms):适用于高频任务调度,如电机控制、PWM信号生成。
200微秒(200us):适用于高精度时间测量,如超声波测距。
5微秒(5us):适用于极高精度时间测量,如高速数据采集。
2秒(2s):适用于长时间间隔的任务调度,如系统自检。

4. 定时器配置示例

以下是一个使用AiCube工具配置定时器的示例代码:
  1. c
  2. include "AiCube.h"
  3. void TimerInit(void) {
  4.     // 配置T0定时器为1秒
  5.     AiCubeTimerConfig(T0, 1000); // 1秒
  6.     // 配置T1定时器为500毫秒
  7.     AiCubeTimerConfig(T1, 500); // 500毫秒
  8.     // 配置T2定时器为10毫秒
  9.     AiCubeTimerConfig(T2, 10); // 10毫秒
  10.     // 配置T3定时器为200微秒
  11.     AiCubeTimerConfig(T3, 0.2); // 200微秒
  12.     // 配置T4定时器为5微秒
  13.     AiCubeTimerConfig(T4, 0.005); // 5微秒
  14.     // 配置T11定时器为2秒
  15.     AiCubeTimerConfig(T11, 2000); // 2秒
  16. }
  17. void TimerISR(void) {
  18.     // 定时器中断服务程序
  19.     // 根据定时器编号执行相应任务
  20.     switch (AiCubeTimerGetID()) {
  21.         case T0:
  22.             // 执行1秒任务
  23.             break;
  24.         case T1:
  25.             // 执行500毫秒任务
  26.             break;
  27.         case T2:
  28.             // 执行10毫秒任务
  29.             break;
  30.         case T3:
  31.             // 执行200微秒任务
  32.             break;
  33.         case T4:
  34.             // 执行5微秒任务
  35.             break;
  36.         case T11:
  37.             // 执行2秒任务
  38.             break;
  39.         default:
  40.             break;
  41.     }
  42. }
复制代码

5. 总结

AiCube工具提供了灵活的定时器配置选项,能够满足不同应用场景的需求。通过合理配置定时器,开发者可以实现精确的时间控制和任务调度,提高系统的可靠性和效率。在实际应用中,建议根据具体需求选择合适的定时器配置,并优化中断服务程序,以确保系统的稳定运行。

通过本文的介绍,相信读者对AiCube工具的定时器配置有了更深入的了解。在实际开发中,建议结合具体应用场景,灵活运用这些定时器,以实现最佳的系统性能。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-3-31 16:03:00 | 显示全部楼层
AiCube工具再学习:定时器T0 / T1 / T2 / T3 / T4,T11,1S, 500ms,10ms,200us,5us,2s

在嵌入式系统开发中,定时器(Timer)是至关重要的硬件资源,用于精确控制时间相关的任务。AiCube工具提供了多种定时器配置选项,包括T0、T1、T2、T3、T4以及T11,支持从微秒(us)到秒(s)级别的时间间隔设置。以下是对这些定时器的详细解析及其应用场景的探讨。

1. 定时器概述
定时器是嵌入式系统中用于计时和事件触发的硬件模块。通过配置定时器,开发者可以实现周期性任务调度、精确延时、PWM信号生成等功能。AiCube工具支持的定时器包括T0、T1、T2、T3、T4和T11,每个定时器具有不同的特性和应用场景。

2. 定时器配置
AiCube工具允许用户根据需求配置定时器的时间间隔,常见的配置包括1秒(1S)、500毫秒(500ms)、10毫秒(10ms)、200微秒(200us)、5微秒(5us)和2秒(2s)。这些时间间隔的选择取决于具体应用的需求。
1S(1秒):适用于需要长时间间隔的任务,如数据采集、状态监测等。
500ms(500毫秒):适用于中等时间间隔的任务,如传感器数据读取、LED闪烁控制等。
10ms(10毫秒):适用于需要较高频率的任务,如电机控制、按键扫描等。
200us(200微秒):适用于高频率任务,如PWM信号生成、高速数据采集等。
5us(5微秒):适用于极高频率任务,如高速通信、精确时间测量等。
2s(2秒):适用于需要较长周期但比1秒更灵活的任务,如定时器唤醒、周期性任务调度等。

3. 定时器应用场景
T0 / T1 / T2 / T3 / T4:这些定时器通常用于通用任务,如周期性任务调度、精确延时、PWM信号生成等。具体选择哪个定时器取决于系统资源的分配和任务的优先级。
T11:T11通常用于特殊任务,如高精度时间测量、高速通信等。由于其高精度和高频率特性,T11在需要极高时间精度的应用中表现出色。

4. 定时器配置示例
以下是一个使用AiCube工具配置定时器的示例代码:
  1. c
  2. include "AiCube.h"
  3. void TimerInit(void) {
  4.     // 配置T0定时器,时间间隔为1秒
  5.     AiCubeTimerConfig(T0, 1000); // 1000ms = 1s
  6.     // 配置T1定时器,时间间隔为500毫秒
  7.     AiCubeTimerConfig(T1, 500); // 500ms
  8.     // 配置T2定时器,时间间隔为10毫秒
  9.     AiCubeTimerConfig(T2, 10); // 10ms
  10.     // 配置T3定时器,时间间隔为200微秒
  11.     AiCubeTimerConfig(T3, 0.2); // 200us
  12.     // 配置T4定时器,时间间隔为5微秒
  13.     AiCubeTimerConfig(T4, 0.005); // 5us
  14.     // 配置T11定时器,时间间隔为2秒
  15.     AiCubeTimerConfig(T11, 2000); // 2000ms = 2s
  16. }
  17. void TimerISR(void) {
  18.     // 定时器中断服务程序
  19.     // 根据定时器编号执行相应任务
  20.     switch (AiCubeTimerGetID()) {
  21.         case T0:
  22.             // 执行1秒任务
  23.             break;
  24.         case T1:
  25.             // 执行500毫秒任务
  26.             break;
  27.         case T2:
  28.             // 执行10毫秒任务
  29.             break;
  30.         case T3:
  31.             // 执行200微秒任务
  32.             break;
  33.         case T4:
  34.             // 执行5微秒任务
  35.             break;
  36.         case T11:
  37.             // 执行2秒任务
  38.             break;
  39.         default:
  40.             break;
  41.     }
  42. }
复制代码

5. 总结
AiCube工具提供了丰富的定时器配置选项,开发者可以根据具体应用需求选择合适的定时器和时间间隔。通过合理配置和使用定时器,可以实现精确的时间控制和任务调度,提升系统的性能和可靠性。在实际开发中,建议根据任务的特性和系统资源的分配,灵活选择和使用定时器,以达到最佳的系统效果。

90779907809078190782907839078490785718

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:248
  • 最近打卡:2025-04-27 09:57:01
已绑定手机

24

主题

756

回帖

3315

积分

超级版主

积分
3315
QQ
发表于 2025-3-31 16:03:58 | 显示全部楼层
传统外部中断,INT0 / INT1
截图202503311603093410.jpg 截图202503311603261752.jpg 截图202504021352585766.jpg

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

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

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

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

////////////////////////////////////////
// 系统初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void SYS_Init(void)
{
    EnableAccessXFR();                  //使能访问扩展XFR
    AccessCodeFastest();                //设置最快速度访问程序代码
    AccessIXramFastest();               //设置最快速度访问内部XDATA
    IAP_SetTimeBase();                  //设置IAP等待参数,产生1us时基
   
          P0=0XFF;
          P40=0;
          
    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口为准双向口模式
    P6M0 = 0x00; P6M1 = 0x00;           //初始化P6口为准双向口模式
    P7M0 = 0x00; P7M1 = 0x00;           //初始化P7口为准双向口模式

    CLK_Init();                         //时钟模块初始化
    EXTI0_Init();                       //INT0初始化
    EXTI1_Init();                       //INT1初始化
    USBLIB_Init();                      //USB库初始化

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

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

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

////////////////////////////////////////
// 外部中断INT0中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void EXTI0_ISR(void) interrupt INT0_VECTOR
{
        P00=~P00;
}

////////////////////////////////////////
// 外部中断INT1中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void EXTI1_ISR(void) interrupt INT1_VECTOR
{
        P01=~P01;
}


////////////////////////////////////////
// 时钟初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
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时钟预分频系数
}

////////////////////////////////////////
// 外部中断INT0初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void EXTI0_Init(void)
{
    INT0_FallingInt();                  //设置外部中断为下降沿中断
    INT0_SetIntPriority(0);             //设置中断为最低优先级
    INT0_EnableInt();                   //使能外部中断
}

////////////////////////////////////////
// 外部中断INT1初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void EXTI1_Init(void)
{
    INT1_FallingInt();                  //设置外部中断为下降沿中断
    INT1_SetIntPriority(0);             //设置中断为最低优先级
    INT1_EnableInt();                   //使能外部中断
}

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

////////////////////////////////////////
// 等待USB配置完成函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void USBLIB_WaitConfiged(void)
{
    while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
}

////////////////////////////////////////
// USB设备接收数据处理程序
// 入口参数: 无
// 函数返回: 无
// bUsbOutReady:USB设备接收数据标志位
// OutNumber:USB设备接收到的数据长度
// UsbOutBuffer:保存USB设备接收到的数据
////////////////////////////////////////
void USBLIB_OUT_Done(void)
{
    if (bUsbOutReady)                   //查询是否有接收到数据
    {
        USB_SendData(UsbOutBuffer, OutNumber); //原路返回, 用于测试
        usb_OUT_done();                 //当前包的数据处理完成
    }
}



传统外部中断.zip

143.94 KB, 下载次数: 1

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:248
  • 最近打卡:2025-04-27 09:57:01
已绑定手机

24

主题

756

回帖

3315

积分

超级版主

积分
3315
QQ
发表于 2025-3-31 16:05:46 | 显示全部楼层
所有普通I/O口都支持的外部中断(做4个按键,P3.2,P3.3,P3.4,P3.5按键中断)
截图202503311604414516.jpg 截图202503311604548997.jpg 截图202503311605096155.jpg 截图202503311605208876.jpg

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

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

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

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

////////////////////////////////////////
// 系统初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void SYS_Init(void)
{
    EnableAccessXFR();                  //使能访问扩展XFR
    AccessCodeFastest();                //设置最快速度访问程序代码
    AccessIXramFastest();               //设置最快速度访问内部XDATA
    IAP_SetTimeBase();                  //设置IAP等待参数,产生1us时基
   
          P0=0XFF;
          P40=0;
         
    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口为准双向口模式
    P6M0 = 0x00; P6M1 = 0x00;           //初始化P6口为准双向口模式
    P7M0 = 0x00; P7M1 = 0x00;           //初始化P7口为准双向口模式

    CLK_Init();                         //时钟模块初始化
    EXTI0_Init();                       //INT0初始化
    EXTI1_Init();                       //INT1初始化
    USBLIB_Init();                      //USB库初始化

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

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

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

////////////////////////////////////////
// 外部中断INT0中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void EXTI0_ISR(void) interrupt INT0_VECTOR
{
        P00=~P00;
}

////////////////////////////////////////
// 外部中断INT1中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void EXTI1_ISR(void) interrupt INT1_VECTOR
{
        P01=~P01;
}


////////////////////////////////////////
// 时钟初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
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时钟预分频系数
}

////////////////////////////////////////
// 外部中断INT0初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void EXTI0_Init(void)
{
    INT0_FallingInt();                  //设置外部中断为下降沿中断
    INT0_SetIntPriority(0);             //设置中断为最低优先级
    INT0_EnableInt();                   //使能外部中断
}

////////////////////////////////////////
// 外部中断INT1初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void EXTI1_Init(void)
{
    INT1_FallingInt();                  //设置外部中断为下降沿中断
    INT1_SetIntPriority(0);             //设置中断为最低优先级
    INT1_EnableInt();                   //使能外部中断
}

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

////////////////////////////////////////
// 等待USB配置完成函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void USBLIB_WaitConfiged(void)
{
    while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
}

////////////////////////////////////////
// USB设备接收数据处理程序
// 入口参数: 无
// 函数返回: 无
// bUsbOutReady:USB设备接收数据标志位
// OutNumber:USB设备接收到的数据长度
// UsbOutBuffer:保存USB设备接收到的数据
////////////////////////////////////////
void USBLIB_OUT_Done(void)
{
    if (bUsbOutReady)                   //查询是否有接收到数据
    {
        USB_SendData(UsbOutBuffer, OutNumber); //原路返回, 用于测试
        usb_OUT_done();                 //当前包的数据处理完成
    }
}


外部中断.zip

137.32 KB, 下载次数: 2

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:413
  • 最近打卡:2025-05-03 00:29:17

2

主题

144

回帖

3016

积分

论坛元老

积分
3016
发表于 2025-4-1 16:30:13 | 显示全部楼层
工具体验了一把,功能让人眼前一亮,但建议加个项目保存功能,因为如果生成软件,后面测试如果不合适,需要重新生成(工具关了再开工具),此时需要把所有的设置要重新设置一遍,比较麻烦,建议在“创建项目”的功能上,再加一个“项目保存”,这样下次再生成类似的项目时,就不需要一个个的设置了。

创建功能的基础上再加个保存功能

创建功能的基础上再加个保存功能
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-3 03:09 , Processed in 1.033249 second(s), 89 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表