stm32f0设置tim2单脉冲模式-tim1内部触发

2019-08-22来源: eefocus关键字:stm32f0  tim2  单脉冲模式  tim1  内部触发

TIM2产生单脉冲时,选择TIM1的CH1的OC1REF作为内部触发信号,先设置TIM1—CR2寄存器的MMS位为001


对应标准库函数: TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_OC1Ref);


在TIM2_SMCR寄存器的TS位选择内部触发0


对应库函数:  TIM_SelectInputTrigger(TIM2, TIM_TS_ITR0);//定时器1内部触发


示波器通道1是tim2输出,通道2是tim1输出

/**************************************************************************************************************

*以下TIM1和TIM2的设置实现TIM1输出40hz,占空比7%即高电平输出180us,TIM2输出单脉冲,周期360us,占空比50%,TIM2的触发是TIM1的OC1REF信号。

TIM2设置单脉冲需设置的参数:

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;

    TIM_SelectOnePulseMode(TIM2,TIM_OPMode_Single);//单脉冲

  TIM_SelectInputTrigger(TIM2, TIM_TS_ITR0);//定时器1内部触发

  TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Trigger);

  TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_OC1Ref);//在TIM1的初始化函数中,设置TIM1->CR2的MMS位100:比较 – OC1REF 信号被用于作为触发输出 (TRGO)。


****************************************************************************************************************************************/


void TIM1_PWM_Config(FunctionalState flag)

{

   uint16_t TimerPeriod = 0,PrescalerValue = 0,time2_Channel1Pulse;

/* TIM2 的配置 ---------------------------------------------------

   SystemCoreClock 为48 MHz

定时器时钟1000000hz

输出频率40hz

占空比:7%,高脉冲180us

*/  

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

  TIM_OCInitTypeDef  TIM_OCInitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

//  TIM_BDTRInitTypeDef TIM_BDTRInitStructure; 

    /*计算预定表的值,也就是多少个时钟计数为一个周期*/

  //TimerPeriod = (SystemCoreClock / 17570 ) - 1;//17570 

  /*计算CCR1 跳转值 在占空比为50%时*/

   //time2_Channel1Pulse = (uint16_t) (((uint32_t) 5 * (TimerPeriod - 1)) / 10);

// /*计算CCR2 跳转值 在占空比为37.5%时*/

//  Channel2Pulse = (uint16_t) (((uint32_t) 375 * (TimerPeriod - 1)) / 1000);

//  /*计算CCR3 跳转值 在占空比为25%时*/

//  Channel3Pulse = (uint16_t) (((uint32_t) 25 * (TimerPeriod - 1)) / 100);

// /*计算CCR4跳转值 在占空比为12.5%时*/

//  Channel4Pulse = (uint16_t) (((uint32_t) 125 * (TimerPeriod- 1)) / 1000);

     PrescalerValue = (unsigned int) (48000000 / 1000000) - 1;

       TimerPeriod = (unsigned int)( 1000000 / 40 ) - 1;

time2_Channel1Pulse = (uint16_t) (((uint32_t) (7) * (TimerPeriod - 1)) / 1000);

  /* TIM1 时钟使能 */

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE);

  

  /* Time 定时基础设置*/

  TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  /* Time 定时设置为上升沿计算模式*/

  TIM_TimeBaseStructure.TIM_Period = TimerPeriod;

  TIM_TimeBaseStructure.TIM_ClockDivision = 0;

  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

 

  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

 

  /* 频道1,2,3,4的PWM 模式设置 */

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

//  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;

  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//TIM_OCPolarity_Low

//  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;//TIM_OCNPolarity_High//控制CH1N引脚的极性,这样配置是CH1和CH1N两引脚电平相反,TIM_OCNPolarity_High时电平相同

//  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;

//  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

 

  TIM_OCInitStructure.TIM_Pulse = time2_Channel1Pulse;//使能频道1配置

  TIM_OC1Init(TIM1, &TIM_OCInitStructure);

 

//  TIM_OCInitStructure.TIM_Pulse = Channel2Pulse;//使能频道2配置

//  TIM_OC2Init(TIM1, &TIM_OCInitStructure);

 

//  TIM_OCInitStructure.TIM_Pulse = Channel3Pulse;//使能频道3配置

//  TIM_OC3Init(TIM1, &TIM_OCInitStructure);

 

//  TIM_OCInitStructure.TIM_Pulse = Channel4Pulse;//使能频道4配置

//  TIM_OC4Init(TIM1, &TIM_OCInitStructure);

 

TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); 

// /*OC1PE:输出比较1预装载使能(Output compare 1 preload enable) 位3 

// 0:禁止TIMx_CCR1寄存器的预装载功能,可随时写入TIMx_CCR1寄存器,并且新写入的数值立即起作用。

// 1:开启TIMx_CCR1寄存器的预装载功能,读写操作仅对预装载寄存器操作,TIMx_CCR1的预装载值在更新事件到来时被传送至当前寄存器中。*/

// TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable; 

// TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable; 

// TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF; 

// TIM_BDTRInitStructure.TIM_DeadTime =  0;  //死区时间0-0xff 

// TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable; 

// TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High; 

// TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable; 

// TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);

TIM_ARRPreloadConfig(TIM1, flag);

  /* TIM1 计算器使能*/

 // TIM_Cmd(TIM1, flag);

// TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);//清除更新中断请求位

//      TIM_ITConfig(TIM1,TIM_IT_CC1,flag);

 

// NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;

// NVIC_InitStructure.NVIC_IRQChannelPriority = 3;

// NVIC_InitStructure.NVIC_IRQChannelCmd = flag;//ENABLE;

// NVIC_Init(&NVIC_InitStructure);

//       TIM_ITConfig(TIM1,TIM_IT_Update,flag);

 

// NVIC_InitStructure.NVIC_IRQChannel = TIM1_BRK_UP_TRG_COM_IRQn;

// NVIC_InitStructure.NVIC_IRQChannelPriority = 3;

// NVIC_InitStructure.NVIC_IRQChannelCmd = flag;//ENABLE;

// NVIC_Init(&NVIC_InitStructure);

TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_OC1Ref);

//  /* TIM1 计算器使能*/

  TIM_Cmd(TIM1, flag);

//  /* TIM1 主输出使能 */

  TIM_CtrlPWMOutputs(TIM1, flag);

}

/*****************************************************************************************

*函 数 名:TIM2_PWM_Config

*函数说明:定时器2配置

*形    参:定时器使能flag:ENABLE  DISABLE

***************************************************************************************************/

void TIM2_PWM_Config(FunctionalState flag)

{

   uint16_t TimerPeriod = 0,PrescalerValue = 0,time2_Channel1Pulse;

/* TIM2 的配置 ---------------------------------------------------

   SystemCoreClock 为48 MHz

   输出频率1/360us 占空比:50%,高脉冲180us

*/  

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

  TIM_OCInitTypeDef  TIM_OCInitStructure;

// NVIC_InitTypeDef NVIC_InitStructure;

//  TIM_BDTRInitTypeDef TIM_BDTRInitStructure; 

    /*计算预定表的值,也就是多少个时钟计数为一个周期*/

  TimerPeriod = (SystemCoreClock / 2770 ) - 1;//17570 

  /*计算CCR1 跳转值 在占空比为50%时*/

   time2_Channel1Pulse = (uint16_t) (((uint32_t) 5 * (TimerPeriod - 1)) / 10);

// /*计算CCR2 跳转值 在占空比为37.5%时*/

//  Channel2Pulse = (uint16_t) (((uint32_t) 375 * (TimerPeriod - 1)) / 1000);

//  /*计算CCR3 跳转值 在占空比为25%时*/

//  Channel3Pulse = (uint16_t) (((uint32_t) 25 * (TimerPeriod - 1)) / 100);

// /*计算CCR4跳转值 在占空比为12.5%时*/

//  Channel4Pulse = (uint16_t) (((uint32_t) 125 * (TimerPeriod- 1)) / 1000);

    // PrescalerValue = (unsigned int) (48000000 / 1000000) - 1;

      // TimerPeriod = (unsigned int)( 1000000 / 40 ) - 1;

// time2_Channel1Pulse = (uint16_t) (((uint32_t) (14) * (TimerPeriod - 1)) / 1000);

  /* TIM1 时钟使能 */

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , flag);

  

  /* Time 定时基础设置*/

  TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  /* Time 定时设置为上升沿计算模式*/

  TIM_TimeBaseStructure.TIM_Period = TimerPeriod;

  TIM_TimeBaseStructure.TIM_ClockDivision = 0;

  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

 

  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

 

  /* 频道1,2,3,4的PWM 模式设置 */

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

//  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;

  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//TIM_OCPolarity_Low

//  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;//TIM_OCNPolarity_High//控制CH1N引脚的极性,这样配置是CH1和CH1N两引脚电平相反,TIM_OCNPolarity_High时电平相同

//  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;

//  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

 

  TIM_OCInitStructure.TIM_Pulse = time2_Channel1Pulse;//使能频道1配置

  TIM_OC1Init(TIM2, &TIM_OCInitStructure);

 

//  TIM_OCInitStructure.TIM_Pulse = Channel2Pulse;//使能频道2配置

//  TIM_OC2Init(TIM1, &TIM_OCInitStructure);

 

//  TIM_OCInitStructure.TIM_Pulse = Channel3Pulse;//使能频道3配置

//  TIM_OC3Init(TIM1, &TIM_OCInitStructure);

 

//  TIM_OCInitStructure.TIM_Pulse = Channel4Pulse;//使能频道4配置

//  TIM_OC4Init(TIM1, &TIM_OCInitStructure);

 

TIM_OC1PreloadConfig(TIM2,

[1] [2]

关键字:stm32f0  tim2  单脉冲模式  tim1  内部触发

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic472116.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32F103 使用TIM3产生四路PWM
下一篇:STM32f103ZET6定时器TIM3使用通道1输出PWM程序

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

关于STM32f103 SPI时钟速度的问题

STM32f103 中APB1的最高频率是36MHz,APB2的最高频率是72MHz,而PCLK1和PCLK2一般也默认配置为其最高工作频率36M和72M。如下图(STM32F10xx_参考手册(第7版) 第46页)时钟树所示:SPI1时钟由APB2时钟分频而来,可以选择2、4、8、16、32、64、128、256这几个分频系数。而手册规定STM32的SPI时钟最快是18MHz。对于STM32F103的SPI1接口时钟,由72M的PCLK2分频得到,所以分配系数大于等于4(72M/4 = 18M)。对于STM32F103的SPI2/SPI3接口时钟,由36M的PCLK1分频得到,所以分配系数大于等于2(36M/2 = 18M
发表于 2019-09-12
关于STM32f103 SPI时钟速度的问题

STM32F4 HAL库DMA学习

;            对DMA的个别寄存器的参数进行填充,比如调用 HAL_DMA_Start()函数就会调用DMA_SetConfig()函数配置数据个数、源地址、目的地址等。而hdmatx 和第二步的DMA句柄是一模一样的,感觉最后转了一圈又转回会来了。。。  (4)  外设初始化、DMA初始化、外设和DMA进行关联、外设使能DMA发送或者接收、DMA调用函数开始发送或者接收。 个人感觉有时候HAL库的确有些冗余了,这时候可能就需要部分进行寄存器操作了。二、使用过程总结1、传输数据数目设置 注意传输数据的个数的设置:如果源
发表于 2019-09-11

STM32F103C8T6使用普通IO口模拟串口收发

在单片机用基本定时器来完成这样的事情。。。。即完成非阻塞式通讯!(1)定时器开启如下:(2)调用发送函数:UART4_Send_Buf(...);//注意STM32F103C8t6是没有串口4的!!!这是虚拟串口!!(3)调用的发送函数里面开启了定时器,所以接下来将在定时期中断中进行发送操作发送函数模拟了串口的时序:开始-发送-结束发送完一个字节,然后从缓冲区callback(),调用下一个字节进行传输!代码段如下:static void send_remain_byte(void){ if(VirtualUart.send_cnt>=VirtualUart.send_max) { VirtualUart.send_flag
发表于 2019-09-11
STM32F103C8T6使用普通IO口模拟串口收发

STM32F103的W25Q64的DMA高效数据访问实现

** Descriptions:            none**------------------------------------------------------------------------------** HW_CMU:                  STM32F103ZET6** Libraries:               STM32F10x_St
发表于 2019-09-11

STM32F103C8T6 Standby低功耗模式

1. 开发环境:winXPMDK4.45STM32 3.5固件库2. 低功耗模式简介刚接触PWR的内容,使用手册说的不太能让我好理解。其实当你弄懂了以后再回去看使用手册还是能找到的,只是写的过于简略,对于初学者很多地方理解不到位。 这个小总结完全从初学者角度,目的只有一个:进入/唤醒 PWR的standby模式。其实更多的是如何配置进入,唤醒基本上是配置好了后自动完成或硬件出发的,我们需要做的退出后的设计。这块内容暂不作为本次讨论内容。NVIC  和 PWR 各寄存器状态决定三种低功耗模式:低功耗模式一览表 PS: STM32F的NRST是异步复位脚。当NRST输入低电平的时候,MCU处于
发表于 2019-09-11
STM32F103C8T6 Standby低功耗模式

关于STM32F107VCT6串口DMA接收数字控制LED亮灭的功能实现

主函数中代码如下:#include "stm32f10x.h"void GPIO_Config(void);void USART_Config(void);void DMA_Config(void);void NVIC_Config(void);void LED1_ON(void);void LED2_ON(void);void LED3_ON(void);void LED4_ON(void);void LED_ALL_OFF(void);void delay(void);uint8_t DMA_BUFFER[1]; int main(){       
发表于 2019-09-10
关于STM32F107VCT6串口DMA接收数字控制LED亮灭的功能实现

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved