打印
[STM32F0]

为什么TIM6定时器延时 不起作用

[复制链接]
2049|33
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dingy|  楼主 | 2021-9-6 21:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#ifndef __TIM_H_
    #define __TIM_H_

    #include "stm32f0xx_tim.h"

    void BSP_TIM6_Init(void);

    #endif

    #include "TIM.h"

    void BSP_TIM6_Init()
    {
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);

    TIM_TimeBaseInitStructure.TIM_Period = (1000-1);
    TIM_TimeBaseInitStructure.TIM_Prescaler = (48-1);
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM6,&TIM_TimeBaseInitStructure);

    TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);

    NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
    NVIC_Init(&NVIC_InitStructure);
    TIM_Cmd(TIM6,ENABLE);

    }

    void TIM6_IRQHandler(void)
    {
    if(TIM_GetITStatus(TIM6,TIM_IT_Update) == SET)
    {
    TIM_ClearITPendingBit(TIM6,TIM_IT_Update); //清除更新中断标志位
    MotorTick_Now ++;
    }
    }

    /* Includes ------------------------------------------------------------------*/
    #include "main.h"
    /* Private typedef -----------------------------------------------------------*/

    /* Private define ------------------------------------------------------------*/
    uint32_t MotorTick_Now = 0;
    uint32_t MotorTick_Trig = 0;
    uint8_t MotorTrig_Flag = 0;

    void delay(uint32_t xms)
    {
    __IO uint32_t i, j;
    i = xms * 999;
    while(i--)
    {
    j = 47;
    while(j--);
    }
    }

    /**

        @brief Main program.
        @param None
        @retval None / int main(void) { /!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f0xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f0xx.c file */ BSP_GPIO_Init(); BSP_TIM6_Init(); SysTick_Init(8); //滴答定时器延时初始化

    // __set_PRIMASK(1);

    /* Infinite loop */

    while(1)
    {
    if(GPIO_ReadInputDataBit(INPUT_Port,SW_Pin) == SET )

    {
    GPIO_ResetBits(JK_Port,JK_Pin);
    }
    else
    {
    if(GPIO_ReadInputDataBit(INPUT_Port, DS_Pin) == RESET)
    {
    MotorTrig_Flag = 1;
    }
    if(MotorTrig_Flag == 1)
    {
    GPIO_ResetBits(JK_Port, JK_Pin);
    MotorTick_Trig = 0;

                if(GPIO_ReadInputDataBit(SWs_Port, GPIO_Pin_2) ==0)
                {
                    MotorTick_Trig = 1000 * 10;
                }
                if(GPIO_ReadInputDataBit(SWs_Port, GPIO_Pin_3) ==0)
                {
                    MotorTick_Trig += 1000 * 60 * 2;
                }
                if(GPIO_ReadInputDataBit(SWs_Port, GPIO_Pin_4) == 0)
                {
                    MotorTick_Trig += 1000 * 60 * 4;
                }
                if(GPIO_ReadInputDataBit(SWs_Port, GPIO_Pin_5) == 0)
                {
                    MotorTick_Trig += 1000 * 60 * 8;
                }
                if(GPIO_ReadInputDataBit(SWs_Port, GPIO_Pin_6) == 0)
                {
                    MotorTick_Trig += 1000 * 60 * 16;
                }
                if(GPIO_ReadInputDataBit(SWs_Port, GPIO_Pin_7) == 0)
                {
                    MotorTick_Trig += 1000 * 60 * 32;
                }
                if(MotorTick_Now <= MotorTick_Trig)
                {
                    GPIO_SetBits(JK_Port, JK_Pin);    //引脚输出1  继电器吸合
                }
            }
            else
            {
             MotorTick_Trig = 0;
            }
             GPIO_SetBits(JK_Port,JK_Pin);
            if(GPIO_ReadInputDataBit(INPUT_Port, DS_Pin) == RESET)          //压力
            {              
              GPIO_ResetBits(JK_Port, JK_Pin);
            }

             if(GPIO_ReadInputDataBit(INPUT_Port, WS_Pin) == SET)    //液位
            {
                GPIO_ResetBits(JK_Port, JK_Pin);
            }

         if(GPIO_ReadInputDataBit(INPUT_Port, DK_Pin) == RESET)    //强制启动
            {
                GPIO_SetBits(JK_Port, JK_Pin);
            }
        }


        Delay_ms(10); //滴答定时器延时
       // delay(10);    //while延时

    // Delay_ms(10); //滴答定时器延时

      }

    }

使用特权

评论回复
沙发
zwll| | 2021-9-6 21:43 | 只看该作者
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
  你这两个什么鬼??

使用特权

评论回复
板凳
dingy|  楼主 | 2021-9-6 21:45 | 只看该作者
设置时钟分割:TDTS = Tck_tim
TIM向上计数模式

使用特权

评论回复
地板
dingy|  楼主 | 2021-9-6 21:48 | 只看该作者
初始化 是之前看网上 自己修改的

使用特权

评论回复
5
shimx| | 2021-9-6 21:50 | 只看该作者
你这定义的两个变量名是一样的,还没看出来??

使用特权

评论回复
6
dingy|  楼主 | 2021-9-6 21:52 | 只看该作者
我已改过来,试了一下 还是进入不了延时 ,延时 是想二进制 时间可叠加

使用特权

评论回复
7
liliang9554| | 2021-9-6 21:54 | 只看该作者
定时器中断进不了吗?

使用特权

评论回复
8
zhaoxqi| | 2021-9-6 21:58 | 只看该作者
前面定义的delay()====后面怎么来了个Delay_ms()

使用特权

评论回复
9
dingy|  楼主 | 2021-9-6 22:00 | 只看该作者
一个 delay(10);    //while延时
     Delay_ms(10); //滴答定时器延时

使用特权

评论回复
10
huangchui| | 2021-9-6 22:03 | 只看该作者
主函数里的逻辑不对吧

使用特权

评论回复
11
jlyuan| | 2021-9-6 22:05 | 只看该作者
定时器的中断应该能进吧?

使用特权

评论回复
12
chuxh| | 2021-9-6 22:06 | 只看该作者
先测一下中断能否进入!

使用特权

评论回复
13
pengf| | 2021-9-6 22:09 | 只看该作者
不进中断的判断条件是什么,就是你怎么确定没有进入中断?

使用特权

评论回复
14
xxrs| | 2021-9-6 22:12 | 只看该作者
例如后面几个操作都是怎么定义的,几个if

使用特权

评论回复
15
wyjie| | 2021-9-6 22:15 | 只看该作者
强烈建议你基于现有最新的 Cube库开着手编程,毕竟你是新手。

使用特权

评论回复
16
supernan| | 2021-9-6 22:17 | 只看该作者
以你现状来看,借助调试工具看看定时器是否启动、相关中断是否使能

使用特权

评论回复
17
dengdc| | 2021-9-6 22:23 | 只看该作者
再就是检查下.s启动文件是否选择正确。

使用特权

评论回复
18
dingy|  楼主 | 2021-9-6 22:26 | 只看该作者
  if 判断的是 引脚是否被拉低

使用特权

评论回复
19
dingy|  楼主 | 2021-9-6 22:28 | 只看该作者
别的都测过了  唯独中断进不去

使用特权

评论回复
20
dingy|  楼主 | 2021-9-6 22:32 | 只看该作者
  别的都可以 就是中断进不去 换了TIM7 也不行

使用特权

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

本版积分规则

745

主题

10920

帖子

6

粉丝