特价专区

STM32里TIM1_CH1N与TIM1_CH1的区别是什么?

问答对人有帮助,内容完整,我也想知道答案

0

STM32里tiM1_CH1N与TIM1_CH1的区别是什么?

STM32的时钟系统是什么?

0

2021-11-24 07:46:29

评论

淘帖0

邀请回答

您可以邀请以下用户,快速回答问题

×

heks

该类别下有 54 个回答。

邀请回答

hgimtk

该类别下有 45 个回答。

邀请回答

新星之火12138

该类别下有 43 个回答。

邀请回答

chm5

该类别下有 42 个回答。

邀请回答

wang21cj

该类别下有 41 个回答。

邀请回答

hjfjsdgfjdsf

该类别下有 38 个回答。

邀请回答

werywer

该类别下有 36 个回答。

邀请回答

h1654155957.9520

该类别下有 35 个回答。

邀请回答

fdjslkjd

该类别下有 35 个回答。

邀请回答

uvysdfydad

该类别下有 35 个回答。

邀请回答

jenny042

该类别下有 34 个回答。

邀请回答

凤毛麟角

该类别下有 34 个回答。

邀请回答

维生素B2

该类别下有 34 个回答。

邀请回答

dfzvzs

该类别下有 34 个回答。

邀请回答

江左盟

该类别下有 34 个回答。

邀请回答

LY0206

该类别下有 33 个回答。

邀请回答

meihuacg

该类别下有 33 个回答。

邀请回答

hfgdzc

该类别下有 33 个回答。

邀请回答

爱与友人

该类别下有 33 个回答。

邀请回答

wenminglang

该类别下有 33 个回答。

邀请回答

举报

发烧友推温针

相关推荐

• 如何在TIM1中的互补定时器通道上使用DMA?

392

• 请问如何利用STM32L476的TIM1输出脉冲?

1757

• STM32H743可以控制两个SPWM调制三相逆变器吗?

632

• cubemx设置TIM1 CH1N PWM波形没有输出的原因?

1004

• 请问TIM1怎么配置?

1633

• F030K6 PA9 TIM1_CH2无法输出PWM

2899

• STM32中为什么TIM1->CCR1为什么对应的是PA8

15256

• stm8l052c6 mcu作为项目MPPT不生成初始互补PWM

2073

• STM8S001J3的5脚复用为UART1_TX的条件为AFR0=1,AFR1=1,swim脚是不是只能用作TIM1_CH1脚而不能用作ADC脚?

309

• PA15用作TIM2->CH1无法输出PWM

4621

提交评论

1个回答

答案对人有帮助,有参考价值

0

定时器应用之PWM输出

1.1 TIM1_CH1N 与 TIM1_CH1 的区别

在刚准备使用定时器的时候,我看了下原理图,发现对于定时器1,它的每一个输出通道都是成对的,即TIM1_CH1N与TIM1_CH1两个一组,通过网络查询后,明白了芯片这样设计的原因。

TIM1是一个完整的电机控制用定时器外设,TIM1_CH1和TIM1_CH1N,用于驱动上下两个功率管。如果Deadtime为0,则 TIM1_CH1N是TIM1_CH1的反相,如果Deadtime不为0,则在TIM1_CH1N上插入了Deadtime,防止上下功率管同时导通。

另外的两类管脚定义:

TIM1_ETR是外部触发输入管脚;

TIM1_BKIN是故障信号,用来关闭TIM1的输出。

1.2 定时器的配置及 PWM 的设置 1.2.1 定时器相关结构体

从固件库里的教程CHM获取到的定时器相关的结构体。

TIM_BDTRInitTypeDef

BDTR structure definition

TIM_ICInitTypeDef

TIM Input Capture Init structure definition

TIM_OCInitTypeDef

TIM Output Compare Init structure definition

TIM_TimeBaseInitTypeDef

TIM Time Base Init structure definition

TIM_TypeDef

TIM

其中与PWM输出有关的结构体主要为:

TIM_TimeBaseInitTypeDef:定时器初始化配置结构体

TIM_OCInitTypeDef:定时器输出比较结构体

1.2.2 定时器的三个速度

在刚开始学习定时器的时候,我对定时器的速度、技术速度都很迷糊,通过前面对STM32时钟系统的学习,以及RCC库里面几个函数的学习,总算明白了,定时器的这三个速度。

TIMxCLK(定时器的工作频率):这个频率是我们在RCC里面配置APB1或APB2总线时的频率。

TIMx Counter Clock(定时器的计数频率):这个频率是定时器对ARR寄存器内的值进行加数或是减数的速度。

以前在做51单片机编程的时候,这两个频率往往是一致的。所以,刚开始对这两个频率的理解上还是有点疑惑的。

TIMx Running @(定时器的作用频率):这个频率表示定时器在这一次ARR寄存器开始累加或递减到下一次ARR寄存器重装所用的时间,这个频率可以理解为在以前的51单片机内我们定时器的定时周期。

对以上三个频率理解清楚后,再对定时器进行初始化的配置就很清晰了。

1.2.3 定时器的配置

定时器的配置代码

// Compute the prescaler value /

//TIM3CLK is 72 MHz

//TIM3 Counter Clock is 24 MHz

//TIM3 is running at 1 KHz

PrescalerValue = (unsigned int) (72000000 / 36000000) - 1;

PeriodValue = (unsigned int)( 36000000 / 1000 ) - 1;

三个频率的设置:定时器工作频率为72MHz,定时器计数频率36MHz,定时周期1KHz,通过这三个值,计算PrescalerValue 及PeriodValue的值。为后面的结构体配置做准备。

关于定时器的工作频率为72MHz,与APB2的预分频系数有关,=1则频率不变,否则,频率x2.

RCC_PCLK1Config(RCC_HCLK_Div2);//设置APB1时钟

// Time base configuration /

TIM_TimeBaseStructure.TIM_Period = PeriodValue;

TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;

TIM_TimeBaseStructure.TIM_ClockDivision = 0;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

TIM_Period及 TIM_Prescaler的值通过前面的计算已经确定。其中TIM_Prescaler是确定定时器技术频率,TIM_Period是确定定时周期的。

// PWM1 Mode configuration: Channel1 /

CCR_Val = (unsigned int) (PeriodValue / 2 ) ;

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

TIM_OCInitStructure.TIM_Pulse = CCR_Val;

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

//TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;

TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);//选择第二个通道输出

TIM_OC2Init(TIM3, &TIM_OCInitStructure); //选择第二个通道输出

以上是输出比较结构体的配置,他最后决定了PWM的参数,PWM的频率即前面的定时器定时周期。而占空比是由TIM_Pulse确定的。其中占空比公式为:

DUTY = CCR寄存器的值 / ARR寄存器的值

DUTY = TIM_OCInitStructure.TIM_Pulse / TIM_TimeBaseStructure.TIM_Prescaler-1

//TIM3->CCER &= 0xEEEF;

// TIM3 enable counter

TIM_ARRPreloadConfig(TIM3, ENABLE);

TIM_Cmd(TIM3, ENABLE);

TIM_CtrlPWMOutputs(TIM3,ENABLE);

定时器的最后使能配置。至此,有关定时器相关的结构体的配置就结束了。在配置完GPIO后就可以输出PWM波了。实际上,程序流程上是先配置GPIO的,但我在学习PWM时,在GPIO上花费了大量的时间,也对GPIO理解更加深刻了。

杂谈全文文字

12 MAY, 2011

STM32的时钟系统

1.1 STM32 时钟系统概述

在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。

①、HSI是高速内部时钟,RC振荡器,频率为8MHz。

②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。

③、LSI是低速内部时钟,RC振荡器,频率为40kHz。

④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。

⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。

其中40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。另外,实时时钟RTC的时钟源还可以选择LSE,或者是HSE的128分频。RTC的时钟源通过RTCSEL[1:0]来选择。

STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。该时钟源只能从PLL输出端获取,可以选择为1.5分频或者1分频,也就是,当需要使用USB模块时,PLL必须使能,并且时钟频率配置为48MHz或72MHz。

另外,STM32还可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL输出的2分频、HSI、HSE、或者系统时钟。

系统时钟SYSCLK,它是供STM32中绝大部分部件工作的时钟源。系统时钟可选择为PLL输出、HSI或者HSE。系统时钟最大频率为72MHz,它通过AHB分频器分频后送给各模块使用,AHB分频器可选择1、2、4、8、16、64、128、256、512分频。其中AHB分频器输出的时钟送给5大模块使用:

①、送给AHB总线、内核、内存和DMA使用的HCLK时钟。

②、通过8分频后送给Cortex的系统定时器时钟。

③、直接送给Cortex的空闲运行时钟FCLK。

④、送给APB1分频器。APB1分频器可选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给定时器(Timer)2、3、4倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器2、3、4使用。

⑤、送给APB2分频器。APB2分频器可选择1、2、4、8、16分频,其输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给定时器(Timer)1倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器1使用。另外,APB2分频器还有一路输出供ADC分频器使用,分频后送给ADC模块使用。ADC分频器可选择为2、4、6、8分频。

在以上的时钟输出中,有很多是带使能控制的,例如AHB总线时钟、内核时钟、各种APB1外设、APB2外设等等。当需要使用某模块时,记得一定要先使能对应的时钟。

需要注意的是定时器的倍频器,当APB的分频为1时,它的倍频值为1,否则它的倍频值就为2。

连接在APB1(低速外设)上的设备有:电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、窗口看门狗、Timer2、Timer3、Timer4。注意USB模块虽然需要一个单独的48MHz时钟信号,但它应该不是供USB模块工作的时钟,而只是提供给串行接口引擎(SIE)使用的时钟。USB模块工作的时钟应该是由APB1提供的。

连接在APB2(高速外设)上的设备有:UART1、SPI1、Timer1、ADC1、ADC2、所有普通IO口(PA~PE)、第二功能IO口。

下图是STM32用户手册中的时钟系统结构图,通过该图可以从总体上掌握STM32的时钟系统。

1.2 STM32 时钟的配置

以下代码表示使用外部晶振,给整个系统提供振荡源。初始化外部晶振后,通过PLL倍频,再给系统时钟及挂载在AHB、APB1和APB2总线上的外设提供时钟。

void RCC_Configuration(void)

{

//---------------------------------------------------------------

//-------------------------------使用外部晶振,并等待外部晶振起振

RCC_HSEConfig(RCC_HSE_ON);//配置外部高速晶振

RCC_WaitForHSEStartUp();//等待外部高速晶振起振

//---------------------------------------------------------------

//----------------------------采用外部高速晶振做PLL源,并配置PLL

RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //PLL配置

RCC_PLLCmd(ENABLE);//PLL使能

//---------------------------------------------------------------

//---------------------------------------------------配置总线频率

RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟

RCC_PCLK1Config(RCC_HCLK_Div2);//设置APB1时钟

RCC_PCLK2Config(RCC_HCLK_Div1);//设置APB2时钟

//---------------------------------------------------------------

//-------------------------------------------------系统时钟初始化

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//系统时钟初始化

//---------------------------------------------------------------

//-------------------------------------------总线上外设时钟初始化

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA

|RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC

|RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE

|RCC_APB2Periph_ADC1 | RCC_APB2Periph_AFIO

|RCC_APB2Periph_SPI1, ENABLE );

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4 | RCC_APB1Periph_USART2

|RCC_APB1Periph_USART3|RCC_APB1Periph_TIM2

, ENABLE );

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

}

一直想弄明白RCC配置里面到底做了什么,这次通过对这一系列函数的研究,总算明白了,STM32系统的时钟配置,以及到底芯片及外设到底工作在一个什么样的频率上。

2021-11-24 14:24:40

评论

举报

黄鸿江

提交评论

只有小组成员才能发言,加入小组>>

Copyright © 2088 网游折扣情报网 - 全网比价领福利 All Rights Reserved.
友情链接