历史上的今天
返回首页

历史上的今天

今天是:2024年10月25日(星期五)

正在发生

2019年10月25日 | STM32F207管脚映射配置PWM输出笔记

2019-10-25 来源:eefocus

已亲测,可以实现。


第一步:配置相关管脚输出,比如我的是配置到PB9,使用的是定时器4的第四通道。


void Pwm_Gpio_Config(void)

{

 GPIO_InitTypeDef GPIO_InitStructure;

 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

 

 /*GPIOB_Pin_9, TIM4_Channel4 PWM*/

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

 GPIO_Init(GPIOB, &GPIO_InitStructure);

 

 GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_TIM4);//GPIOB_Pin9 TIM4_Ch4N,

}


第二步:配置定时器。


2.配置定时器:


首先是像51单片机一样需要给出定时器一个初始值。而stm32的时钟比51的复杂。我们的STM32的定时器4使用的是APB1的时钟(使用APB1时钟有TIM2, TIM3 , TIM4 ,TIM5 , TIM6 ,TIM7,TIM12,TIM13,TIM14这些,最大频率为60MHZ。使用APB2时钟的有TIM1,TIM8最大的频率为120MHZ)。


2-1:当我们想配置我们的时钟频率为20000000hz。我们就需要设置预分频系数TIM_Prescaler ,从而使得高频率降到我们需要的频率。通过公式Prescaler = (TIM4CLK / TIM4 counter clock) - 1。我们的主时钟为120MHZ,APB1时钟是主时钟的2分频为60MHZ。所以TIM4CLK 是60MHZ。我们需要的TIM4 counter clock为20MHZ,所以得出我们的预分频系数Prescaler 为2,这样就可以取得TIM4的时钟输入频率为20MHZ了。


2-2:我们已经获得时钟频率,那么如何设置才可以让定时器出我们需要的定时呢?这个很简单,就像我们的51单片机一样,有了定时器的时钟,我们就知道他运算一次是多长时间,我们需要定时多久,就是要他运行多少次。举个例子:我们需要0.5秒的定时,而我们的定时器时钟为20MHZ。那么运行一次是1/20MHZ=0.05us。所以我们定时0.5秒需要定时器运行0.5/0.05us=10000000次。那么我们把计数寄存器(对于变量为TIM_Period )赋值为10000000,这样定时器定时为0.5秒了。

在我们需要向定时器里面填入初值,就可以设定频率。


2-3:这里还有一个参数需要配置,就是计数的模式,这里选择是向上计数模式。通俗点讲就是从0开始计数,计数到设定的初值TIM_Period 就产生一个事件(终端或者其他)。


2-4:执行TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);到目前为止定时器已经配置好了。


第三步:设置PWM 


3-1.TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;设置PWM模式(有PWM1和PWM2模式,两个模式刚好相反)具体看《STM32中文参考手册》。


3-2.配置TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;以便和计数器比较产生PWM:


3-3.配置TIM_OCInitStructure.TIM_Pulse = 333;//设置占空比; 占空比 = [TIM_Pulse/TIM_Period)* 100 = 50%。


3-4.配置TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//设置有效极性,也就是设置比较输出的有效电平。


详细见代码:

void Time4_Config(void)

{

 /* -----------------------------------------------------------------------

 TIM4 Configuration: generate 4 PWM signals with 4 different duty cycles.

 In this example TIM4 input clock (TIM3CLK) is set to 2 * APB1 clock (PCLK1),

 since APB1 prescaler is different from 1.

 TIM3CLK = 2 * PCLK1

 PCLK1 = HCLK / 4

 => TIM4CLK = HCLK / 2 = SystemCoreClock /2

 To get TIM4 counter clock at 20 MHz, the prescaler is computed as follows:

 Prescaler = (TIM4CLK / TIM4 counter clock) - 1

 Prescaler = ((SystemCoreClock /2) /20 MHz) - 1

 To get TIM4 output clock at 30 KHz, the period (ARR)) is computed as follows:

 ARR = (TIM4 counter clock / TIM4 output clock) - 1= 665

 TIM4 Channel1 duty cycle = (TIM4_CCR1[TIM_Pulse]/ TIM4_ARR[TIM_Period])* 100 = 50%

 ----------------------------------------------------------------------- */

  u32 PrescalerValue  = 0;

 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

 TIM_OCInitTypeDef TIM_OCInitStructure;

 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//时能定时器时钟4

 TIM_DeInit(TIM4);

 /* Compute the prescaler value */

 PrescalerValue = (uint16_t) ((120000000/2) / 20000000) - 1;

 

 /* Time base configuration */

 TIM_TimeBaseStructure.TIM_Period = 665;//ARR 计数初值设置PWM频率计数初值

 TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;//PSC 设置用来作为TIMx时钟频率除数的预分频值

 TIM_TimeBaseStructure.TIM_ClockDivision = 0;

 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

 TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

 /* PWM1 Mode configuration: Channel4 */

 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

 TIM_OCInitStructure.TIM_Pulse = 333;//设置占空比

 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//设置有效极性,也就是设置比较输出的有效电平。

 TIM_OC4Init(TIM4, &TIM_OCInitStructure);

 TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);

 

 TIM_ARRPreloadConfig(TIM4, ENABLE);

 /* TIM4 enable counter */

 TIM_Cmd(TIM4, ENABLE);

/*

 TIM_ClearFlag(TIM4, TIM_FLAG_Update);

 TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);

 TIM_Cmd(TIM4, ENABLE);

 TIM_CtrlPWMOutputs(TIM4, ENABLE);

 */

}


推荐阅读

史海拾趣

ANSHAN [Anshan Suly Electronics]公司的发展小趣事

ANSHAN公司成立于上世纪末,当时正值电子行业的蓬勃发展期。创始人李先生凭借对电子技术的深厚理解和敏锐的市场洞察力,决定投身于这个充满机遇的领域。初创时期的ANSHAN面临资金短缺、人才匮乏和技术壁垒等多重挑战。然而,李先生带领团队日夜兼程,不断研发新产品,拓展市场渠道。他们坚持自主创新,不断攻克技术难题,逐渐在电子行业中崭露头角。

迈翔科技(COILMX)公司的发展小趣事

随着技术的不断进步和产品线的不断丰富,迈翔科技开始积极拓展国内外市场。公司不仅在国内市场取得了良好的销售业绩,还成功打入了欧美、东南亚等国际市场。同时,公司也与众多知名企业建立了长期稳定的合作关系,进一步提升了品牌影响力和市场竞争力。

Harbour Industries公司的发展小趣事

背景:随着全球化的深入发展,电子行业也迎来了国际化的浪潮。Handok意识到,要想在激烈的国际竞争中立于不败之地,必须加强与国际市场的联系和合作。

发展:Handok积极寻求与国际知名电子企业的合作机会,通过技术引进、联合研发等方式不断提升自身的技术实力和产品品质。同时,公司还加大了对国际市场的开拓力度,通过参加国际展会、设立海外分支机构等方式扩大品牌影响力。

影响:国际合作的成功为Handok带来了更多的发展机遇和市场空间,公司的国际知名度和竞争力显著提升。

Cyrustek公司的发展小趣事

在Cyrustek公司的发展过程中,人才一直是其最重要的资产。Cyrustek注重人才的培养和引进,建立了一支高素质、专业化的技术团队。这些人才不仅具备丰富的行业经验和专业知识,还具备创新精神和团队协作能力。在Cyrustek公司的发展过程中,这些人才发挥了至关重要的作用,推动了公司的不断发展和壮大。

Greenlee公司的发展小趣事

在电子行业的激烈竞争中,GREEGOO公司凭借其在半导体材料领域的持续创新,成功研发出了一种新型高性能芯片封装材料。这种材料不仅大幅提升了芯片的散热性能和稳定性,还显著降低了生产成本。这一技术突破迅速吸引了业界的关注,多家知名电子产品制造商纷纷与GREEGOO建立合作关系,推动了公司业务的快速增长。GREEGOO因此在电子材料市场上崭露头角,成为行业内的佼佼者。

Heatron公司的发展小趣事

在20世纪初,随着电子工业的蓬勃发展,对高效、可靠电加热元件的需求日益增长。Heatron公司凭借其深厚的技术积累,成功研发出了一种新型的高密度单头电热管,该产品在耐高温、耐腐蚀性能上实现了重大突破。这一技术成果迅速获得了市场的广泛认可,不仅提升了Heatron在电加热器市场的地位,还推动了整个电子行业相关应用的技术进步。

问答坊 | AI 解惑

大家帮忙看一下quartus中一些警告,谢谢了!!!

倒数第三行的警告大家可以不看,已经解决掉了, 大家帮忙看看其他的警告,谢谢了…

查看全部问答>

(高价)(高价)(高价)诚激高手开发:sock5全自动代理自助管理系统,有技术者加QQ详谈,99040008

(高价)(高价)(高价)诚激高手开发:sock5全自动代理自助管理系统,有技术者加QQ详谈,99040008…

查看全部问答>

救命啦,中文乱码怎么解决啊?~

用。NET 开发的程序在WINCE5.1上中文显示的全是方框,有没有遇到过啊,怎么解决啊。…

查看全部问答>

pb 4.2 实现注册表永久保存数据!

我在pb 4.2 中修改 platform.reg 如下: ; HIVE BOOT SECTION [HKEY_LOCAL_MACHINE\\init\\BootVars]         \"SYSTEMHIVE\"=\"Documents and Settings\\\\system.hv\"         \"PROFILEDIR\"=\"Doc ...…

查看全部问答>

STM8的EEPROM读写速度挺快的啊

STM8的EEPROM读写速度挺快的啊,经测试发现并没像datasheet说的那样一个字节6.6ms, 下载 (49.52 KB) 2010-10-9 11:08 我是单字节写的,似乎写N个字节都是6点几个ms,我是用示波器测得的 下载 (27.15 K ...…

查看全部问答>

通讯接收

请教各位,我用基于MODBUS协议实现单片机和pc机通讯,单片机中断接收,查询发送,以下是我的中断程序,我的想法是先接收完所有的数据再进行处理(包括地址判断,读寄存器等然后再发送),这样的话我接收的数据就定下来了,比如程序中只接受8个字节 ...…

查看全部问答>

TI Sitara入门资料分享7-AM335X家族介绍TI Sitara官方资料汇总

用于基于 ARM® Cortex™-A8 和 ARM9™ Sitara™ 的微控制器 (MPU) 的软件和工具软件开发套件 (SDK) - TI SDK 为您选择的平台提供主要软件组件和文档。SDK 可在 TI.com 上免费下载,同时随附 TI 评估模块 (EVM) 和开发套件提 ...…

查看全部问答>

求freescale k40标准板的例程,本人新人,在此向各位前辈求助!!

freescale k40标准板的例程,本人新人,在此向各位前辈求助!!…

查看全部问答>

如何用verilog写一句等待按键释放语句?

如何用verilog写一句等待按键释放语句?…

查看全部问答>

关于MSP430默认时钟延时定时的问题

MSP430关于延时时间的问题。 #include /* * main.c */ void main(void) {         WDTCTL = WDTPW + WDTHOLD;         unsigned int i;         unsigned char j;   ...…

查看全部问答>