打印
[STM32]

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

[复制链接]
1166|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tianyu455|  楼主 | 2019-5-14 15:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用的stm32f103c8t6最小系统板,用tim1 高级定时器控制四路步进电机,最后在keil5自带的仿真里可以输出正常的四路波形,但将程序考到板子上,就只有定时器的最后一个引脚有输出,其他引脚没有输出




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

使用特权

评论回复

相关帖子

沙发
tianyu455|  楼主 | 2019-5-14 15:59 | 只看该作者
//main.c
#include "stm32F10x.h"
#include "bsp_Tim.h"
#include "calculate.h"
#include "bsp_key.h"
#include "logic.h"
#include "runing_status.h"

int main (void)
{
        extern int status;
       
        OUTPUT_CONFIG();                                                                                                                //方波输出配置
        POSITIVE_REVERAL_GPIO_Config();                                                        //正反转端口配置
        Startup_Funcation();
        while(1)
        {
                if (Key_Scan(UP_KEY_PORT,UP_KEY_Pin)==KEY_ON)        
        {
                status=start;
               
}       
                if (Key_Scan(DWN_KEY_PORT,DWN_KEY_Pin)==KEY_ON)         status=stop;
        }
}

使用特权

评论回复
板凳
tianyu455|  楼主 | 2019-5-14 16:01 | 只看该作者
        extern int                 Left_Hip_STEP ;
        extern int                Left_Knee_STEP;
        extern int                Right_Hip_STEP;
        extern int                Right_Knee_STEP;
       
        int                 Moment_Left_Hip_STEP ;
        int                        Moment_Left_Knee_STEP;
        int                        Moment_Right_Hip_STEP;
        int                        Moment_Right_Knee_STEP;
       
        extern int                 Left_Hip_PULSE ;
        extern int                Left_Knee_PULSE;
        extern int                Right_Hip_PULSE;
        extern int                Right_Knee_PULSE;
       
void TIM1_CC_IRQHandler(void)
{
        TIM_OCInitTypeDef TIM_OCInitStructure;       
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
/*。。。。。。。.。。。。左骻。。。。。。。。。。。。*/
        if(TIM_GetITStatus(ADVANCE_TIM,TIM_WF1_ITCC)!=RESET)                        //判断中断位置
        {
                TIM_ClearITPendingBit(ADVANCE_TIM,TIM_WF1_ITCC);                                //清楚中断标记       
                if(Moment_Left_Hip_STEP==Left_Hip_STEP)                                                                        //如果达到指定位置,输出停止,否则继续运行
                {
                        TIM_OC1Init(ADVANCE_TIM, &TIM_OCInitStructure);
                        Moment_Left_Hip_STEP=0;                                                                                                                                //实际步数清0                                                                       
                }       
                else                                                                                                                                                                                                               
                {
                        TIM_SetCompare1(ADVANCE_TIM,(ADVANCE_TIM->CNT +Left_Hip_PULSE)%0XFFFF);
                        Moment_Left_Hip_STEP++;
                }
  }
/*。。。。。。。.。。。。左膝。。。。。。。。。。。。*/       
        if(TIM_GetITStatus(ADVANCE_TIM,TIM_WF2_ITCC)!=RESET)                        //判断中断位置
        {
                TIM_ClearITPendingBit(ADVANCE_TIM,TIM_WF2_ITCC);                                //清楚中断标记
                if(Moment_Left_Knee_STEP==Left_Knee_STEP)                                                                        //如果达到指定位置,输出停止,否则继续运行
                {
                        TIM_OC2Init(ADVANCE_TIM, &TIM_OCInitStructure);
                        Moment_Left_Knee_STEP=0;                                                                                                                                //实际步数清0                                                                       
                }       
                else                                                                                                                                                                                                               
                {
                        TIM_SetCompare2(ADVANCE_TIM,(ADVANCE_TIM->CNT +Left_Knee_PULSE)%0XFFFF);
                        Moment_Left_Knee_STEP++;
                }
  }
/*。。。。。。。.。。。。右骻。。。。。。。。。。。。*/               
        if(TIM_GetITStatus(ADVANCE_TIM,TIM_WF3_ITCC)!=RESET)                        //判断中断位置
        {
                TIM_ClearITPendingBit(ADVANCE_TIM,TIM_WF3_ITCC);                                //清楚中断标记
                if(Moment_Right_Hip_STEP==Right_Hip_STEP)                                                                        //如果达到指定位置,输出停止,否则继续运行
                {
                        TIM_OC3Init(ADVANCE_TIM, &TIM_OCInitStructure);
                        Moment_Right_Hip_STEP=0;                                                                                                                                //实际步数清0                                                                       
                }       
                else                                                                                                                                                                                                               
                {
                        TIM_SetCompare3(ADVANCE_TIM,(ADVANCE_TIM->CNT +Right_Hip_PULSE)%0XFFFF);
                        Moment_Right_Hip_STEP++;
                }
  }
/*。。。。。。。.。。。。右膝。。。。。。。。。。。。*/               
        if(TIM_GetITStatus(ADVANCE_TIM,TIM_WF4_ITCC)!=RESET)                        //判断中断位置
        {
                TIM_ClearITPendingBit(ADVANCE_TIM,TIM_WF4_ITCC);                                //清楚中断标记
                if(Moment_Right_Knee_STEP==Right_Knee_STEP)                                                                        //如果达到指定位置,输出停止,否则继续运行
                {
                        TIM_OC4Init(ADVANCE_TIM, &TIM_OCInitStructure);
                        Moment_Right_Knee_STEP=0;                                                                                                                                //实际步数清0                                                                       
                }       
                else                                                                                                                                                                                                               
                {
                        TIM_SetCompare4(ADVANCE_TIM,(ADVANCE_TIM->CNT +Right_Knee_PULSE)%0XFFFF);
                        Moment_Right_Knee_STEP++;
                }
  }
       
        if(Moment_Left_Hip_STEP==0&&Moment_Left_Knee_STEP==0&&Moment_Right_Hip_STEP==0&&Moment_Right_Knee_STEP==0)
                {
                         Status_Config();
                }
}

使用特权

评论回复
地板
tianyu455|  楼主 | 2019-5-14 16:02 | 只看该作者
#include "bsp_Tim.h"

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

                                TIM_GPIO_CLK                                      RCC_APB2Periph_GPIOA
                                TIM_PORT                                          GPIOA
                                TIM_WF1_CH_PIN                  GPIO_Pin_8           //左骻
                                TIM_WF2_CH_PIN                  GPIO_Pin_9                                         //左膝
                                TIM_WF3_CH_PIN                  GPIO_Pin_10                                         //右骻
                                TIM_WF4_CH_PIN                  GPIO_Pin_11                                         //右膝

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。*/
static void TIM_GPIO_Config(void)
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        GPIO_InitTypeDef GPIO_InitStructure;
        /*GPIOA_PIN8通道初始化设置*/
  GPIO_InitStructure.GPIO_Pin = TIM_WF1_CH_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(TIM_PORT, &GPIO_InitStructure);
       
        /*GPIOA_PIN9通道初始化设置*/
        GPIO_InitStructure.GPIO_Pin = TIM_WF2_CH_PIN;
        GPIO_Init(TIM_PORT, &GPIO_InitStructure);
       
        /*GPIOA_PIN10通道初始化设置*/
        GPIO_InitStructure.GPIO_Pin = TIM_WF3_CH_PIN;
        GPIO_Init(TIM_PORT, &GPIO_InitStructure);
       
        /*GPIOB_PIN11通道初始化设置*/
        GPIO_InitStructure.GPIO_Pin = TIM_WF4_CH_PIN;
        GPIO_Init(TIM_PORT, &GPIO_InitStructure);

}


/*。。。。。。。。定时器初始化配置。。。。。。。。。。。。。。。。。。。。。。
                        主要参数:ADVANCE_TIM,                                                        ADVANCE_TIM_APBxClock_FUN,               
                                                                TIM_CLK TIM_PERIOD,                                TIM_PSC,
                                                                TIM_WF1_ITCC,                                                        TIM_WF2_ITCC,
                                                                TIM_WF3_ITCC,                                                        TIM_WF4_ITCC
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。*/

static void TIM_Mode_Config(void)
{
        /*开启定时器内部时钟*/
        ADVANCE_TIM_APBxClock_FUN(TIM_CLK,ENABLE);
       
        /*--------------------时基结构体初始化-------------------------*/
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        // 自动重装载寄存器的值,没有用到
        TIM_TimeBaseStructure.TIM_Period=TIM_PERIOD ;
        // 驱动CNT计数器的时钟 = Fck_int/(psc+1)
        TIM_TimeBaseStructure.TIM_Prescaler= TIM_PSC ;
        // 时钟分频因子 ,配置死区时间时需要用到
        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;               
        // 计数器计数模式,设置为向上计数
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;               
        // 重复计数器的值,没用到不用管
        TIM_TimeBaseStructure.TIM_RepetitionCounter=0;       
        // 初始化定时器
        TIM_TimeBaseInit(ADVANCE_TIM, &TIM_TimeBaseStructure);
       
       
/*--------------------输出比较结构体初始化-------------------*/               
        TIM_OCInitTypeDef TIM_OCInitStructure;
        //设置输出模式为比较输出模式
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
        //输出使能
        TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable;
        // 输出通道电平极性配置
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
        // 输出通道空闲电平极性配置
        TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
        TIM_OC1Init(ADVANCE_TIM, &TIM_OCInitStructure);                        //配置CH1通道
        TIM_OC1PreloadConfig(ADVANCE_TIM,TIM_OCPreload_Disable);  //预加载寄存器配置
       
        TIM_OC2Init(ADVANCE_TIM, &TIM_OCInitStructure);
        TIM_OC2PreloadConfig(ADVANCE_TIM,TIM_OCPreload_Disable);
       
        TIM_OC3Init(ADVANCE_TIM, &TIM_OCInitStructure);
        TIM_OC3PreloadConfig(ADVANCE_TIM,TIM_OCPreload_Disable);
       
        TIM_OC4Init(ADVANCE_TIM, &TIM_OCInitStructure);
        TIM_OC4PreloadConfig(ADVANCE_TIM,TIM_OCPreload_Disable);
       
        //使能计数器
        TIM_Cmd(ADVANCE_TIM, ENABLE);               
//        //主输出使能
        TIM_CtrlPWMOutputs(ADVANCE_TIM, ENABLE);
}

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



.........................................................................*/

static void TIM_IRQ_Config(void)
{
/*。。。。输出比较通道中断使能。。。。。*/
        TIM_ITConfig(ADVANCE_TIM,TIM_WF1_ITCC,ENABLE);
        TIM_ITConfig(ADVANCE_TIM,TIM_WF2_ITCC,ENABLE);
        TIM_ITConfig(ADVANCE_TIM,TIM_WF3_ITCC,ENABLE);
        TIM_ITConfig(ADVANCE_TIM,TIM_WF4_ITCC,ENABLE);       

/*。。。。。。中断结构体初始化。。。。。。。。*/
        NVIC_InitTypeDef  NVIC_InitStruct;
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
       
        NVIC_InitStruct.NVIC_IRQChannel =TIM1_CC_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE ;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
        NVIC_Init (&NVIC_InitStruct);
       
}

void OUTPUT_CONFIG(void)
{
        TIM_GPIO_Config();
        TIM_Mode_Config();
        TIM_IRQ_Config();
}

使用特权

评论回复
5
kit7828| | 2019-7-29 17:44 | 只看该作者
一定要用高级定时器吗?换个其他的定时器试试

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝