历史上的今天
返回首页

历史上的今天

今天是:2024年09月07日(星期六)

2019年09月07日 | STM32 多个定时器 多路PWM配置

2019-09-07 来源:eefocus

实验过程中的笔记   在持续更新中  只是一个简化版本


利用定时器1 2 3 4 配置的PWM输出  


PWM输出注意外部接入的高电平还是低电平   注意修改 


    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高TIM_OCPolarity_High  接高电平极性为高  接低电平输出极性为低TIM_OCPolarity_Low


 //定时器3  ,输出TIM3 CH2的PWM脉冲波形    GPIOB.5  重映射的端口remap

 void pwm_tim3()

 {

 

     u16 led0pwmval=0;

    u8 dir=1;     

 

          delay_ms(10);     

        if(dir)led0pwmval++;

        else led0pwmval--;


         if(led0pwmval>300)dir=0;

        if(led0pwmval==0)dir=1;                                         

        TIM_SetCompare2(TIM3,led0pwmval);         //占空比定义函数  

 

 }

 

  //定时器2  ,输出TIM2 CH1的PWM脉冲波形    GPIOA.0  没有重映射

 void pwm_tim2()

 {

 

     u16 led0pwmval=0;

    u8 dir=1;     

 

          delay_ms(10);     

        if(dir)led0pwmval++;

        else led0pwmval--;


         if(led0pwmval>300)dir=0;

        if(led0pwmval==0)dir=1;                                         

        TIM_SetCompare1(TIM2,led0pwmval);         //占空比定义函数  

 

 }


 


 


 


#include "timer.h"

#include "led.h"

#include "usart.h"

//////////////////////////////////////////////////////////////////////////////////     

//本程序只供学习使用,未经作者许可,不得用于其它任何用途

//ALIENTEK战舰STM32开发板

//定时器 驱动代码       

//正点原子@ALIENTEK

//技术论坛:www.openedv.com

//修改日期:2012/9/4

//版本:V1.1

//版权所有,盗版必究。

//Copyright(C) 广州市星翼电子科技有限公司 2009-2019

//All rights reserved                                      

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

//V1.1 20120904

//1,增加TIM3_PWM_Init函数。

//2,增加LED0_PWM_VAL宏定义,控制TIM3_CH2脉宽                                      

//////////////////////////////////////////////////////////////////////////////////  

         

//通用定时器3中断初始化

//这里时钟选择为APB1的2倍,而APB1为36M

//arr:自动重装值。

//psc:时钟预分频数

//这里使用的是定时器3!

void TIM3_Int_Init(u16 arr,u16 psc)

{

  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    NVIC_InitTypeDef NVIC_InitStructure;


    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能


    TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值     计数到5000为500ms

    TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  

    TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式

    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

 

    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断


    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能

    NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器


    TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设

                             

}

//定时器3中断服务程序

void TIM3_IRQHandler(void)   //TIM3中断

{

    if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 

        {

        TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 

        LED1=!LED1;

        }

}


//TIM4 PWM部分初始化 

//PWM输出初始化  PB6  没有映射

//arr:自动重装值

//psc:时钟预分频数

void TIM4_PWM_Init(u16 arr,u16 psc)

{  

    GPIO_InitTypeDef GPIO_InitStructure;

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    TIM_OCInitTypeDef  TIM_OCInitStructure;

    


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

     //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  , ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟

    //GPIO_PinRemapConfig(GPIO_PartialRemap_TIM2, ENABLE); //Timer2部分重映射  TIM4_CH1->PB6 没有映射

 

   //设置该引脚为复用输出功能,输出TIM4 CH1的PWM脉冲波形    GPIOB.6  没有映射  重映射的端口remap 

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //TIM_CH1

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO  PB.6 

    //GPIO_SetBits(GPIOB,GPIO_Pin_6);                         //PB.6 输出高

   //初始化TIM4

    TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值

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

    TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式

    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

    

    //初始化TIM2 Channel2 PWM模式     

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2

     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能

    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高TIM_OCPolarity_High  接高电平极性为高  接低电平输出极性为低TIM_OCPolarity_Low

    TIM_OC1Init(TIM4, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM4 CH1 TIM_OC1PreloadConfig

//    CH1的PWM脉冲波形


    TIM_CtrlPWMOutputs(TIM4,ENABLE); //⑤MOE 主输出使能   非高级定时器可省略

    TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIM4在CCR1上的预装载寄存器  TIM4 CH1

    TIM_ARRPreloadConfig(TIM4, ENABLE); //使能 TIMx 在 ARR 上的预装载寄存器  非高级定时器可省略

    TIM_Cmd(TIM4, ENABLE);  //使能TIM4

    


}



//TIM3 PWM部分初始化 

//PWM输出初始化

//arr:自动重装值

//psc:时钟预分频数

void TIM3_PWM_Init(u16 arr,u16 psc)

{  

    GPIO_InitTypeDef GPIO_InitStructure;

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    TIM_OCInitTypeDef  TIM_OCInitStructure;

    


    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);    //使能定时器3时钟

     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟

    GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5   PC7

 

   //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形    GPIOB.5  重映射的端口remap

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO

    //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形    GPIOC.7  重映射的端口remap

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //TIM_CH2

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIO

   //初始化TIM3

    TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值

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

    TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式

    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

    

    //初始化TIM3 Channel2 PWM模式     

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2

     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能

    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高

    TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2


    TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器

 

    TIM_Cmd(TIM3, ENABLE);  //使能TIM3

    


}


//TIM2 PWM部分初始化 

//PWM输出初始化

//arr:自动重装值

//psc:时钟预分频数

void TIM2_PWM_Init(u16 arr,u16 psc)

{  

    GPIO_InitTypeDef GPIO_InitStructure;

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    TIM_OCInitTypeDef  TIM_OCInitStructure;

推荐阅读

史海拾趣

ADL [ADL Embedded Solutions Inc]公司的发展小趣事

ADL Embedded Solutions Inc. 是一家专注于嵌入式计算解决方案的公司,以下是该公司发展的五个相关故事:

  1. 公司创立与早期发展: ADL Embedded Solutions Inc. 成立于1994年,总部位于美国科罗拉多州科罗拉多斯普林斯市。公司初期致力于为工业、军事、航空航天等领域提供嵌入式计算解决方案。其产品包括工业级嵌入式计算板卡、系统、模块等。

  2. 技术创新与产品推出: ADL 在嵌入式计算领域不断进行技术创新,并推出了多款具有竞争力的产品。公司的产品具有高性能、低功耗、高可靠性等特点,得到了客户的广泛认可。其产品广泛应用于军事航空、医疗、交通、工业自动化等领域。

  3. 客户合作与项目案例: ADL 与各行业的领先企业建立了长期稳定的合作关系,并参与了众多重要项目。例如,公司为航空航天领域的客户提供了符合严格标准的嵌入式计算解决方案,为医疗设备制造商提供了可靠的嵌入式计算板卡等。

  4. 全球市场拓展与国际化发展: ADL 通过不断拓展国内外市场,实现了全球化发展。公司在美国、欧洲和亚洲等地设有销售办事处和服务中心,为客户提供本地化的技术支持和服务。同时,ADL 的产品远销全球各地,深受国际客户的青睐。

  5. 未来展望与持续发展: ADL 将继续致力于技术创新和产品开发,满足客户不断变化的需求。公司将不断扩大在工业、军事、医疗等领域的市场份额,加强与客户的合作,保持行业领先地位,实现业务的持续增长和发展。

Anritsu公司的发展小趣事

Anritsu公司是一家在电子行业内拥有悠久历史的领军企业,以下是关于该公司发展的五个相关故事:

  1. 成立与早期发展: Anritsu公司成立于1895年,最初名为Anritsu Electric Corporation。起初,该公司主要从事日本和国际市场的电信设备制造和销售业务。20世纪中叶,随着日本电信技术的发展,Anritsu开始专注于电信测试与测量领域,并开发了一系列先进的测试仪器。

  2. 技术创新与产品线扩展: 随着电信技术的迅速发展,Anritsu不断进行技术创新,推出了一系列领先的测试与测量仪器,包括频谱分析仪、网络分析仪、光通信测试设备等。这些产品在电信、无线通信、半导体等领域得到了广泛应用,为行业的发展提供了强大支持。

  3. 国际化发展: 在日本国内市场取得成功后,Anritsu逐渐将业务拓展到国际市场。公司在世界各地设立了分支机构和办事处,建立了完善的销售与服务网络,以更好地满足全球客户的需求。特别是在美国、欧洲和亚洲等地区,Anritsu建立了广泛的合作伙伴关系,拓展了市场份额。

  4. 对5G技术的贡献: 随着5G技术的快速发展,Anritsu积极投入到了5G测试与验证领域。该公司推出了一系列针对5G通信系统的测试仪器和解决方案,包括5G网络分析仪、5G基站仿真器等。Anritsu的技术和产品为全球5G网络的部署和优化提供了重要支持。

  5. 持续创新与发展: Anritsu一直以来致力于技术创新和产品研发,不断推出符合市场需求的新产品和解决方案。公司与全球领先的通信运营商、设备厂商和研究机构保持密切合作,不断优化产品性能和功能,为客户提供更高水平的技术支持和服务。

通过持续的创新和国际化发展,Anritsu已经成为了电子行业中的知名品牌,为全球通信技术的进步和发展做出了重要贡献。

Alan Industries Inc公司的发展小趣事

在追求经济效益的同时,Alan Industries Inc.也始终关注社会责任和可持续发展。公司积极参与公益事业,通过捐款捐物等方式支持社会慈善事业。同时,公司还注重环保和节能,在产品研发和生产过程中采用环保材料和工艺,努力降低对环境的影响。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实基础。

以上五个故事都是基于电子行业的一般发展情况和公司成长的常见模式虚构的,旨在展示Alan Industries Inc.公司可能的发展历程。请注意,这些故事并非基于实际发生的事件,因此可能与该公司的实际情况存在差异。

API Technologies公司的发展小趣事

API Technologies的初创时期,正值电子行业的蓬勃发展期。公司面临着激烈的市场竞争和技术革新的挑战。然而,创始人凭借对电子技术的深刻理解和敏锐的市场洞察力,成功开发出了一系列高性能、高可靠性的电子元器件,迅速在市场中占据了一席之地。同时,公司也积极寻求与合作伙伴的合作,共同推动技术创新和市场拓展。

Astec [Astec America, Inc]公司的发展小趣事

在发展过程中,Astec意识到单打独斗难以应对日益激烈的市场竞争。因此,公司开始积极寻求与其他企业的战略合作,共同开拓市场。通过与上下游企业的紧密合作,Astec成功整合了产业链资源,实现了从原材料采购到产品生产的全面优化。这不仅提高了公司的生产效率,还降低了成本,进一步增强了公司的市场竞争力。

HELUKABEL公司的发展小趣事

Astec America, Inc的创立可以追溯到上世纪80年代,当时创始人看到了电源技术的巨大潜力,并决定在这一领域进行深耕。公司初创时期,团队主要专注于电源技术的研发,推出了一系列具有创新性的电源产品。这些产品不仅性能稳定、效率高,而且价格合理,很快就在市场上获得了良好的口碑。

问答坊 | AI 解惑

cycloneIII_3c25的原装开发板到手了-发资料

整快板子上的外设不是很多,但是存储器资源丰富。并预留了一个HSMC接口,可以用来扩展。有三张光盘,一张是介绍开发板的使用,例程,入门指导,另两张是Quartus2的软件,常用库,NIOS2开发资料。先简单介绍到这里,把开发板的资料传上来共享(全部 ...…

查看全部问答>

2011年全国竞赛基本仪器和主要元器件清单

本帖最后由 paulhyde 于 2014-9-15 09:46 编辑 …

查看全部问答>

空调板上的数码灯的问题

显示温度的时候,数码灯上未点亮的部分有闪烁现象,什么原因…

查看全部问答>

【设计工具】Xilinx SRAM 型FPGA抗辐射设计技术研究

针对XILINX SRAM型FPGA在空间应用中的可行性,分析了Xilinx SRAM型 FPGA的结构,以及空间辐射效应对这种结构FPGA的影响,指出SRAM型的FPGA随着工艺水平的提高、器件规模的增大和核电压的降低,抗总剂量效应不断提高,抵抗单粒子效应,尤其是单粒子 ...…

查看全部问答>

LAunchPad的2线控制LCD12864

很给力哦,解决LaunchPad的 IO口不够用,很有价值~~~   我用的开发板是g2553~~~ [ 本帖最后由 574937246 于 2012-7-20 14:46 编辑 ]…

查看全部问答>

问锁定放大电路中的一个问题

请教坛中大侠:  锁定放大中的移相电路部分,其移相作用是调整好就可以了,还是要以后经常性的调整?换句话说:移相部分的可调电阻最后能不能换成固定的?…

查看全部问答>

ZIGBEE CC2530协议栈跑呼吸灯问题。

在协议栈中我操作定时器 1(T1)产生PWM波,避免与定时器3-4系统定时器冲突。在裸机中我用定时器1跑通PWM了的。可是我加载到协议栈貌似遇到很多问题,希望大家跟我给点建议。上图 这个是定时器TI的驱动程序。 这是电脑给协调器串口写数据并通 ...…

查看全部问答>

EEPROM断电数据就会清空是什么原因

是根本没有存上 还是别的什么原因? …

查看全部问答>

我所收集的开关电源资料。。。有需要的大家看看。。

刚来论坛,感觉不错。发一点自己收藏的书籍,有用的大家看看。。。…

查看全部问答>