鱼C论坛

 找回密码
 立即注册
查看: 263|回复: 1

[已解决]stm32中断函数

[复制链接]
发表于 2024-1-16 15:39:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
void TIM1_UP_IRQHandler(void)   //TIM3中断
{
        if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)  //检查TIM1更新中断发生与否
        {
                TIM_ClearITPendingBit(TIM1, TIM_IT_Update);  //清除TIM1更新中断标志
                num++;
       

                #ifdef USE_SERVO_J1
                if(num <= (Angle_J1 * 11 + 500)/10)
                {
                        GPIO_SetBits(Servo_J1_PORT, Servo_J1_PIN );                //将舵机接口电平置高
                }
                else
                {
                        GPIO_ResetBits(Servo_J1_PORT, Servo_J1_PIN );                //将舵机接口电平置高
                }
                #endif                  

                #ifdef USE_SERVO_J2
                if(num <= (Angle_J2 * 11 + 500)/10)
                {
                        GPIO_SetBits(Servo_J2_PORT, Servo_J2_PIN );                //将舵机接口电平置高
                }
                else
                {
                        GPIO_ResetBits(Servo_J2_PORT, Servo_J2_PIN );                //将舵机接口电平置高
                }
                #endif

                #ifdef USE_SERVO_J3

                if(num <= (Angle_J3 * 11 + 500)/10)
                {
                        GPIO_SetBits(Servo_J3_PORT, Servo_J3_PIN );                //将舵机接口电平置高
                }
                else
                {
                        GPIO_ResetBits(Servo_J3_PORT, Servo_J3_PIN );                //将舵机接口电平置高
                }
                #endif

                #ifdef USE_SERVO_J4
                if(num <= (Angle_J4 * 11 + 500)/10)
                {
                        GPIO_SetBits(Servo_J4_PORT, Servo_J4_PIN );                //将舵机接口电平置高
                }
                else
                {
                        GPIO_ResetBits(Servo_J4_PORT, Servo_J4_PIN );                //将舵机接口电平置高
                }
                #endif

                #ifdef USE_SERVO_J5
                if(num <= (Angle_J5 * 11 + 500)/10)
                {
                        GPIO_SetBits(Servo_J5_PORT, Servo_J5_PIN );                //将舵机接口电平置高
                }
                else
                {
                        GPIO_ResetBits(Servo_J5_PORT, Servo_J5_PIN );                //将舵机接口电平置高
                }
                #endif

                #ifdef USE_SERVO_J6
                if(num <= (Angle_J6 * 11 + 500)/10)
                {
                        GPIO_SetBits(Servo_J6_PORT, Servo_J6_PIN );                //将舵机接口电平置高
                }
                else
                {
                        GPIO_ResetBits(Servo_J6_PORT, Servo_J6_PIN );                //将舵机接口电平置高
                }
                #endif
               

                if(num == 2000) //2000*10=20ms  20ms一个周期
                {
                        num = 0;
                }
               
        }
}

问一下这段代码的逻辑和目的是什么,#ifdef 和#endif又是什么意思
最佳答案
2024-1-16 15:40:10
在STM32中使用中断函数时,需要先配置相关的中断向量和优先级,并在初始化时使能中断。以下是一个示例代码:

  1. #include "stm32f4xx.h"

  2. void TIM1_UP_IRQHandler(void)
  3. {
  4.     if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)
  5.     {
  6.         TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
  7.         // 处理中断事件
  8.     }
  9. }

  10. int main(void)
  11. {
  12.     // 初始化代码
  13.    
  14.     NVIC_InitTypeDef NVIC_InitStructure;
  15.    
  16.     // 配置中断向量表
  17.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  // 设置优先级分组为2位抢占优先级,2位响应优先级
  18.    
  19.     // 配置中断优先级
  20.     NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
  21.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  // 抢占优先级为0
  22.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  // 响应优先级为0
  23.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  24.     NVIC_Init(&NVIC_InitStructure);
  25.    
  26.     // 使能定时器中断
  27.     TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);

  28.     while (1)
  29.     {
  30.         // 主循环代码
  31.     }
  32. }
复制代码


以上代码中,需要根据实际情况修改中断处理函数`TIM1_UP_IRQHandler`中的内容。在该函数中,可以对中断事件进行处理。在主循环中可以执行其他任务。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-16 15:40:10 | 显示全部楼层    本楼为最佳答案   
在STM32中使用中断函数时,需要先配置相关的中断向量和优先级,并在初始化时使能中断。以下是一个示例代码:

  1. #include "stm32f4xx.h"

  2. void TIM1_UP_IRQHandler(void)
  3. {
  4.     if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)
  5.     {
  6.         TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
  7.         // 处理中断事件
  8.     }
  9. }

  10. int main(void)
  11. {
  12.     // 初始化代码
  13.    
  14.     NVIC_InitTypeDef NVIC_InitStructure;
  15.    
  16.     // 配置中断向量表
  17.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  // 设置优先级分组为2位抢占优先级,2位响应优先级
  18.    
  19.     // 配置中断优先级
  20.     NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
  21.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  // 抢占优先级为0
  22.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  // 响应优先级为0
  23.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  24.     NVIC_Init(&NVIC_InitStructure);
  25.    
  26.     // 使能定时器中断
  27.     TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);

  28.     while (1)
  29.     {
  30.         // 主循环代码
  31.     }
  32. }
复制代码


以上代码中,需要根据实际情况修改中断处理函数`TIM1_UP_IRQHandler`中的内容。在该函数中,可以对中断事件进行处理。在主循环中可以执行其他任务。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 16:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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