精华内容
下载资源
问答
  • stm8 gpio模拟串口 定时器+中断,项目中已采用 stm8 gpio模拟串口 定时器+中断,项目中已采用
  • arm实验串口定时器串口使用说明等.rararm实验串口定时器串口使用说明等.rar
  • S3C2440 中断 串口 定时器初始化,还包括中断的设计(汇编中断的设计)
  • AVR 串口定时器程序

    2010-07-21 09:41:51
    AVR 串口通信程序,及其定时器程序,USART发送接收实验,定时计数
  • LBSALE[10]LBSALE只有实际的演练一把才能真正的提高 定时器 , 原创
  • 基于iar V1.31环境在stm8s建立的工程模板,加入protothread,工程中已建立基本应用,串口的接收发送,LED的闪烁以及按键key的检测,同时配置了定时器并有注释说明,在这个基础上修改方便快捷的模板,更利于学习工作
  • 51串口计算 串口调试 定时器初值计算 郭天祥同款 51串口计算 串口调试 定时器初值计算 郭天祥同款
  • 3串口 定时器STM32F103ZET6 三串口+TIM6毫秒定时器,无依赖,可以移植,
  • 之前也尝试了不少方法 STM32的仿真 定时器都整不出来 要不是无法控制准确时间 要不直接是无法进串口中断 这次选择换主频 查阅手册可知 STM32内都有校准的8MRC振荡器可作为主频,其时钟配置如下 在程序的...

    之前也尝试了不少方法 STM32的仿真 定时器都整不出来 要不是无法控制准确时间 要不直接是无法进串口中断

    这次选择换主频

    查阅手册可知 STM32内都有校准的8MRC振荡器可作为主频,其时钟配置如下

    在程序的SetSysClock();函数进行修改,

    同时打开串口1,使用PA9 PA10 波特率9600,在仿真中选择虚拟串口,得到电路图

    开始运行后,虚拟串口得到显示数值,并定时器可正常使用

    主程序如图

    程序和仿真下载:

    链接:https://pan.baidu.com/s/1MDyURzs2NB4o5vJreMH4fQ 
    提取码:1234

    展开全文
  • 串口调试加定时器

    2013-03-30 15:35:51
    可以在串口调试上验证,同时可以在示波器上看到定时器控制一个管脚每10毫秒翻转一次
  • 配置了定时器0和串口3串口4的中断,适合初学者学习
  • 我写了一个串口1 初始化函数,和一个定时器1的函数,在函数初始化的时候发现,如果把串口的初始化函数放在定时器初始化的前面,定时器就没有输出,如果把定时器的初始化放在串口的前面,则串口定时器都正常。...

    我写了一个串口1 初始化函数,和一个定时器1的函数,在函数初始化的时候发现,如果把串口的初始化函数放在定时器初始化的前面,定时器就没有输出,如果把定时器的初始化放在串口的前面,则串口和定时器都正常。

    	例如
    	Usart1_Init();
    	TIM_1_Iint();这样就会不正常
    	
    	TIM_1_Iint();
    	Usart1_Init();这样就正常
    

    这里我先给出我的代码,可以跳过代码部分直接看后面。

    void rc_init(void) 这一块是串口1的。
    {
    	GPIO_InitTypeDef GPIO_Init_config_PA;
    	USART_InitTypeDef USART1_Init_config;	
    	NVIC_InitTypeDef NVIC_Init_set;
    	
      	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
    	
    	GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
    	GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
    	
    	GPIO_Init_config_PA.GPIO_Pin=GPIO_Pin_9 | GPIO_Pin_10;
    	GPIO_Init_config_PA.GPIO_Mode=GPIO_Mode_AF;
    	GPIO_Init_config_PA.GPIO_Speed=GPIO_Speed_100MHz;
    	GPIO_Init_config_PA.GPIO_PuPd=GPIO_PuPd_UP;
    	GPIO_Init_config_PA.GPIO_OType=GPIO_OType_PP;
    	GPIO_Init(GPIOA,&GPIO_Init_config_PA);
    	GPIO_SetBits(GPIOA,GPIO_Pin_9 | GPIO_Pin_10);
    
    	USART1_Init_config.USART_BaudRate=100000;	
    	USART1_Init_config.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
    	USART1_Init_config.USART_Mode=USART_Mode_Rx | USART_Mode_Tx;
    	USART1_Init_config.USART_Parity=USART_Parity_Even;
    	USART1_Init_config.USART_WordLength=USART_WordLength_8b;
      	USART1_Init_config.USART_StopBits = USART_StopBits_1;
    	USART_Init(USART1,&USART1_Init_config);
    
    	USART_Cmd(USART1,ENABLE);
    
    	NVIC_Init_set.NVIC_IRQChannel=USART1_IRQn;
    	NVIC_Init_set.NVIC_IRQChannelCmd=ENABLE;
    	NVIC_Init_set.NVIC_IRQChannelPreemptionPriority=1;
    	NVIC_Init_set.NVIC_IRQChannelSubPriority=1;
    	NVIC_Init(&NVIC_Init_set);
    
    	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
    	USART_ITConfig(USART1,USART_IT_IDLE,ENABLE);
    }
    
    void Fly_Motor_IO_Init(void) 这里是定时器1的,4个通道都开了,所以有点长。
    {
    	GPIO_InitTypeDef GPIO_Init_Config;
    	TIM_TimeBaseInitTypeDef TIM_TimeBase_Config;
    	TIM_OCInitTypeDef TIM_OCInit_Config;
    
    	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
    
    	GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_TIM1);
    	GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_TIM1);
    	GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_TIM1);
    	GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_TIM1);
    
    	GPIO_Init_Config.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_11|GPIO_Pin_13|GPIO_Pin_14;
    	GPIO_Init_Config.GPIO_Mode=GPIO_Mode_AF;
    	GPIO_Init_Config.GPIO_OType=GPIO_OType_PP;
    	GPIO_Init_Config.GPIO_PuPd=GPIO_PuPd_NOPULL;//GPIO_PuPd_NOPULL GPIO_PuPd_DOWN TIM_OCPolarity_High
    	GPIO_Init_Config.GPIO_Speed=GPIO_Speed_100MHz;
    	GPIO_Init(GPIOE,&GPIO_Init_Config);
    
    	TIM_TimeBase_Config.TIM_Prescaler=839; //定时器分频
    	TIM_TimeBase_Config.TIM_Period=1999; //自动重装载值
    	TIM_TimeBase_Config.TIM_CounterMode=TIM_CounterMode_Up;
    	TIM_TimeBase_Config.TIM_ClockDivision=TIM_CKD_DIV1; 
    	TIM_TimeBaseInit(TIM1,&TIM_TimeBase_Config);
    
    	TIM_OCInit_Config.TIM_OCMode = TIM_OCMode_PWM1; //TIM1_CH1
    	TIM_OCInit_Config.TIM_OutputState = TIM_OutputState_Enable;
    	TIM_OCInit_Config.TIM_OCPolarity = TIM_OCPolarity_High;
    	TIM_OC1Init(TIM1, &TIM_OCInit_Config);
    
    	TIM_OCInit_Config.TIM_OCMode = TIM_OCMode_PWM1; //TIM1_CH2
    	TIM_OCInit_Config.TIM_OutputState = TIM_OutputState_Enable;
    	TIM_OCInit_Config.TIM_OCPolarity = TIM_OCPolarity_High;
    	TIM_OC2Init(TIM1, &TIM_OCInit_Config);
    
    	TIM_OCInit_Config.TIM_OCMode = TIM_OCMode_PWM1; //TIM1_CH3
    	TIM_OCInit_Config.TIM_OutputState = TIM_OutputState_Enable;
    	TIM_OCInit_Config.TIM_OCPolarity = TIM_OCPolarity_High;
    	TIM_OC3Init(TIM1, &TIM_OCInit_Config);
    
    	TIM_OCInit_Config.TIM_OCMode = TIM_OCMode_PWM1; //TIM1_CH4
    	TIM_OCInit_Config.TIM_OutputState = TIM_OutputState_Enable;
    	TIM_OCInit_Config.TIM_OCPolarity = TIM_OCPolarity_High;
    	TIM_OC4Init(TIM1, &TIM_OCInit_Config);
    
    	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
    	TIM_ARRPreloadConfig(TIM1,ENABLE);
    	TIM_Cmd(TIM1, ENABLE);
    
    	TIM_CtrlPWMOutputs(TIM1, ENABLE);
    
    }
    

    串口始终是好的,串口初始化函数的位置的不同会导致定时器的输出结果不同,所以我认为问题出在串口初始化上。

    于是我对串口初始化的函数逐段注释,看看是那一块的问题

    然后发现是串口参数初始化这一块,即

    	USART1_Init_config.USART_BaudRate=100000;	
    	USART1_Init_config.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
    	USART1_Init_config.USART_Mode=USART_Mode_Rx | USART_Mode_Tx;
    	USART1_Init_config.USART_Parity=USART_Parity_Even;
    	USART1_Init_config.USART_WordLength=USART_WordLength_8b;
      	USART1_Init_config.USART_StopBits = USART_StopBits_1;
    	USART_Init(USART1,&USART1_Init_config);
    

    这一块是根据遥控器接收机的参数设定。
    然后再逐行找问题,我先把第一项波特率改小,结果一改小(先是改成9600),pwm波就能输出了。又试了115200,结果pwm不能输出;再试9999,结果pwm不能输出;再试9998,结果pwm能输出。
    后面又试了别的设置项,结果是,是波特率影响的pwm波。

    之后用串口3试了一下,发现还是同样的问题。
    同时发现,定时器4个通道里,通道4是正常不受影响的

    能力有限,暂时只能找到出问题的点,还不能剖析问题并解决,剩下的就靠大佬们了。

    展开全文
  • ATmega48-88-168 的 ADC采样 EEPROM的读写 串口通讯的收发 定时器中断处理 源代码分享
  • 定时器串口中断

    2014-01-17 10:44:49
    串口中断,定时器中断,红外遥控,AD采集,DAC输出,IIC读写,看门狗,LCD驱动显示,资源分这么多就能看出资料是多么珍贵,不信你下载看看就知道
  • 51单片机默认使用定时器1作为串口通信的波特率发生器、定时器1中断通信,串口定时器1冲突,在遇到定时器不够用的时候可以用定时器2

    【若有疑问错误或版权等问题请联系我】 

    【转载请注明出处:http://blog.csdn.net/leytton/article/details/48442129

    51单片机默认使用定时器1作为串口通信的波特率发生器、定时器1中断通信,串口与定时器1冲突,在遇到定时器不够用的时候可以用定时器2

    #include <reg52.h>
    
    
    void DelayMs(unsigned int i);
    void SerialInit();
    void SendByte(unsigned char sbyte);
    void SendString(unsigned char *pstr);
    
    
    void main(void)
    {
    		SerialInit();
    		while(1);	  //注:必需要无限循环
    }
    
    
    /*
    //单片机时钟周期:11.0592MHz   以时钟1作为波特率发生器
    void SerialInit(){
     TMOD=0x20;   //设置T1工作方式为方式2
     TH1=0xfd; //给定时器高位装初值
     TL1=0xfd; //给定时器低位装初值
     TR1=1;  //开定时器
                 //以上是设置波特率
     SM0=0;  //设置串口通讯方式为方式1
     SM1=1;  
     REN=1;  //串口是否接收数据的开关
    
     EA=1; //总中断打开,采用查询法时不用打开中断
     ES=1; //串口中断开关,采用查询法时不用打开中断
    }
    */
    //单片机时钟周期:11.0592MHz	   以时钟T2作为波特率发生器
    void SerialInit(){
     	 PCON &= 0x7F;      //波特率不倍速 SMOD=0
         SCON = 0x50;       //方式1,8位数据,可变波特率,接收允许
         T2CON  = 0x34;   
         RCAP2H = 0xFF;    
         RCAP2L = 0xDC;  
         TH2    = 0xFF;  
         TL2    = 0xDC;
    	   
    	 EA=1; //总中断打开,采用查询法时不用打开中断 
         ES = 1;          //串口中断开关,采用查询法时不用打开中断
    
    }
    
    
    //串口中断函数:
    void SerialPortInte(void) interrupt 4 //采用串口中断法收发数据
    {
    	 unsigned char rbyte;
    	 if(RI){     //RI=1,判定为串口接收到了数据,RI要清零,
             RI=0;
    		 rbyte=SBUF; 
    		 if(rbyte==0x0A){ 	  
    		    SendString("换行");
    		 }else if(rbyte==0x0D){
    		 	SendString("回车");
    		 }else{
    		 	SendByte(rbyte); 
    		 }
    		 	
         }
    
    }
    
    //串口发送一个字节:
    void SendByte(unsigned char sbyte)
    { 
         SBUF=sbyte; //发送数据
         while(!TI); //等待发送完成
         TI=0; //清零发送标志位
    }
     
    //串口发送一个字符串:
    void SendString(unsigned char *pstr) //定义指针
    {
         while(*pstr!='\0') //字符串是否发完
         {
             SendByte(*pstr);//发送字符串数据
             pstr++; //指向下一个字符
         }
    }
    
    void DelayMs(unsigned int i)  //延时i ms
    {
        unsigned int j;
        while(i--)
        {
            for(j = 0; j < 125; j++);
        }
    }
    


    展开全文
  • API串口通讯和定时器

    2018-12-04 15:32:58
    本程序基于VS2010使用API函数来实现定时器的达到1ms的精度来完成串口发送数据
  • 目标 STC15W4K32S4 proteus 新建单片机 串口 分压调节电压源 更改单片机主频为11059200 虚拟串口软件安装及配置 单片机使用COM4 串口调试...串口命令设置定时器发送数据到串口的时间间隔 <后的第一个字符为A 第二个为
  • 定时器串口

    2020-05-17 14:41:47
    定时器 STM32F4的通用定时器包括TIM(25)**和**TIM(914),包含一个16位或32位的自动重载计数器(CNT),由可编程预分频器(PSC)驱动。 (分频器是指将不同频段的声音信号区分开来,分别给于放大,然后送到相应频段的扬...

    定时器

    STM32F4的通用定时器包括TIM(25)**和**TIM(914),包含一个16位或32位的自动重载计数器(CNT),由可编程预分频器(PSC)驱动。
    (分频器是指将不同频段的声音信号区分开来,分别给于放大,然后送到相应频段的扬声器中再进行重放。)定时器可以被用来测量输出信号的脉冲长度,或者产生输出波形(输出比较和PWM(脉冲宽度调制,通过改变脉冲宽度改变输出电压,本质上就是调节占空比,能输出PWM的IO口是固定的,可以通过重映射改变引脚)),每个通用定时器都是独立的。

    TIM2和TIM5支持向上,向下,向上/向下自动装载计数器,TIM9TIM14只支持向上计数。**165536**

    4个独立通道(TIM9TIM14最多两个):**输入捕获**,**输出比较**,**PWM生成**(边缘和中间对齐模式(914不支持中间对齐)),单脉冲输出(单脉冲就是脉冲输入一直有,通过方向输入的高低电平来控制方向!一般称为脉冲信号+方向信号控制方式
    2:双脉冲就是指脉冲输入和方向输入两路都是脉冲输入,只是一路是正向脉冲,一路是反向脉冲!一般称为正向脉冲+反向脉冲控制方式)

    定时器时钟来源:内部时钟外部时钟模式1(外部输入脚TIx)外部时钟模式2(ETR),**内部触发输入(ITRx)**TIM9~14的时钟来自于APB2.

    定时器溢出时间计算方法 Tout=((arr+1)*(psc+1))/Ft us. Tclk:输入时钟频率(单位为 Mhz)。psc为预分频系数,对系统时钟进行分频。Tout:溢出时间(单位为 us) 重装载值arr,这个重装载值的意思就是当我们的定时器的计数值达到这个arr时,定时器就会重新装载其他值.例如当我们设置定时器为向上计数时,定时器计数的值等于arr之后就会被清0重新计数,定时器计数的值被重装载一次就是一个更新
    (UPDATE)

    注意:PSC预分频系数需要加1(为了避免预分频系数没有设置的取0的情况),自动重装载值也要加1(从ARR到0之间的数字为ARR+1个)

    NVIC 提供中断控制器,用于总体管理异常。

    (系统中断(比如:PendSV,SVC,SysTick)是不是一定比外部中断(比如SPI,USART)要高,答案:不是的,它们是在同一个NVIC下面设置的。)嵌套向量中断控制器;用于为中断分组,从而分配抢占优先级和响应优先级;
    1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;

    2)抢占式优先级别相同的中断源之间没有嵌套关系;

    3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。

    重映射就是管脚的外设功能映射到另一个管脚

    通用定时器中断设置的步骤

    1.使能定时器时钟   
    
    2.初始化定时器参数,包含自动重装载值,分频系数,计数方式等
    
    3.设置定时器中断类型,并使能   void TIM_ITConfig(TIM_TypeDef* TIMx,unit16_t TIM_IT, FunctionalState NewState)
    
    4.设置定时器中断优先级,使能定时器中断通道   
    NVIC初始化函数  NVIC_Init
    
    5.开启定时器
    
    6.编写定时器中断服务函数
    在中断产生后,通过状态寄存器的值来判断此次属于什么中断,执行相关操作,清除寄存器的中断标志
    
    另外固件库中函数TIM_ClearFlag(清除寄存器状态),TIM_GetFlagStatus(判断定时器状态),TIM_GetITStatus(判断中断标志位)
    

    在HAL库中

    HAL_TIM_IRQHandler(&htim2);定时器中断服务函数,每进行一次中断,回到中断回调函数
    
     void TIM3_IRQHandler(void)   首先进入中断函数
    	 HAL_TIM_IRQHandler(&htim2);之后进入定时器中断处理函数
    	判断产生的是哪一类定时器中断(溢出中断/PWM中断.....) 和定时器通道
    	 void HAL_TIM_PeriodElapsedCallback(&htim2);    进入相对应中断回调函数
    	在中断回调函数中添加用户代码
    

    寄存器

    计数器寄存器(TIMx_CNT),预分频寄存器(TIMx_PSC)(1~65536),自动重装载寄存器(TIMx_ARR)(如果TIM1——CR1)寄存器中的ARPE位(自动重载预装载使能位)为0,ARR寄存器的内容将直接写入影子寄存器,当
    计数器达到上溢值(或者在递减计数时达到下溢值)并且 TIMx_CR1 寄存器中的 UDIS 位为0 时,将发送更新事件,置1,则禁止UEV事件。

    定时器时间=1/(时钟频率/预分频/计数周期)

    串口通信

    并行通信:数据各个位同时传输

    串行通信:数据按位顺序传输,速度慢 单工,半双工(切换方向的单工通信),全双工,,同步通信(带时钟同步信号传输,SPI,IIC),异步通信(不带时钟同步信号UART)

    串口:TXD发送端,RXD接收端,异步通信

    串口相关寄存器: USART_SR状态寄存器,USART_DR数据寄存器,USART_BRR波特率寄存器。数据发送与接收,通过USART_DR实现,在TDR写入数据,串口自动发送数据,当收到数据读取的是RDR,虽然是一个 32 位寄存器,但是只用了低 9 位(DR[8:0]),其他都是保留
    DR[8:0]为串口数据,包含了发送或接收的数据。由于它是由两个寄存器(TDR 和 RDR)组
    成的,一个给发送用(TDR),一个给接收用(RDR),该寄存器兼具读和写的功能。TDR 寄存器
    提供了内部总线和输出移位寄存器之间的并行接口。RDR 寄存器提供了输入移位寄存器和内部
    总线之间的并行接口。
    当使能校验位(USART_CR1 中 PCE 位被置位)进行发送时,写到 MSB 的值(根据数据的长
    度不同,MSB 是第 7 位或者第 8 位)会被后来的校验位取代。
    当使能校验位进行接收时,读到的 MSB 位是接收到的校验位。

    串口配置的一般步骤:

    1.串口时钟使能:RCC_APBxPeriphClockCmd();
    
    GPIO时钟使能:RCC_AHB1PerighClockCmd();
    
    2.引脚复用映射:GPIO_PinAFConfig();
    
    3.GPIO端口模式设置:GPIO_Init();//模式设置为GPIO_Mode_AF
    
    4.串口参数初始化:USART_Init();
    
    5.开启中断并且初始化NVIC(有中断才要这个) NVIC_Init();USART_ITConfig();
    
    6.使能串口:USART_Cmd();
    
    7.编写中断处理函数:USARTx_IRQHandler();
    
    8.串口数据收发:void USART_SendData();//发送数据到串口,DR     
     unit16_t USART_ReceiveData();//接受数据,从DR读取接收到的数据
    
    9.串口传输状态获取:
    FlagStatus USART_GetFlagStatus();
    void USART_ClearITPendinngBit();

    串口通信数据包 起始位,位0~7,校验位,停止位,起始位由1个逻辑0的数据位表示,结束位 由0.5,1,1.5,2个逻辑1的数据位表示,有效数据位后紧接着就是有效数据,长度为5~8位长,校验位,可选,数据的抗干扰性。

    奇校验,有效数据和校验位中“1”的个数为奇数,偶校验,0校验,1校验,无校验,数据包里不含校验位

    展开全文
  • //串口0的设置,用定时器2 T2CON=0x30; //用定时器2做串口0的波特率发生器 //参考https://www.cnblogs.com/perfy/p/3782166.html RCAP2H=(65536-22118400/baud_rate/32)/256; // 22.1184M晶振下,baud rate=...
  • 目录一、引言二、串口中断三、定时器中断四、待补内容 一、引言 1、AXI UART IP。 AXI UART IP 核提供了 AXI4-Lite 接口,可以通过 AXI4-Lite 接口读取状态寄存器或配置 UART Control 模块(复位收发 FIFO、启用...
  • 模拟串口定时器完成,每一个串口要占用一个定时器,发送很好办,每次定时器中断(1BIT的时间)传送一个Bit,接收就要你好好处理了,这个我模拟的一个串口,用的W77E58,实际工作时只用到了半双工。
  • 【C51】同时使用串口定时器

    千次阅读 2017-03-29 21:42:28
    今天下午调程序,只要加入了定时器串口就会失灵。简单想下,应该是串口中断被定时器中断打断了。所以配置IP寄存器让 串口中断权限最高这里写代码片IP=0x10;
  • 实现功能:定时器T0模拟串口 使用芯片:STC15F104E 晶振:内部晶振 11.0592MHZ 编译环境:Keil
  • 定时器判定串口是否接收完成! 极速判定,不容出错! 接收&&处理, 将接收、处理、定时器插入函数都已经已经封装。
  • 单片机程序源代码,包括 AD转换 串口通讯 定时器配置 端口配置 延时 I2C通讯 UART串口 程序说明巨详细,编译通过 ,对单片机学习肯定有用
  • 这是一款定时器串口波特率计算工具,方便大家计算定时器串口波特率。有需要的可以下载。
  • 通过按键1的单击、双击、长按来控制灯,单击红灯亮,双击绿灯亮、长按两灯都熄灭;按键2运用定时器中断能控制红灯亮5s后熄灭;还可以通过串口发指令控制红灯绿灯的亮灭情况以及打印在串口上。
  • 内含程序包括使用定时器2作为串口发生器的定时器和使用专门的波特率发生器,详尽的示例,经过测试成功。
  • ch=1,LED0闪烁 ch=2,LED1闪烁 ch=3,关闭定时器3中断 ch=4,开启定时器3中断,LED1、LED2闪烁

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,412
精华内容 13,364
关键字:

串口定时器