OpenEdv-开源电子网

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

一个定时器为另一个定时器的预分频的问题

[复制链接]

37

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
258
金钱
258
注册时间
2012-9-17
在线时间
4 小时
发表于 2012-10-16 17:59:46 | 显示全部楼层 |阅读模式
#include "stm32f10x.h"

void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void Timer_Configuration(void);

int main(void)
{
      RCC_Configuration(); 
      GPIO_Configuration(); 
      NVIC_Configuration();
      Timer_Configuration();  
      while(1);
}

void RCC_Configuration(void)
{
      ErrorStatus HSEStartUpStatus;
      RCC_DeInit();
      RCC_HSEConfig(RCC_HSE_ON);
      HSEStartUpStatus = RCC_WaitForHSEStartUp();
      if(HSEStartUpStatus == SUCCESS)
        {
           RCC_HCLKConfig(RCC_SYSCLK_Div1);
           RCC_PCLK2Config(RCC_HCLK_Div1);
           RCC_PCLK1Config(RCC_HCLK_Div2);   
           RCC_ADCCLKConfig(RCC_PCLK2_Div6);
           FLASH_SetLatency(FLASH_Latency_2);
           FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
           RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);     //PLL 72M
           RCC_PLLCmd(ENABLE);
           while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
           RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
            while(RCC_GetSYSCLKSource() != 0x08);
        }
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);   
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
}

void GPIO_Configuration(void)
{
      GPIO_InitTypeDef  GPIO_InitStruct;
      GPIO_DeInit(GPIOA);
      GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6;
      GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
      GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
      GPIO_Init(GPIOA,&GPIO_InitStruct);
}

void NVIC_Configuration(void)
{
      NVIC_InitTypeDef NVIC_InitStructure;  
      NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);  
      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
      NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&NVIC_InitStructure);
}

void Timer_Configuration(void)
{
     TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
     TIM_OCInitTypeDef          TIM_OCInitStructure;

     //配置TIMER2为主模式,更新事件作为触发输出
     TIM_DeInit(TIM2);
     TIM_TimeBaseStructure.TIM_Period=20;         //ARR的值,TIMER2的更新事件频率为100Hz
     TIM_TimeBaseStructure.TIM_Prescaler=0;
     TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //采样分频
     TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
     TIM_PrescalerConfig(TIM2,0x8C9F,TIM_PSCReloadMode_Immediate);//时钟分频系数36000,所以定时器时钟为2K
     TIM_ARRPreloadConfig(TIM2, DISABLE);//使能ARR预装载缓冲器
     TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_Update);
     TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);

     //配置TIMER3为PWM1输出模式,输出占空比50%,周期为10S的PWM波,配置TIMER3的时钟模式为外部时钟1,选择TIMER2为触发源
     TIM_DeInit(TIM3);
     TIM_ITRxExternalClockConfig(TIM3, TIM_TS_ITR1);//外部时钟模式1,触发源为TIMER2
     TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_External1);
     TIM_TimeBaseStructure.TIM_Period=1000;         //ARR的值
     TIM_TimeBaseStructure.TIM_Prescaler=0;
     TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //采样分频
     TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
     
     TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
     TIM_OCInitStructure.TIM_Pulse=500;                 //50%占空比
     TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
     TIM_OC1Init(TIM3, &TIM_OCInitStructure);
     TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
     TIM_ARRPreloadConfig(TIM3, ENABLE);//使能ARR预装载缓冲器

     TIM_Cmd(TIM3, ENABLE);    //开启时钟
     TIM_Cmd(TIM2, ENABLE);    //开启时钟
}


stm32f10x_it.c为

#include "stm32f10x_it.h"
 
void TIM2_IRQHandler(void)
{
 if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
   {
        TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
   }
}

我想实现TIM2为TIM3的预分频,TIM3的CH1输出PWM,可是总是不能输出,望高手指点!

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-10-16 21:52:33 | 显示全部楼层
可以参考下这个例子:D:\KEIL3.80A\ARM\Examples\ST\STM32F10xFWLib\Examples\TIM\Parallel_Synchro
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2012-12-27
在线时间
0 小时
发表于 2013-3-21 15:11:50 | 显示全部楼层
回复【2楼】正点原子:
可以参考下这个例子:D:\KEIL3.80A\ARM\Examples\ST\STM32F10xFWLib\Examples\TIM\Parallel_Synchro
---------------------------------
求推荐寄存器版本,论坛里也没检索到
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-23 23:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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