精华内容
下载资源
问答
  • 于是想到是延时的问题,在初始化那里的reset函数里加了个延时,再下载进去板子里果然就正常了。 void mcp2515_reset(void) { static uint8_t status; uint8_t cmd = MCP2515_CMD_RESET; mcp2515_cs_enable();//...

    在调试基于F103单片机的MCP2515时,怎么调试都不正常,用的还是以前调试过的代码,隔了一段时间后再重新运行就不行了;

    于是单步运行调试,没想到,单步运行调试竟然成功了;于是想到是延时的问题,在初始化那里的reset函数里加了个延时,再下载进去板子里果然就正常了。

    void mcp2515_reset(void)
    {
        static uint8_t status;
        uint8_t cmd = MCP2515_CMD_RESET;
        mcp2515_cs_enable();//置MCP2515的CS为低电平
        status = HAL_SPI_Transmit(&hspi1,&cmd,1,100);//发送写命令//发送寄存器复位命令
        delay_ms(100); //没有这个延时,下载到板子里就不能正行发送数据,单步调试过去这里后就能正常运行,所以断定是没有这个延时的原因。
        mcp2515_cs_disable(); //置MCP2515的CS为高电平
    }

    看了MCP2515的datasheet后,SPI接口描述如下图,MCP2515第一次发送数据时,需要先拉高CS引脚,再拉低CS引脚进行写入数据;于是按照下面更改mcp2515_reset函数也是可以正常运行的:

    void mcp2515_reset(void)
    {
        static uint8_t status;
        uint8_t cmd = MCP2515_CMD_RESET;
        mcp2515_cs_enable();//置MCP2515的CS为低电

    展开全文
  • STM32 FreeRTOS 外部中断服务函数注意事项 移植正点原子的FreeRTOS操作系统到我们自己的工程,发现的一个注意事项; 看下面代码,带FreeRTOS的外部中断服务函数,实现按键消抖,不能用delay_ms()或者和vTaskDelay...

    STM32 FreeRTOS 外部中断服务函数注意事项
    移植正点原子的FreeRTOS操作系统到我们自己的工程,发现的一个注意事项;
    看下面代码,带FreeRTOS的外部中断服务函数,实现按键消抖,不能用delay_ms()或者和vTaskDelay(),会导致系统奔溃;
    原因是delay_ms()其实就是对 FreeRTOS 中的延时函数 vTaskDelay()的简单封装,所以在使用 delay_ms()的时候就会导致任务切换,即不会导致这个外部中断延时阻塞,而切换到其他任务,导致外部中断出错;
    这里我们可以使用delay_xms(),其不会引起任务调度,是真的延时;(仅针对外部中断函数,因为我发现在按键扫描函数里面,可以使用delay_ms();)

    //提供框架---对应PA0---》PG0
    void EXTI0_IRQHandler(void)
    {
    //  delay_ms(10);//消抖
        delay_xms(10);   //消抖            
        if(KEY9==0)      
        {
            SEGGER_RTT_printf(0,"按键IN9输入 \n");
        }
        EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位  
    }

    号外:
    (1)delay_ms()和vTaskDelay()一样使用,delay_ms()其实就是对 FreeRTOS 中的延时函数 vTaskDelay()的简单封装
    但vTaskDelay()程序更简洁,ms级延时更精准;
    为了编程方便,delay_ms()一般使用在外设模块初始化时候的ms级延时,例如RS485、LCD、以太网模块等,实测没有问题;
    (2)注意NVIC_IRQChannelPreemptionPriority优先级配置,正点原子例程的优先级0~4不会被FreeRTOS禁止,一般用于定时器;优先级5~15受FreeRTOS控制,一般用于外部中断、USART等;
    (3)注意区分中断优先级和任务优先级,任务优先级数字越低表示任务的优先级越低, 0 的优先级最低, configMAX_PRIORITIES-1 的优先级最高。空闲任务的优先级最低,为 0。
    (4)任务函数一般不允许跳出循环,如果一定要跳出循环的话在跳出循环以后一定要调用函数 vTaskDelete(NULL)删除此任务!

    展开全文
  • 然后导入window平台数据库 结论,oracle 9i数据文件可以通过表空间传输迁移到oracle 10g中使用 七、Oracle10g 同字节序跨平台迁移 注意事项 1、源平台与目标平台有相同的字节序 2、重做日志文件和控制文件不会传输,...

    一、Oracle的缺省定时任务可能带来很多问题,所以我们有必要关注一下系统有哪些缺省的任务

    查询任务

    dba_scheduler_jobs

    dba_scheduler_job_run_details

    关闭任务

    execute dbms_scheduler.disable('AUTO_SPACE_ADVISOR_JOB');

    二、为了保证在RAC环境备份归档日志的方便性,归档日志除了分别在两节点进行本地归档外,在进行本地归档的同时,通过配置log_archive_dest_2向另一节点传送归档日志,在通过orapwd工具在一个节点更改sys密码后,造成归档log_archive_dest_2向另一个节点无法传送归档日志。在RAC或DG环境中,ORA-16191错误通常是由于两个节点的密码文件不一致或者remote_login_passwordfile参数设置不当造成的。而本次重建了密码文件还是没有解决问题,经分析后发现跟oracle11g的口令安全增强有关。(SEC_CASE_SENSITIVE_LOGON)

    当启用强口令认证时,oracle区分密码大小写,在创建口令文件时,即使口令相同也会在两个节点产生不用的hash值,需要指定ignorecase=y参数强制忽略大小写才能保证DG的正常认证。

    三、dbms_backup_restore包

    可以在数据库实例nomount状态下调用,直接从备份集读取数据文件,功能十分强大。用于RMAN进行数据备份时,备份信息丢失的情况。

    四、传输表空间标准步骤

    1、以sys用户执行非严格自包含检查

    exec dbms_tts.transport_set_check('USER',true,false);

    select * from tansport_set_violations;

    以sys用户执行严格自包含检查

    exec dbms_tts.transport_set_check('JEL',true,true);

    select * from tansport_set_violations;

    可以对多个表空间进行同时传输

    exec dbms_tts.transport_set_check('USER,JEL',true,true);

    select * from tansport_set_violations;

    2、将表设置为只读

    alter tablespace user read only;

    3、导出表空间

    exp/expdp

    4、传输文件

    将导出的表空间元数据和数据文件转移到目标主机

    5、导入目标端

    imp/impdp

    6、将源端和目标端表空间置为读写

    alter tablespace user read write;

    五、不同字节序平台跨平台表空间传输

    Solaris到windows

    Oracle 10G之前,数据文件是不能跨平台传输使用的

    确认平台信息

    v$transportable_platform v$database  (platform_name)

    1、设置表空间只读

    alter tablespace user read only;

    2、导出传输表空间

    exp/expdp

    3、使用rman的convert命令转换文件格式

    rman target /

    convert tablespace user

    to platform 'Microsoft Windows IA (32-bit)'

    format  '/tmp/%N_%f';

    4、确认文件生成

    cd /tmp

    ls -lrt

    5、把dump文件和convert生成的文件传输到目标端

    scp

    6、目标端对文件进行转换

    rman target /

    convert datafile '源端传过来的convert文件'

    db_file_name_covert

    '源端传过来的convert文件','源端传过来的convert文件重命名.dbf'

    7、在目标端创建相应用户并执行导入

    create user

    imp/impdp

    8、把表空间置为读写

    六、相同字节序平台间传输表空间

    由于不同平台上操作系统会在数据文件头上写系统信息,这部分信息无法跨平台,所以仍然会导致跨平台的文件无法被数据库正确识别。在oracle10g中,同字节跨平台的文件头信息oracle会自动改写,不需要转换。

    实验环境

    Red Hat Enterprise Linux AS release 3+Oracle 9iR2 9.2.0.4

    window XP+Oracle 10g 10.2.0.1

    select * from v$version where rownum<2;

    看一下linux平台,文件头被操作系统保留的字节数:

    select file_name,bytes from dba_data_files where tablespace_name='USERS';

    查看操作系统下文件的大小  ls -lrt USERS.dbf

    两个值的差,为操作系统在文件头的字节

    linux导出文件到window平台导入时,会出现ORA-00600错误,提示文件头无法正确识别。可以通过这个文件进行一个特殊操作,为文件更换一个window文件头。

    1、提取windows数据文件头

    dd if=user.dbf of=header.dbf bs=8192 count=1

    2、去除linux数据文件头

    dd if=user.dbf of=linux.dbf bs=8192 skip=1

    3、将两个文件合二为一

    copy /b header.dbf+linux.dbf users.dbf

    则users.dbf就具有windows平台下的文件头和linux平台下的文件体

    然后导入window平台数据库

    结论,oracle 9i数据文件可以通过表空间传输迁移到oracle 10g中使用

    七、Oracle10g 同字节序跨平台迁移

    注意事项

    1、源平台与目标平台有相同的字节序

    2、重做日志文件和控制文件不会传输,迁移之后需要重建控制文件使用resetlogs方式打开数据库;临时文件不会被传输

    3、BFILES、外部表和directories不会被传输

    如下实验linux+oracle 10.2.0.1  到 windows+Oracle 10.2.0.3,通常高版本数据库不能向低版本迁移

    1、确认源平台和目标平台具有相同的字节序

    2、确认源数据库是否支持迁移,跨平台迁移需要数据库处于read only模式打开,使用dbms_tdb.check_db进行检查

    declare

    db_ready boolean;

    begin

    db_ready := dbms_tdb.check_db('Microsoft Windows IA (32-bit)');

    end;

    /

    如果存储过程成功执行,并且没有其他警告输出,则说明数据库可以支持跨平台转移

    3、检查外部对象

    使用dbms_tdb.check_external来识别外部表、directories或BFILES,这些对象所指向的外部数据不能被RMAN自动转移

    declare

    db_external boolean;

    begin

    db_external := dbms_tdb.check_external;

    end;

    /

    4、使用RMAN进行跨平台文件迁移

    跨平台迁移首先通过RMAN进程数据文件转换

    rman target /

    convert database new database 'JEL2'

    transport script '/home/oracle/script/transport.sql'

    to platform 'Microsoft Windows IA (32-bit)'

    db_file_name_convert '/oracle/app/oradata/JEL1/datafile' \ '/home/oracle/transport'

    指定生成的转换脚本进行参考,所有的数据文件转换后存放在一个新目录

    修改rman生成的参数文件,主要是路径修改

    5、转移转换出的文件到目标端

    6、创建基础环境

    7、迁移步骤

    启动数据库到nomount状态

    startup nomount pfile=

    创建控制文件,然后关闭数据库,启动数据库到mount状态,然后open数据库

    alter database open resetlogs;

    如果两个平台的数据库版本完全一样,则以上步骤可以顺利进行。但本例中,以上语句报错,必须执行upgrade选项来打开数据库

    再次启动数据库到upgrade模式,由于之前的数据库中断,现在需要进行恢复工作

    startup upgrade;

    recover database

    shutdown immediate;

    startup upgrage;

    执行脚本?/rdbms/admin/utlirp.sql,该脚本的作用是重新编译数据库中的plsql对象

    shutdown and restart the database in normal mode and run utlrp.sql to recompile invalid objects

    utlrp.sql执行完成之后我们需要再执行和数据库升级相关的脚本catupgrd.sql

    这个脚本调用catlog.sql和catproc.sql来重建字典对象等,执行完成该脚本后,我们可以正常关闭数据库后正常打开数据库。脚本可能使部分对象失效,我们可以再次运行utlrp.sql脚本进行编译。编译完成后为数据库添加临时文件

    alter database temp add tempfile size 200m autoextend on next 65536 maxsize 32767m;

    至此,同字节序的跨平台迁移全部完成。

    八、文件系统与ASM的切换

    在目标端进行正常导入,导入完成后,此时新导入的文件在文件系统上,我们需要把文件系统文件转移到ASM磁盘组上

    select name from v$datafile;

    文件转移可以通过RMAN进行,但首次尝试遇到RMAN-20201错误,

    rman target /

    backup as copy datafile '/opt/oracle/trans.dbf' format '+DATADG';

    这个错误是由于trans表空间刚刚导入数据库,处于只读状态,并未被catalog记录感知,通过对文件更改为读写状态,可以消除此错误

    alter tablespace trans read write;

    select tablespace_name,status from dba_tablesapces where tablespace_name='';

    rman>report schema

    拷贝前需要把表空间置为只读状态

    alter tablespace trans read only;

    rman>backup as copy datafile  '/opt/oracle/trans.dbf' format '+DATADG';

    执行switch操作需要将表空间离线,否则报错

    alter tablespace trans offline;

    rman>switch datafile  '/opt/oracle/trans.dbf' to copy;

    此时转换后的表空间已经移动到ASM磁盘组中。

    select * from v$datafiles;

    九、dbms_file_transfer

    从10g开始,oracle提供了dbms_file_transfer程序包,可以很方便的在本地数据库和远程数据库,ASM和文件系统间传输数据库文件

    desc dbms_file_transfer

    十、

    展开全文
  • // CPU Timer 2 2,初始化定时器模块寄存器及使能PIE级中断 2.1,在InitCpuTimer0函数中, ConfigCpuTimer(&CpuTimer0Regs, Freq,Period);// 100us IER |= M_INT1;//enable group interrupt PieCtrlRegs.PIEIER1....

    1,使能定时器模块的时钟(必须先使能时钟,再操作定时器模块寄存器)

    在void InitPeripheralClocks(void)函数中:

        SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0
        SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK = 1; // CPU Timer 1
        SysCtrlRegs.PCLKCR3.bit.CPUTIMER2ENCLK = 1; // CPU Timer 2

    2,初始化定时器模块寄存器及使能PIE级中断

    2.1,在InitCpuTimer0函数中,

        ConfigCpuTimer(&CpuTimer0Regs, Freq,Period);// 100us

        IER |= M_INT1;//enable group interrupt
        PieCtrlRegs.PIEIER1.bit.INTx7= 1;// Enable TINT0 in the PIE: Group 1 interrupt 7    

        StartCpuTimer0();

    2.2,在InitCpuTimer1函数中,

        ConfigCpuTimer(&CpuTimer1Regs, Freq,Period);

        IER |= M_INT13;//enable group interrupt
        //timer1 has no PIE level interrupt control

        StartCpuTimer1();

    注意:Timer1与Timer0使能中断部分稍有不同,Timer0所在中断组中,有8个中断共用一个CPU级中断,所以,除了使能CPU级中断外,还要使能PIE级中断。而Timer1只需要使能组中断即可,这些区别可从中断向量表中找到。

     

    3,中断函数的确定

    3.1,TI在DSP2833x_DefaultIsr.c中,对于每一个中断都定义了中断服务函数,我们可以找到相应的函数直接在里面编写代码就可以。但鉴于里面函数众多,不方便代码的查看,这里单独建立isr.c的文件,用于存放中断服务函数,函数的名字与DSP2833x_DefaultIsr.c中的一致。这样就要注释掉DSP2833x_DefaultIsr.c的相应函数,否则,编译器会报重定义的错误。

    我采用宏定义的方式,注释相应函数。不使能相应中断时,将宏定义为0.使用则定义为1.

    #define TINT0_ISR_ENABLE    1 //TIMER0 interrupt
    #define INT13_ISR_ENABLE    1 //TIMER1 interrupt
    #define INT14_ISR_ENABLE    0 //TIMER2 interrupt

    #if (INT13_ISR_ENABLE == 0)
    // Connected to INT13 of CPU (use MINT13 mask):
    // Note CPU-Timer1 is reserved for TI use, however XINT13
    // ISR can be used by the user. 
    interrupt void INT13_ISR(void)     // INT13 or CPU-Timer1
    {
      // Insert ISR Code here
      
      // Next two lines for debug only to halt the processor here
      // Remove after inserting ISR Code
      asm ("      ESTOP0");
      for(;;);
    }
    #endif

    #if (INT14_ISR_ENABLE == 0)
    // Note CPU-Timer2 is reserved for TI use.
    interrupt void INT14_ISR(void)     // CPU-Timer2
    {
      // Insert ISR Code here
      
      // Next two lines for debug only to halt the processor here
      // Remove after inserting ISR Code
      asm ("      ESTOP0");
      for(;;);
    }
    #endif

    3.2,在isr.c中重新定义中断服务函数

    interrupt void  TINT0_ISR(void)      // CPU-Timer 0
    {
        PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //Writing 1 to clear flag,must be needed
        CpuTimer0Regs.TCR.bit.TIF=1; //Writing 1 to this bit clears the flag

        LED1_TOG;
    }

    interrupt void INT13_ISR(void)     // INT13 or CPU-Timer1
    {
        CpuTimer1Regs.TCR.bit.TIF=1; //Writing 1 to this bit clears the flag
        
        //LED1_TOG;
    }

    4,中断服务函数中,需要做的事情

    对于Timer1中断,只需要清除中断标志位即可,与其他芯片的操作方式完全一样。

    但对于Timer0中断,不仅需要清除中断标志位,还要清除PIEACK,否则无法再次产生中断。切记!!!所有组中断都适用这条规则。

    最后附上源代码,以供参考。

    https://download.csdn.net/download/baodewang/12477051

    展开全文
  • 串口通信初始化

    千次阅读 2016-12-07 20:36:02
    //这里是初始化UART控制器 rULCON0 = 0x3; rUCON0 = 0x5; rUFCON0 = 0; rUMCON0 = 0; //第三步:设置波特率,计算波特率 //这里的那个频率可以取66.7MHz,也是可以取66MHz //DIV_VAL = (PCLK / (bps x 16)...
  • SQLite 初学者注意事项

    千次阅读 多人点赞 2020-11-08 12:21:37
    如果在初始开发过程中使用 SQLite,然后部署上线时替换为其他数据库(PostgreSQL 或者 SQL Server),可能会因此导致问题。因为 SQLite 对于类型的要求更加宽松,其他数据库对于类型的要求更加严格。 这种灵活的...
  • STM32外部中断处理流程及注意事项

    千次阅读 2012-10-09 11:35:04
    STM32的外部中断是以组为单位,例如PA0、PB0、PC0、PD0、PE0、PF0、PG0共用外部中断0,我们再使用时从中选择一个座位外部中断0即可,其他中断类推。 外部中断包括EXTI0、EXTI1、EXTI2、EXTI3、EXTI4、EXTI9_5、EXTI...
  • 关于USART接收中断的BUG和注意事项

    千次阅读 2015-04-29 10:35:49
    在使用USART做串口通讯时,我只把接收中断打开,并设置抢占优先级为最低一个级别,而接收中断上一个优先级处理事情比较多,可能占用了2ms时间。当我使用9600波特率往下位机发送数据,速度非常快,就是一直按回车发!...
  • 串口配置,给出中断式串口通信,详细的寄存器作用解析作者:Justice_Gao日期:2017年7月29日问题描述:参考源代码中串口通信程序初始化设置以及通信的方式,比较难理解,和STM32F4的串口通信不同,特别是接收这里我...
  • 一、代码生成后,查看生成...除此之外,该文件中的main函数会初始化模型,调用“模型名称_initialize();”函数。该函数实际使用时也必须在模型执行前初始化。在实际使用时该文件不必添加进工程。2、模型名称_Y100....
  • 1,初始化外设时钟 void InitPeripheralClocks(void)函数中 SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; // SCI-A 2,引脚复用配置 在PinMux函数中, EALLOW; GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1; // ...
  • 置顶/星标公众号,不错过每一条消息! 今天写点大家常问,也是常见的关于UART串口的内容。这几点内容或许曾经也困惑了你很久。1UART串口中断接收使能UART串口中...
  • 关于NetApp的初始化配置文档网上应该有不少,但大多比较零散,借此机会把几年来配置Ontap的一些经验进行分享,本文会相对侧重一些技术细节及注意事项 首先,Ontap是个很好用的系统,但仅限CLI,WebUI尤其是9.7往后的...
  • im6ull开发板——按键中断消抖处理注意事项及逻辑梳理 这个消抖要配合内核定时器一起使用, 1、首先在设备结构体中添加: struct timer_list timer; /*定时器*/ 2、在驱动初始化函数中添加:定时器初始化代码: /*...
  • DMA使用注意事项

    2018-07-03 10:44:01
    1、DMA造成脏数据在使用DMA进行...在使用DMA将数据从ram搬运到fifo后,释放省电锁之前,需要特别注意,不能仅仅依赖于DMA的完成中断,DMA的完成中断只表示DMA已经将所有数据都搬运进外设的fifo,不代码外设已经完成...
  • ZYNQ 中断详解

    千次阅读 2018-06-08 13:33:11
    在linux系统下,中断号跟BD中zynq7000 processer中配置的生成的中断号不是直接对应的,中间有一个“-32” 的关系,如下For Shared Periperal interrupts, the value in the device tree is the (IRQ - 32) ;...
  • 1.初始化函数 GPIO_Init(GPIOB, GPIO_Pin_3, GPIO_Mode_In_FL_IT); EXTI_SetPinSensitivity(GPIO_Pin_3, EXTI_Trigger_Falling);//有误,下文会说明 2.中断函数 INTERRUPT_HANDLER(EXTI3_IRQHandler,...
  • 初始化各软件模块;   c.进入死循环(无限循环),调用各模块的处理函数 用户主程序和各模块的处理函数都以 C语言完成。用户主程序最后都进入了一个死循环,其首选方案是:   while(1) ...
  • (++)初始化阶段通过CAN_ITConfig()添加中断事件,用CAN_GetITStatus()函数检查事件是否已经发生。在检查一个标志之后,你应该使用CAN_ClearFlag()来清除它。。在检查一个中断事件之后应该使用CAN_ClearITPendingBit...
  • IAP升级的注意事项

    2019-07-12 14:30:16
    如果在IAP中使用到了外设,那么在APP使用... 如果在iap中没有使用中断,那么跳转前只需要对照IAP外设的初始部分,逐个Deinit、关闭时钟即可。 如果在iap中使用到了中断,那么需要做以下部分: 在NVIC中关闭外设...
  • 本章我们将从硬件和软件,应用几个方面来详细的讲解ST32F103的RTC实时时钟的配置方法,编程方法,以及设计注意事项。 首先我们看看RTC的框图如下,它除了RTC实时时钟以外,还具有报警功能,报警功能的主要作用就是...
  • Marvell 88E1145PHY芯片的初始化配置

    万次阅读 2017-03-04 19:52:24
    PHY芯片的初始化配置有硬件配置和软件配置两种途径,当系统上电之后默认采用硬件配置的模式,如需要更改配置,可以通过软件写寄存器的方式来更改模式。本文主要说明硬件配置的方法,以Marvell 88E1145PHY芯片为例,...
  • 一般情况下,中断的处理函数有两个,其一为中断初始化函数,其二为中断服务函数。 中断服务函数的结构: 中断相关的4个寄存器 写程序的时候会用到 分为两个控制寄存器和两个中断请求标志 一个例题
  • FreeRTOS 的初始化流程推荐的初始化流程如下,本教程配套的所有例子都是采用的这种形式,当然,不限制必须采用这种...在启动调度前,为了防止初始化 STM32 外设时有中断服务程序执行,这里禁止全局中断(除了 NMI 和 ...
  • 2021-03-20UART注意事项

    2021-03-20 18:46:17
    3移植串口初始化,串口使能msp-init,串口msp-deinit,中断服务函数添加,中断callback添加,并在callback里面编写自己需要对接受数据的操作 4注意点:别忘了使能中断HAL_UART_Receive_IT(&huart4,&RxByte,1...
  • 51单片机使用的几点注意事项

    千次阅读 2014-03-14 14:59:11
    1. 使用printf打印小数 #include #include float idata t; void Uart_Init() { } void main() ... //初始化串口,注意为加快速度非必须不要开串口中断 while(1) { printf("%f.2\n",t); } }
  • GD32之RTC操作注意事项

    千次阅读 2020-11-28 11:05:49
    二、在写RTC寄存器前要进入配置模式 调用函数:rtc_configuration_mode_enter() 当你发现你的RTC没有按照你预设的参数运行时,有可能是你的参数初始化失败了。 这里你可以尝试先调用上面的函数,然后再写RTC...
  • 20:10 执行初始化脚本 此步骤大致将执行xxx分钟,执行命令为xxx; 如果脚本中断,则xxx。 (2)提前将上线时间和需要支持的事项以邮件和企业微信的形式通知相关人员。 三:迁移 按照上线步骤实施。 注意:每完成一个...
  • Arduino-中断函数介绍和使用 中断函数 attachInterrupt():设置中断,根据不同的开发板,中断引脚不同。 参考:https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/ ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,069
精华内容 6,827
关键字:

中断初始化注意事项