[STM32] 求教,stm32f103,程序在keil5中仿真可以输出四路波形,但烧到核心板上只有一路输出

[复制链接]
338|4
 楼主 | 2019-5-14 15:56 | 显示全部楼层 |阅读模式
用的stm32f103c8t6最小系统板,用tim1 高级定时器控制四路步进电机,最后在keil5自带的仿真里可以输出正常的四路波形,但将程序考到板子上,就只有定时器的最后一个引脚有输出,其他引脚没有输出




求教,这是什么玄学问题!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

使用特权

评论回复
 楼主 | 2019-5-14 15:59 | 显示全部楼层
  1. //main.c
  2. #include "stm32F10x.h"
  3. #include "bsp_Tim.h"
  4. #include "calculate.h"
  5. #include "bsp_key.h"
  6. #include "logic.h"
  7. #include "runing_status.h"

  8. int main (void)
  9. {
  10.         extern int status;
  11.        
  12.         OUTPUT_CONFIG();                                                                                                                //方波输出配置
  13.         POSITIVE_REVERAL_GPIO_Config();                                                        //正反转端口配置
  14.         Startup_Funcation();
  15.         while(1)
  16.         {
  17.                 if (Key_Scan(UP_KEY_PORT,UP_KEY_Pin)==KEY_ON)        
  18.         {
  19.                 status=start;
  20.                
  21. }       
  22.                 if (Key_Scan(DWN_KEY_PORT,DWN_KEY_Pin)==KEY_ON)         status=stop;
  23.         }
  24. }

复制代码

使用特权

评论回复
 楼主 | 2019-5-14 16:01 | 显示全部楼层
  1.         extern int                 Left_Hip_STEP ;
  2.         extern int                Left_Knee_STEP;
  3.         extern int                Right_Hip_STEP;
  4.         extern int                Right_Knee_STEP;
  5.        
  6.         int                 Moment_Left_Hip_STEP ;
  7.         int                        Moment_Left_Knee_STEP;
  8.         int                        Moment_Right_Hip_STEP;
  9.         int                        Moment_Right_Knee_STEP;
  10.        
  11.         extern int                 Left_Hip_PULSE ;
  12.         extern int                Left_Knee_PULSE;
  13.         extern int                Right_Hip_PULSE;
  14.         extern int                Right_Knee_PULSE;
  15.        
  16. void TIM1_CC_IRQHandler(void)
  17. {
  18.         TIM_OCInitTypeDef TIM_OCInitStructure;       
  19.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
  20. /*。。。。。。。.。。。。左骻。。。。。。。。。。。。*/
  21.         if(TIM_GetITStatus(ADVANCE_TIM,TIM_WF1_ITCC)!=RESET)                        //判断中断位置
  22.         {
  23.                 TIM_ClearITPendingBit(ADVANCE_TIM,TIM_WF1_ITCC);                                //清楚中断标记       
  24.                 if(Moment_Left_Hip_STEP==Left_Hip_STEP)                                                                        //如果达到指定位置,输出停止,否则继续运行
  25.                 {
  26.                         TIM_OC1Init(ADVANCE_TIM, &TIM_OCInitStructure);
  27.                         Moment_Left_Hip_STEP=0;                                                                                                                                //实际步数清0                                                                       
  28.                 }       
  29.                 else                                                                                                                                                                                                               
  30.                 {
  31.                         TIM_SetCompare1(ADVANCE_TIM,(ADVANCE_TIM->CNT +Left_Hip_PULSE)%0XFFFF);
  32.                         Moment_Left_Hip_STEP++;
  33.                 }
  34.   }
  35. /*。。。。。。。.。。。。左膝。。。。。。。。。。。。*/       
  36.         if(TIM_GetITStatus(ADVANCE_TIM,TIM_WF2_ITCC)!=RESET)                        //判断中断位置
  37.         {
  38.                 TIM_ClearITPendingBit(ADVANCE_TIM,TIM_WF2_ITCC);                                //清楚中断标记
  39.                 if(Moment_Left_Knee_STEP==Left_Knee_STEP)                                                                        //如果达到指定位置,输出停止,否则继续运行
  40.                 {
  41.                         TIM_OC2Init(ADVANCE_TIM, &TIM_OCInitStructure);
  42.                         Moment_Left_Knee_STEP=0;                                                                                                                                //实际步数清0                                                                       
  43.                 }       
  44.                 else                                                                                                                                                                                                               
  45.                 {
  46.                         TIM_SetCompare2(ADVANCE_TIM,(ADVANCE_TIM->CNT +Left_Knee_PULSE)%0XFFFF);
  47.                         Moment_Left_Knee_STEP++;
  48.                 }
  49.   }
  50. /*。。。。。。。.。。。。右骻。。。。。。。。。。。。*/               
  51.         if(TIM_GetITStatus(ADVANCE_TIM,TIM_WF3_ITCC)!=RESET)                        //判断中断位置
  52.         {
  53.                 TIM_ClearITPendingBit(ADVANCE_TIM,TIM_WF3_ITCC);                                //清楚中断标记
  54.                 if(Moment_Right_Hip_STEP==Right_Hip_STEP)                                                                        //如果达到指定位置,输出停止,否则继续运行
  55.                 {
  56.                         TIM_OC3Init(ADVANCE_TIM, &TIM_OCInitStructure);
  57.                         Moment_Right_Hip_STEP=0;                                                                                                                                //实际步数清0                                                                       
  58.                 }       
  59.                 else                                                                                                                                                                                                               
  60.                 {
  61.                         TIM_SetCompare3(ADVANCE_TIM,(ADVANCE_TIM->CNT +Right_Hip_PULSE)%0XFFFF);
  62.                         Moment_Right_Hip_STEP++;
  63.                 }
  64.   }
  65. /*。。。。。。。.。。。。右膝。。。。。。。。。。。。*/               
  66.         if(TIM_GetITStatus(ADVANCE_TIM,TIM_WF4_ITCC)!=RESET)                        //判断中断位置
  67.         {
  68.                 TIM_ClearITPendingBit(ADVANCE_TIM,TIM_WF4_ITCC);                                //清楚中断标记
  69.                 if(Moment_Right_Knee_STEP==Right_Knee_STEP)                                                                        //如果达到指定位置,输出停止,否则继续运行
  70.                 {
  71.                         TIM_OC4Init(ADVANCE_TIM, &TIM_OCInitStructure);
  72.                         Moment_Right_Knee_STEP=0;                                                                                                                                //实际步数清0                                                                       
  73.                 }       
  74.                 else                                                                                                                                                                                                               
  75.                 {
  76.                         TIM_SetCompare4(ADVANCE_TIM,(ADVANCE_TIM->CNT +Right_Knee_PULSE)%0XFFFF);
  77.                         Moment_Right_Knee_STEP++;
  78.                 }
  79.   }
  80.        
  81.         if(Moment_Left_Hip_STEP==0&&Moment_Left_Knee_STEP==0&&Moment_Right_Hip_STEP==0&&Moment_Right_Knee_STEP==0)
  82.                 {
  83.                          Status_Config();
  84.                 }
  85. }
复制代码

使用特权

评论回复
 楼主 | 2019-5-14 16:02 | 显示全部楼层
  1. #include "bsp_Tim.h"

  2. /*。。。。。。。。。。信号输出通道设置。。。。。。。。。。。。。。。

  3.                                 TIM_GPIO_CLK                                      RCC_APB2Periph_GPIOA
  4.                                 TIM_PORT                                          GPIOA
  5.                                 TIM_WF1_CH_PIN                  GPIO_Pin_8           //左骻
  6.                                 TIM_WF2_CH_PIN                  GPIO_Pin_9                                         //左膝
  7.                                 TIM_WF3_CH_PIN                  GPIO_Pin_10                                         //右骻
  8.                                 TIM_WF4_CH_PIN                  GPIO_Pin_11                                         //右膝

  9. 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。*/
  10. static void TIM_GPIO_Config(void)
  11. {
  12.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  13.         GPIO_InitTypeDef GPIO_InitStructure;
  14.         /*GPIOA_PIN8通道初始化设置*/
  15.   GPIO_InitStructure.GPIO_Pin = TIM_WF1_CH_PIN;
  16.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  17.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  18.   GPIO_Init(TIM_PORT, &GPIO_InitStructure);
  19.        
  20.         /*GPIOA_PIN9通道初始化设置*/
  21.         GPIO_InitStructure.GPIO_Pin = TIM_WF2_CH_PIN;
  22.         GPIO_Init(TIM_PORT, &GPIO_InitStructure);
  23.        
  24.         /*GPIOA_PIN10通道初始化设置*/
  25.         GPIO_InitStructure.GPIO_Pin = TIM_WF3_CH_PIN;
  26.         GPIO_Init(TIM_PORT, &GPIO_InitStructure);
  27.        
  28.         /*GPIOB_PIN11通道初始化设置*/
  29.         GPIO_InitStructure.GPIO_Pin = TIM_WF4_CH_PIN;
  30.         GPIO_Init(TIM_PORT, &GPIO_InitStructure);

  31. }


  32. /*。。。。。。。。定时器初始化配置。。。。。。。。。。。。。。。。。。。。。。
  33.                         主要参数:ADVANCE_TIM,                                                        ADVANCE_TIM_APBxClock_FUN,               
  34.                                                                 TIM_CLK TIM_PERIOD,                                TIM_PSC,
  35.                                                                 TIM_WF1_ITCC,                                                        TIM_WF2_ITCC,
  36.                                                                 TIM_WF3_ITCC,                                                        TIM_WF4_ITCC
  37. 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。*/

  38. static void TIM_Mode_Config(void)
  39. {
  40.         /*开启定时器内部时钟*/
  41.         ADVANCE_TIM_APBxClock_FUN(TIM_CLK,ENABLE);
  42.        
  43.         /*--------------------时基结构体初始化-------------------------*/
  44.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  45.         // 自动重装载寄存器的值,没有用到
  46.         TIM_TimeBaseStructure.TIM_Period=TIM_PERIOD ;
  47.         // 驱动CNT计数器的时钟 = Fck_int/(psc+1)
  48.         TIM_TimeBaseStructure.TIM_Prescaler= TIM_PSC ;
  49.         // 时钟分频因子 ,配置死区时间时需要用到
  50.         TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;               
  51.         // 计数器计数模式,设置为向上计数
  52.         TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;               
  53.         // 重复计数器的值,没用到不用管
  54.         TIM_TimeBaseStructure.TIM_RepetitionCounter=0;       
  55.         // 初始化定时器
  56.         TIM_TimeBaseInit(ADVANCE_TIM, &TIM_TimeBaseStructure);
  57.        
  58.        
  59. /*--------------------输出比较结构体初始化-------------------*/               
  60.         TIM_OCInitTypeDef TIM_OCInitStructure;
  61.         //设置输出模式为比较输出模式
  62.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
  63.         //输出使能
  64.         TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable;
  65.         // 输出通道电平极性配置
  66.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  67.         // 输出通道空闲电平极性配置
  68.         TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  69.         TIM_OC1Init(ADVANCE_TIM, &TIM_OCInitStructure);                        //配置CH1通道
  70.         TIM_OC1PreloadConfig(ADVANCE_TIM,TIM_OCPreload_Disable);  //预加载寄存器配置
  71.        
  72.         TIM_OC2Init(ADVANCE_TIM, &TIM_OCInitStructure);
  73.         TIM_OC2PreloadConfig(ADVANCE_TIM,TIM_OCPreload_Disable);
  74.        
  75.         TIM_OC3Init(ADVANCE_TIM, &TIM_OCInitStructure);
  76.         TIM_OC3PreloadConfig(ADVANCE_TIM,TIM_OCPreload_Disable);
  77.        
  78.         TIM_OC4Init(ADVANCE_TIM, &TIM_OCInitStructure);
  79.         TIM_OC4PreloadConfig(ADVANCE_TIM,TIM_OCPreload_Disable);
  80.        
  81.         //使能计数器
  82.         TIM_Cmd(ADVANCE_TIM, ENABLE);               
  83. //        //主输出使能
  84.         TIM_CtrlPWMOutputs(ADVANCE_TIM, ENABLE);
  85. }

  86. /*。。。。。。。。。。。。。。定时器中断配置。。。。。。。。。。。。。。。。



  87. .........................................................................*/

  88. static void TIM_IRQ_Config(void)
  89. {
  90. /*。。。。输出比较通道中断使能。。。。。*/
  91.         TIM_ITConfig(ADVANCE_TIM,TIM_WF1_ITCC,ENABLE);
  92.         TIM_ITConfig(ADVANCE_TIM,TIM_WF2_ITCC,ENABLE);
  93.         TIM_ITConfig(ADVANCE_TIM,TIM_WF3_ITCC,ENABLE);
  94.         TIM_ITConfig(ADVANCE_TIM,TIM_WF4_ITCC,ENABLE);       

  95. /*。。。。。。中断结构体初始化。。。。。。。。*/
  96.         NVIC_InitTypeDef  NVIC_InitStruct;
  97.        
  98.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  99.        
  100.         NVIC_InitStruct.NVIC_IRQChannel =TIM1_CC_IRQn;
  101.         NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE ;
  102.         NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
  103.         NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
  104.         NVIC_Init (&NVIC_InitStruct);
  105.        
  106. }

  107. void OUTPUT_CONFIG(void)
  108. {
  109.         TIM_GPIO_Config();
  110.         TIM_Mode_Config();
  111.         TIM_IRQ_Config();
  112. }

复制代码

使用特权

评论回复
| 2019-7-29 17:44 | 显示全部楼层
一定要用高级定时器吗?换个其他的定时器试试

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /2 下一条

在线客服 快速回复 返回顶部 返回列表