OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4115|回复: 4

F103VE 的Timer1可以用的程序,Timer8不能用

[复制链接]

1

主题

7

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2022-5-16
在线时间
2 小时
发表于 2022-5-16 21:24:35 | 显示全部楼层 |阅读模式
3金钱


大家好,同一段程序,通过头文件更改,Timer1 仿真可以出波形,但是改成Timer8就不可以,哪里错了呢??感谢赐教!!
如下是Timer1 仿真波形.


如下Timer8的仿真波形

#ifndef __BSP_ADVANCETIME_H
#define __BSP_ADVANCETIME_H

#include "stm32f10x.h"


/************高级定时器TIM参数定义,只限TIM1和TIM8************/
// 当使用不同的定时器的时候,对应的GPIO是不一样的,这点要注意
// 这里我们使用高级控制定时器TIM1


#if 0
#define            ADVANCE_TIM                   TIM1
#define            ADVANCE_TIM_APBxClock_FUN     RCC_APB2PeriphClockCmd
#define            ADVANCE_TIM_CLK               RCC_APB2Periph_TIM1
// PWM 信号的频率 F = TIM_CLK/{(ARR+1)*(PSC+1)}
#define            ADVANCE_TIM_PERIOD            (8-1)
#define            ADVANCE_TIM_PSC               (9-1)
#define            ADVANCE_TIM_PULSE             4

//#define            ADVANCE_TIM_IRQ               TIM1_UP_IRQn
//#define            ADVANCE_TIM_IRQHandler        TIM1_UP_IRQHandler

// TIM1 输出比较通道
#define            ADVANCE_TIM_CH1_GPIO_CLK      RCC_APB2Periph_GPIOA
#define            ADVANCE_TIM_CH1_PORT          GPIOA
#define            ADVANCE_TIM_CH1_PIN           GPIO_Pin_8

// TIM1 输出比较通道的互补通道
#define            ADVANCE_TIM_CH1N_GPIO_CLK      RCC_APB2Periph_GPIOB
#define            ADVANCE_TIM_CH1N_PORT          GPIOB
#define            ADVANCE_TIM_CH1N_PIN           GPIO_Pin_13

// TIM1 输出比较通道的刹车通道
#define            ADVANCE_TIM_BKIN_GPIO_CLK      RCC_APB2Periph_GPIOB
#define            ADVANCE_TIM_BKIN_PORT          GPIOB
#define            ADVANCE_TIM_BKIN_PIN           GPIO_Pin_12
#endif


//TIM8
#if 1
#define            ADVANCE_TIM                   TIM8
#define            ADVANCE_TIM_APBxClock_FUN     RCC_APB2PeriphClockCmd
#define            ADVANCE_TIM_CLK               RCC_APB2Periph_TIM8
// PWM 信号的频率 F = TIM_CLK/{(ARR+1)*(PSC+1)}
#define            ADVANCE_TIM_PERIOD            (8-1)
#define            ADVANCE_TIM_PSC               (9-1)
#define            ADVANCE_TIM_PULSE             4

//#define            ADVANCE_TIM_IRQ               TIM8_UP_IRQn
//#define            ADVANCE_TIM_IRQHandler        TIM8_UP_IRQHandler

// TIM8 输出比较通道
#define            ADVANCE_TIM_CH1_GPIO_CLK      RCC_APB2Periph_GPIOC
#define            ADVANCE_TIM_CH1_PORT          GPIOC
#define            ADVANCE_TIM_CH1_PIN           GPIO_Pin_6

// TIM8 输出比较通道的互补通道
#define            ADVANCE_TIM_CH1N_GPIO_CLK      RCC_APB2Periph_GPIOA
#define            ADVANCE_TIM_CH1N_PORT          GPIOA
#define            ADVANCE_TIM_CH1N_PIN           GPIO_Pin_7

// TIM8 输出比较通道的刹车通道
#define            ADVANCE_TIM_BKIN_GPIO_CLK      RCC_APB2Periph_GPIOA
#define            ADVANCE_TIM_BKIN_PORT          GPIOA
#define            ADVANCE_TIM_BKIN_PIN           GPIO_Pin_6
#endif

void ADVANCE_TIM_Init(void);

#endif        /* __BSP_ADVANCETIME_H */

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。#include "bsp_AdvanceTim.h"

static void ADVANCE_TIM_GPIO_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;

  // 输出比较通道 GPIO 初始化 | RCC_APB2Periph_AFIO
        RCC_APB2PeriphClockCmd(ADVANCE_TIM_CH1_GPIO_CLK , ENABLE);
  GPIO_InitStructure.GPIO_Pin =  ADVANCE_TIM_CH1_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(ADVANCE_TIM_CH1_PORT, &GPIO_InitStructure);

  // 输出比较通道互补通道 GPIO 初始化
        RCC_APB2PeriphClockCmd(ADVANCE_TIM_CH1N_GPIO_CLK, ENABLE);
  GPIO_InitStructure.GPIO_Pin =  ADVANCE_TIM_CH1N_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(ADVANCE_TIM_CH1N_PORT, &GPIO_InitStructure);

  // 输出比较通道刹车通道 GPIO 初始化
        RCC_APB2PeriphClockCmd(ADVANCE_TIM_BKIN_GPIO_CLK, ENABLE);
  GPIO_InitStructure.GPIO_Pin =  ADVANCE_TIM_BKIN_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(ADVANCE_TIM_BKIN_PORT, &GPIO_InitStructure);
        // BKIN引脚默认先输出低电平
        GPIO_ResetBits(ADVANCE_TIM_BKIN_PORT,ADVANCE_TIM_BKIN_PIN);
}

// ANSIC C  C89 C语言的标准的话
// C99 支持任意地方定义变量
// C11 这个是最新的C语言标准
static void ADVANCE_TIM_Mode_Config(void)
{
        // 开启定时器时钟,即内部时钟CK_INT=72M
        ADVANCE_TIM_APBxClock_FUN(ADVANCE_TIM_CLK ,ENABLE);

/*--------------------时基结构体初始化-------------------------*/
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
        TIM_TimeBaseStructure.TIM_Period=ADVANCE_TIM_PERIOD;       
        // 驱动CNT计数器的时钟 = Fck_int/(psc+1)
        TIM_TimeBaseStructure.TIM_Prescaler= ADVANCE_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;
        // 配置为PWM模式1
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
        // 输出使能
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        // 互补输出使能
        TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
        // 设置占空比大小
        TIM_OCInitStructure.TIM_Pulse = ADVANCE_TIM_PULSE;
        // 输出通道电平极性配置
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
        // 互补输出通道电平极性配置
        TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
        // 输出通道空闲电平极性配置
        TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
        // 互补输出通道空闲电平极性配置
        TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
        TIM_OC1Init(ADVANCE_TIM, &TIM_OCInitStructure);
        TIM_OC1PreloadConfig(ADVANCE_TIM, TIM_OCPreload_Enable);

        /*-------------------刹车和死区结构体初始化-------------------*/
        // 有关刹车和死区结构体的成员具体可参考BDTR寄存器的描述
        TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
  TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
  TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
  TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
        // 输出比较信号死区时间配置,具体如何计算可参考 BDTR:UTG[7:0]的描述
        // 这里配置的死区时间为152ns
  TIM_BDTRInitStructure.TIM_DeadTime = 11;
  TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;
        // 当BKIN引脚检测到高电平的时候,输出比较信号被禁止,就好像是刹车一样
  TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
  TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
  TIM_BDTRConfig(ADVANCE_TIM, &TIM_BDTRInitStructure);
       
        // 使能计数器
        TIM_Cmd(ADVANCE_TIM, ENABLE);       
        // 主输出使能,当使用的是通用定时器时,这句不需要
        TIM_CtrlPWMOutputs(ADVANCE_TIM, ENABLE);
}

void ADVANCE_TIM_Init(void)
{
        ADVANCE_TIM_GPIO_Config();
        ADVANCE_TIM_Mode_Config();
}



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

465

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1732
金钱
1732
注册时间
2021-4-11
在线时间
320 小时
发表于 2022-5-17 09:49:22 | 显示全部楼层
检查一下程序,定时器8肯定是可以输出波形的
回复

使用道具 举报

11

主题

2131

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4731
金钱
4731
注册时间
2015-1-10
在线时间
591 小时
发表于 2022-5-17 15:14:21 | 显示全部楼层
对比一下配置后的寄存器差异
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2022-5-16
在线时间
2 小时
 楼主| 发表于 2022-5-17 17:56:56 来自手机 | 显示全部楼层
本帖最后由 天天123 于 2022-5-17 20:42 编辑

我自己目前有点思维定势了,怎么也没有找到问题,三楼的思路我回去试一下,大家还有什么能指导吗,感谢感谢
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2022-5-16
在线时间
2 小时
 楼主| 发表于 2022-5-17 20:41:13 | 显示全部楼层
寄存器仿真后查看确实有差异,但是都已一套代码,只是更改了头文件宏,不得其解
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 04:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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