#include "stm32f10x.h" // Device header int16_t Encoder_Num; void Encoder_Init (void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); GPIO_InitTypeDef GPIO_Initstructure; GPIO_Initstructure.GPIO_Mode=GPIO_Mode_IPU; GPIO_Initstructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1; GPIO_Initstructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_Initstructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0|GPIO_PinSource1); EXTI_InitTypeDef EXTI_Initstructure; EXTI_Initstructure.EXTI_Line=EXTI_Line0|EXTI_Line1; EXTI_Initstructure.EXTI_LineCmd=ENABLE; EXTI_Initstructure.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_Initstructure.EXTI_Trigger=EXTI_Trigger_Falling; EXTI_Init(&EXTI_Initstructure); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitTypeDef NVIC_Initstructure; NVIC_Initstructure.NVIC_IRQChannel=EXTI0_IRQn; NVIC_Initstructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority=1; NVIC_Initstructure.NVIC_IRQChannelSubPriority=1; NVIC_Init(&NVIC_Initstructure); NVIC_Initstructure.NVIC_IRQChannel=EXTI1_IRQn; NVIC_Initstructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority=2; NVIC_Initstructure.NVIC_IRQChannelSubPriority=2; NVIC_Init(&NVIC_Initstructure); } int Encoder_get() { int16_t temp; temp=Encoder_Num; Encoder_Num=0; return temp; } void EXTI0_IRQHandler () { if (EXTI_GetITStatus(EXTI_Line0)==SET) { if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0) { if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==1) { Encoder_Num++; } } EXTI_ClearITPendingBit(EXTI_Line0); } } void EXTI1_IRQHandler () { if (EXTI_GetITStatus(EXTI_Line1)==SET) { if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0) { if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==1) { Encoder_Num--; } } EXTI_ClearITPendingBit(EXTI_Line1); } } 中断1可以出发但是中断0不能触发
时间: 2023-09-11 12:10:22 浏览: 87
根据您提供的代码,中断1可以触发但中断0不能触发的问题可能是由于以下原因导致的:
1. 引脚配置不正确:请确保将外部中断线0连接到GPIOB的引脚0,并将外部中断线1连接到GPIOB的引脚1。同时,确保在GPIO_Initstructure结构体中正确配置了引脚的模式。
2. 中断优先级设置不正确:请确保中断0的优先级高于中断1的优先级,以确保中断0能够被正确触发。可以通过调整`NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority`值来设置优先级。
3. 中断触发方式设置不正确:根据代码,中断触发方式被配置为下降沿触发。请确认外部信号的触发方式是否满足此条件。如果您期望使用其他触发方式,请相应地调整`EXTI_Initstructure.EXTI_Trigger`参数。
4. 中断使能未打开:请确保已通过`NVIC_Initstructure.NVIC_IRQChannelCmd=ENABLE`打开了中断0和中断1的中断向量。
如果仍然存在问题,请检查硬件连接是否正确并提供更多关于硬件环境和其他相关代码的信息,以便更好地帮助您解决问题。
相关问题
#include "./stepper/bsp_stepper_init.h" #include "./Encoder/bsp_encoder.h"什么意思
这段代码是包含了两个头文件的路径,分别是"./stepper/bsp_stepper_init.h"和"./Encoder/bsp_encoder.h"。
1. "#include "./stepper/bsp_stepper_init.h"":这行代码包含了名为"bsp_stepper_init.h"的头文件,该头文件位于当前工作目录下的"stepper"文件夹中。这个头文件可能包含了有关步进电机初始化的函数、宏定义或其他相关内容。
2. "#include "./Encoder/bsp_encoder.h"":这行代码包含了名为"bsp_encoder.h"的头文件,该头文件位于当前工作目录下的"Encoder"文件夹中。这个头文件可能包含了有关编码器操作的函数、宏定义或其他相关内容。
通过包含这两个头文件,你可以在当前代码中使用这些头文件中定义的函数、宏定义或其他内容,以便进行步进电机和编码器相关的初始化、操作或配置。
下列头文件的作用是什么,能分别说明吗#include <iostream> #include "ros/ros.h" #include "std_msgs/String.h" #include "std_msgs/Float32.h" #include <sstream> #include "math.h" #include "can_drive/ICANCmd.h" #include "can_drive/Nav_data_msg.h" #include "can_drive/encoder_vel_msg.h" #include "can_drive/radar_obs_msg.h" #include "can_drive/camera_obs_msg.h" #include "sensor_msgs/Imu.h" #include "can_drive/pwm_cmd_msg.h" #include "can_drive/sensor_states_msg.h" #include <tf/tf.h> #include <bitset> #include <string> #include <algorithm> #include <thread> #include <pthread.h> #include <time.h>
这些头文件是C++编程中常用的库文件,主要作用如下:
- #include <iostream>:用于输入输出流的操作,如输出到控制台等。
- #include "ros/ros.h":ROS机器人操作系统的头文件,用于机器人程序的编写。
- #include "std_msgs/String.h":ROS中的标准消息类型,用于传递字符串类型的消息。
- #include "std_msgs/Float32.h":ROS中的标准消息类型,用于传递浮点型数据。
- #include <sstream>:用于字符串流的操作,如将数字转换为字符串等。
- #include "math.h":数学库文件,提供了许多常用的数学函数。
- #include "can_drive/ICANCmd.h":自定义消息类型,用于控制CAN总线通信。
- #include "can_drive/Nav_data_msg.h":自定义消息类型,用于传递导航数据。
- #include "can_drive/encoder_vel_msg.h":自定义消息类型,用于传递编码器速度数据。
- #include "can_drive/radar_obs_msg.h":自定义消息类型,用于传递雷达障碍物数据。
- #include "can_drive/camera_obs_msg.h":自定义消息类型,用于传递摄像头障碍物数据。
- #include "sensor_msgs/Imu.h":ROS中的标准消息类型,用于传递IMU数据。
- #include "can_drive/pwm_cmd_msg.h":自定义消息类型,用于控制PWM信号输出。
- #include "can_drive/sensor_states_msg.h":自定义消息类型,用于传递各种传感器状态数据。
- #include <tf/tf.h>:ROS中的变换库文件,用于实现坐标系变换。
- #include <bitset>:二进制库文件,提供了位运算的一些常用函数。
- #include <string>:字符串库文件,提供了许多字符串操作的函数。
- #include <algorithm>:STL算法库文件,提供了许多常用的算法函数。
- #include <thread>:C++11中的多线程库文件,用于实现多线程编程。
- #include <pthread.h>:POSIX线程库文件,用于实现多线程编程。
- #include <time.h>:时间库文件,提供了许多时间相关的函数。