网站推广的方法枫子中国建设银行笔试确认网站
2026/1/2 6:52:13 网站建设 项目流程
网站推广的方法枫子,中国建设银行笔试确认网站,好网站建设公司昆明,网站怎么吸引人STM32F103C8T6中断配置 作为一个STM32新手#xff0c;当初第一次接触中断配置的时候#xff0c;真的是一头雾水。拿着STM32F103C8T6的最小系统板#xff0c;想做个按键外部中断翻转LED的小实验#xff0c;结果折腾了大半天#xff0c;LED就是纹丝不动。后来一点点排查当初第一次接触中断配置的时候真的是一头雾水。拿着STM32F103C8T6的最小系统板想做个按键外部中断翻转LED的小实验结果折腾了大半天LED就是纹丝不动。后来一点点排查才发现是自己漏了关键的步骤。今天就把STM32F103C8T6的中断配置经验分享出来希望能帮到和我当初一样的新手。一、STM32中断的分类在STM32中中断是指CPU在执行当前任务时由于某种事件外部或内部发生暂停当前任务转而执行中断服务程序ISR完成后再返回原任务。STM32的中断主要分为以下几种类型硬中断硬中断是由外部硬件设备触发的中断信号例如GPIO外部中断、定时器中断等。硬中断可以进一步分为以下两类不可屏蔽中断NMI用于处理紧急情况例如RAM奇偶校验错误。NMI无法被屏蔽CPU必须立即响应。可屏蔽中断INTR用于一般外设的中断请求例如网卡或串口通信。CPU可以选择响应或忽略。软中断软中断是由软件触发的中断通常用于系统调用或访问受保护的资源。软中断的主要作用是将复杂的任务分为两部分一部分在硬中断中快速处理另一部分在软中断中完成以提高系统实时性。异常异常是CPU在运行过程中由于错误或特殊指令触发的中断例如Fault如除零错误或无效操作码。Trap如调试断点或溢出。Abort如总线错误或内存访问错误。外部中断EXTI外部中断是由GPIO引脚的电平变化触发的中断。STM32支持多达23条外部中断线包括GPIO中断、RTC闹钟事件、USB唤醒等。每条中断线可以独立配置触发方式上升沿、下降沿或双边沿。系统中断系统中断是由内核触发的特殊中断例如SysTick定时器中断、PendSV中断等。这些中断通常用于操作系统的任务调度或系统管理。中断优先级STM32的中断优先级分为抢占优先级和响应优先级。抢占优先级决定中断是否可以打断其他中断而响应优先级用于决定同级抢占优先级的中断处理顺序。通过合理配置中断优先级和触发条件可以实现高效的实时控制和资源管理。二、先聊点基础STM32中断的核心概念在动手之前先简单提两个核心玩意儿不用死记硬背知道是干啥的就行NVIC嵌套向量中断控制器相当于STM32的“中断管家”负责管理所有中断的优先级、开启/关闭中断通道所有外设的中断最终都要经过它的调度。EXTI外部中断/事件控制器专门管外部引脚的中断比如按键触发的中断它能把GPIO引脚和NVIC连接起来还能设置触发方式上升沿、下降沿、双边沿。STM32F103C8T6的中断配置本质上就是让外设比如GPIO产生中断请求通过EXTI外部中断或外设自身的中断源告诉NVIC最后由NVIC触发对应的中断服务函数。三、实战环境准备先交代下我的实验环境新手可以直接照搬硬件STM32F103C8T6最小系统板、LED灯接PB0、按键接PA0软件Keil MDK5.36、STM32标准外设库3.5.0F1系列别用HAL库新手先从标准库入手更易理解实验目标很简单按下PA0的按键触发外部中断翻转PB0的LED灯状态。四、库函数配置外部中断我推荐新手先用库函数不用跟寄存器死磕先把流程跑通再说。步骤1开启相关时钟最容易漏的一步STM32的外设要工作必须先开时钟这是铁律。这里需要开三个时钟GPIOAPA1按键、GPIOBPB0 LED的时钟APB2总线AFIO复用功能IO的时钟重点外部中断的引脚映射必须靠AFIO不开这个时钟中断绝对触发不了代码如下// 1. 开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);步骤2配置GPIO引脚模式PA1作为按键输入我选上拉输入这样按键没按下时是高电平按下是低电平PB0作为LED输出选推挽输出。代码// 2. 配置GPIOGPIO_InitTypeDef GPIO_InitStructure;// PA1配置根据实际电路选择模式// 如果按键接在PA0和GND之间使用上拉输入GPIO_InitStructure.GPIO_PinGPIO_Pin_1;GPIO_InitStructure.GPIO_ModeGPIO_Mode_IPU;// 上拉输入GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;// 输入模式可忽略SpeedGPIO_Init(GPIOA,GPIO_InitStructure);// PB0配置GPIO_InitStructure.GPIO_PinGPIO_Pin_0;GPIO_InitStructure.GPIO_ModeGPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOB,GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_0);// 初始高电平GPIO_InitTypeDef GPIO_InitStructure;步骤3配置AFIO的外部中断引脚映射STM32的EXTI线和GPIO引脚是“一对多”的关系比如EXTI0线可以对应GPIOA0、GPIOB0、GPIOC0等但需要通过AFIO指定具体用哪个GPIO的引脚。我们要把PA1和EXTI1线绑定用库函数GPIO_EXTILineConfig就行// 3. 配置AFIO映射GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1);步骤4配置EXTI中断参数这里要设置中断的触发方式、开启中断线// 4. 配置EXTIEXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_LineEXTI_Line1;EXTI_InitStructure.EXTI_ModeEXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_TriggerEXTI_Trigger_Falling;// 下降沿触发EXTI_InitStructure.EXTI_LineCmdENABLE;EXTI_Init(EXTI_InitStructure);步骤5配置NVIC中断优先级NVIC是“中断管家”必须告诉它哪个中断通道要开启优先级是多少首先要配置优先级分组整个程序只能调用一次我选分组22位抢占优先级2位响应优先级然后配置EXTI0的优先级// 5. 配置NVICNVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannelEXTI1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority2;NVIC_InitStructure.NVIC_IRQChannelSubPriority2;NVIC_InitStructure.NVIC_IRQChannelCmdENABLE;NVIC_Init(NVIC_InitStructure);步骤6编写中断服务函数必须清标志位中断服务函数的名字是固定的要和启动文件startup_stm32f10x_md.s里的中断向量表一致比如EXTI0的服务函数名就是EXTI0_IRQHandler。重点中的重点执行完中断操作后必须清除中断标志位否则MCU会认为中断还在触发一直进入服务函数导致程序卡死// 中断服务函数定义voidEXTI1_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line1)!RESET){// 简单延时消抖可选根据需求// for(int i 0; i 10000; i);// 读取按键状态if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)0){// 翻转LED状态if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_0))GPIO_ResetBits(GPIOB,GPIO_Pin_0);elseGPIO_SetBits(GPIOB,GPIO_Pin_0);}EXTI_ClearITPendingBit(EXTI_Line1);// 必须清除中断标志}}步骤7整合main函数把上面的代码整合到main函数里死循环里啥都不用做等待中断即可#includestm32f10x.h// STM32标准外设库头文件// 中断服务函数声明voidEXTI1_IRQHandler(void);/** * brief 主函数 * param 无 * retval int 程序返回值通常不会返回 */intmain(void){// 系统初始化配置系统时钟、Flash延迟等SystemInit();/******************** 第一步开启外设时钟 ********************/// 使能GPIOA、GPIOB和AFIO复用功能IO的时钟// 注意STM32外设使用前必须开启对应的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);/******************** 第二步配置GPIO引脚 ********************/GPIO_InitTypeDef GPIO_InitStructure;// GPIO初始化结构体// 配置PA1为输入模式连接按键// 假设按键一端接PA1另一端接GND使用内部上拉电阻GPIO_InitStructure.GPIO_PinGPIO_Pin_1;// 选择引脚1GPIO_InitStructure.GPIO_ModeGPIO_Mode_IPU;// 上拉输入模式GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;// 输入模式下此参数可忽略GPIO_Init(GPIOA,GPIO_InitStructure);// 应用配置到GPIOA// 配置PB0为输出模式连接LEDGPIO_InitStructure.GPIO_PinGPIO_Pin_0;// 选择引脚0GPIO_InitStructure.GPIO_ModeGPIO_Mode_Out_PP;// 推挽输出模式GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;// 输出速度50MHzGPIO_Init(GPIOB,GPIO_InitStructure);// 应用配置到GPIOB// 设置PB0初始状态为高电平LED灭假设低电平点亮LEDGPIO_SetBits(GPIOB,GPIO_Pin_0);/******************** 第三步配置AFIO映射 ********************/// 将GPIOA的Pin1映射到外部中断线1// 注意每个外部中断线可以映射到多个GPIO引脚需通过AFIO选择具体引脚GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1);/******************** 第四步配置外部中断(EXTI) ********************/EXTI_InitTypeDef EXTI_InitStructure;// EXTI初始化结构体EXTI_InitStructure.EXTI_LineEXTI_Line1;// 选择外部中断线1EXTI_InitStructure.EXTI_ModeEXTI_Mode_Interrupt;// 中断模式非事件模式EXTI_InitStructure.EXTI_TriggerEXTI_Trigger_Falling;// 下降沿触发按键按下时产生下降沿EXTI_InitStructure.EXTI_LineCmdENABLE;// 使能该中断线EXTI_Init(EXTI_InitStructure);// 应用配置/******************** 第五步配置嵌套向量中断控制器(NVIC) ********************/NVIC_InitTypeDef NVIC_InitStructure;// NVIC初始化结构体// 配置中断优先级分组2位抢占优先级2位响应优先级// 注意整个系统只能调用一次优先级分组函数NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 配置EXTI1中断通道NVIC_InitStructure.NVIC_IRQChannelEXTI1_IRQn;// 中断通道EXTI线1NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority2;// 抢占优先级为2NVIC_InitStructure.NVIC_IRQChannelSubPriority2;// 响应优先级为2NVIC_InitStructure.NVIC_IRQChannelCmdENABLE;// 使能该中断通道NVIC_Init(NVIC_InitStructure);// 应用配置/******************** 第六步主循环 ********************/while(1){// 主循环可以添加其他后台任务// 中断处理会在中断服务函数中进行不会影响主循环运行// 可以在这里添加低功耗模式、系统状态监测等代码}}/** * brief EXTI线1中断服务函数 * param 无 * retval 无 * note 当PA1引脚检测到下降沿时此函数会被自动调用 */voidEXTI1_IRQHandler(void){// 检查是否发生了EXTI线1中断中断标志位是否置位if(EXTI_GetITStatus(EXTI_Line1)!RESET){// ---------- 可选按键消抖处理 ----------// 机械按键在按下/释放时会产生抖动可能导致多次触发// 简单的软件消抖方法延时后再次检测引脚状态// for(int i 0; i 10000; i); // 简单延时// ---------- 确认按键状态 ----------// 再次读取PA1引脚状态确保是有效的按键按下// 上拉模式下按键按下时引脚为低电平0if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)0){// ---------- 执行中断处理逻辑 ----------// 读取PB0当前输出状态并翻转if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_0)){// 当前为高电平设置为低电平点亮LEDGPIO_ResetBits(GPIOB,GPIO_Pin_0);}else{// 当前为低电平设置为高电平熄灭LEDGPIO_SetBits(GPIOB,GPIO_Pin_0);}// 可选添加按键释放等待避免单次按下触发多次// while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) 0);}// ---------- 清除中断标志位 ----------// 非常重要如果不清除标志位会连续触发中断EXTI_ClearITPendingBit(EXTI_Line1);}}五、容易踩的坑忘记开启AFIO时钟这是我当初最致命的坑配置完所有步骤按键按烂了LED都不亮后来查手册才发现外部中断映射需要AFIO支持。没清中断标志位第一次成功触发中断后LED闪了一下就卡住了原因是没清标志位MCU一直重复进入中断。GPIO模式配错比如把PA0配成浮空输入又没外接上拉电阻导致引脚电平不稳定中断乱触发。优先级分组调用多次NVIC_PriorityGroupConfig只能调用一次否则会导致优先级配置混乱。六、总结中断配置的核心逻辑其实不管是外部中断、定时器中断还是串口中断配置流程都大同小异开时钟 → 配外设 → 配中断源EXTI/外设自身 → 配NVIC → 写服务函数清标志位新手只要把这个流程刻在脑子里再结合实际外设的特点稍作调整就能搞定大部分中断配置了。最后说句心里话学习STM32光看教程没用一定要动手。遇到问题别慌查手册、单步调试、逐行排查那些踩过的坑最后都会变成你的经验。江协科技中断学习笔记对射式传感器的应用main.c 代码如下#includestm32f10x.h// Device header#includeDelay.h#includeOLED.h#includeCountSensor.hintmain(){OLED_Init();CountSensor_Init();OLED_ShowCHinese(0,0,0);//计OLED_ShowCHinese(0,16,1);//次OLED_ShowString(1,5,:);while(1){OLED_ShowNum(1,6,CountSensor_Get(),5);}}CountSensor.c 代码如下#includestm32f10x.h// Device headeruint16_tCountSensor_Count;voidCountSensor_Init(void){/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIOB的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启AFIO的时钟外部中断必须开启AFIO的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_ModeGPIO_Mode_IPU;GPIO_InitStructure.GPIO_PinGPIO_Pin_14;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOB,GPIO_InitStructure);//将PB14引脚初始化为上拉输入/*AFIO选择中断引脚*///将外部中断的14号线映射到GPIOB即选择PB14为外部中断引脚GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);/*EXTI初始化*/EXTI_InitTypeDef EXTI_InitStructure;//定义结构体变量EXTI_InitStructure.EXTI_LineEXTI_Line14;//选择配置外部中断的14号线EXTI_InitStructure.EXTI_LineCmdENABLE;//指定外部中断线使能EXTI_InitStructure.EXTI_ModeEXTI_Mode_Interrupt;//指定外部中断线为中断模式EXTI_InitStructure.EXTI_TriggerEXTI_Trigger_Falling;//指定外部中断线为下降沿触发EXTI_Init(EXTI_InitStructure);//将结构体变量交给EXTI_Init配置EXTI外设/*NVIC中断分组*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置NVIC为分组2//即抢占优先级范围0~3响应优先级范围0~3//此分组配置在整个工程中仅需调用一次//若有多个中断可以把此代码放在main函数内while循环之前//若调用多次配置分组的代码则后执行的配置会覆盖先执行的配置/*NVIC配置*/NVIC_InitTypeDef NVIC_InitStructure;//定义结构体变量NVIC_InitStructure.NVIC_IRQChannelEXTI15_10_IRQn;//选择配置NVIC的EXTI15_10线NVIC_InitStructure.NVIC_IRQChannelCmdENABLE;//指定NVIC线路使能NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority1;//指定NVIC线路的抢占优先级为1NVIC_InitStructure.NVIC_IRQChannelSubPriority1;//指定NVIC线路的响应优先级为1NVIC_Init(NVIC_InitStructure);//将结构体变量交给NVIC_Init配置NVIC外设}/** * 函 数获取计数传感器的计数值 * 参 数无 * 返 回 值计数值范围0~65535 */uint16_tCountSensor_Get(void){returnCountSensor_Count;}voidEXTI15_10_IRQHandler(void){if(EXTI_GetFlagStatus(EXTI_Line14)SET){/*如果出现数据乱跳的现象可再次判断引脚电平以避免抖动*/if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)0)//判断是否是外部中断14号线触发的中断{CountSensor_Count;//计数值自增一次}EXTI_ClearITPendingBit(EXTI_Line14);//清除外部中断14号线的中断标志位//中断标志位必须清除//否则中断将连续不断地触发导致主程序卡死}}CountSensor.h 代码如下#ifndef__COUNT_SENSOR_H#define__COUNT_SENSOR_HvoidCountSensor_Init(void);uint16_tCountSensor_Get(void);#endif旋转编码器计数main.c 代码如下#includestm32f10x.h// Device header#includeDelay.h#includeOLED.h#includeEncoder.hint16_tNum;intmain(){/*模块初始化*/OLED_Init();//OLED初始化Encoder_Init();//旋转编码器初始化OLED_ShowCHinese(0,0,0);//计OLED_ShowCHinese(0,16,1);//次OLED_ShowString(1,5,:);while(1){NumEncoder_Get();OLED_ShowSignedNum(1,6,Num,5);}}Encoder.c 代码如下#includestm32f10x.h// Device headerint16_tEncoder_Count;voidEncoder_Init(void){/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIOB的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启AFIO的时钟外部中断必须开启AFIO的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_ModeGPIO_Mode_IPU;GPIO_InitStructure.GPIO_PinGPIO_Pin_0|GPIO_Pin_1;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOB,GPIO_InitStructure);//将PB14引脚初始化为上拉输入/*AFIO选择中断引脚*/GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);//将外部中断的0号线映射到GPIOB即选择PB0为外部中断引脚GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);//将外部中断的1号线映射到GPIOB即选择PB1为外部中断引脚/*EXTI初始化*/EXTI_InitTypeDef EXTI_InitStructure;//定义结构体变量EXTI_InitStructure.EXTI_LineEXTI_Line0|EXTI_Line1;//选择配置外部中断的14号线EXTI_InitStructure.EXTI_LineCmdENABLE;//指定外部中断线使能EXTI_InitStructure.EXTI_ModeEXTI_Mode_Interrupt;//指定外部中断线为中断模式EXTI_InitStructure.EXTI_TriggerEXTI_Trigger_Falling;//指定外部中断线为下降沿触发EXTI_Init(EXTI_InitStructure);//将结构体变量交给EXTI_Init配置EXTI外设/*NVIC中断分组*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置NVIC为分组2//即抢占优先级范围0~3响应优先级范围0~3//此分组配置在整个工程中仅需调用一次//若有多个中断可以把此代码放在main函数内while循环之前//若调用多次配置分组的代码则后执行的配置会覆盖先执行的配置/*NVIC配置*/NVIC_InitTypeDef NVIC_InitStructure;//定义结构体变量NVIC_InitStructure.NVIC_IRQChannelEXTI0_IRQn;//选择配置NVIC的EXTI0线NVIC_InitStructure.NVIC_IRQChannelCmdENABLE;//指定NVIC线路使能NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority1;//指定NVIC线路的抢占优先级为1NVIC_InitStructure.NVIC_IRQChannelSubPriority1;//指定NVIC线路的响应优先级为1NVIC_Init(NVIC_InitStructure);//将结构体变量交给NVIC_Init配置NVIC外设NVIC_InitStructure.NVIC_IRQChannelEXTI1_IRQn;//选择配置NVIC的EXTI1线NVIC_InitStructure.NVIC_IRQChannelCmdENABLE;//指定NVIC线路使能NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority1;//指定NVIC线路的抢占优先级为1NVIC_InitStructure.NVIC_IRQChannelSubPriority2;//指定NVIC线路的响应优先级为2NVIC_Init(NVIC_InitStructure);//将结构体变量交给NVIC_Init配置NVIC外设}int16_tEncoder_Get(void){/*使用Temp变量作为中继目的是返回Encoder_Count后将其清零*//*在这里也可以直接返回Encoder_Count 但这样就不是获取增量值的操作方法了 也可以实现功能只是思路不一样*/int16_tTemp;TempEncoder_Count;Encoder_Count0;returnTemp;}/** * 函 数EXTI0外部中断函数 * 参 数无 * 返 回 值无 * 注意事项此函数为中断函数无需调用中断触发后自动执行 * 函数名为预留的指定名称可以从启动文件复制 * 请确保函数名正确不能有任何差异否则中断函数将不能进入 */voidEXTI0_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line0)SET)//判断是否是外部中断0号线触发的中断{/*如果出现数据乱跳的现象可再次判断引脚电平以避免抖动*/if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)0){//PB0的下降沿触发中断此时检测另一相PB1的电平目的是判断旋转方向if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)0){Encoder_Count--;//此方向定义为反转计数变量自减}}EXTI_ClearITPendingBit(EXTI_Line0);//清除外部中断0号线的中断标志位//中断标志位必须清除//否则中断将连续不断地触发导致主程序卡死}}/** * 函 数EXTI1外部中断函数 * 参 数无 * 返 回 值无 * 注意事项此函数为中断函数无需调用中断触发后自动执行 * 函数名为预留的指定名称可以从启动文件复制 * 请确保函数名正确不能有任何差异否则中断函数将不能进入 */voidEXTI1_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line1)SET)//判断是否是外部中断1号线触发的中断{/*如果出现数据乱跳的现象可再次判断引脚电平以避免抖动*/if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)0){//PB1的下降沿触发中断此时检测另一相PB0的电平目的是判断旋转方向if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)0){Encoder_Count;//此方向定义为正转计数变量自增}}EXTI_ClearITPendingBit(EXTI_Line1);//清除外部中断1号线的中断标志位//中断标志位必须清除//否则中断将连续不断地触发导致主程序卡死}}Encoder.h 代码如下#ifndef__ENCODER_H#define__ENCODER_HvoidEncoder_Init(void);int16_tEncoder_Get(void);#endif

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询