stm32 高级定时器产生PWM

发布者:明理厚德最新更新时间:2017-10-24 来源: eefocus关键字:stm32  高级定时器  产生PWM 手机看文章 扫描二维码
随时随地手机看文章

用stm32的高级定时器TIM1和TIM8产生PWM,需要注意:

1.都有TIM1,但只有flash容量大于256K的大容量单片机才有TIM8

2.高级定时器相对于通用定时器,多了TIM_CtrlPWMOutputs(TIM8, ENABLE); 


TIM1产生四路PWM程序:


  1. static void TIM1_GPIO_Config(void)  

  2. {    

  3.       GPIO_InitTypeDef GPIO_InitStructure;    

  4.       RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);     

  5.       RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);       

  6.   

  7.       GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8 | GPIO_Pin_9| GPIO_Pin_10 | GPIO_Pin_11;     

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

  9.       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    

  10.       GPIO_Init(GPIOA, &GPIO_InitStructure);  

  11.   }  

  12. static void TIM1_Mode_Config(void)  

  13. {          

  14.       TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;          

  15.       TIM_OCInitTypeDef  TIM_OCInitStructure;         

  16.       u16 CCR1_Val = 500;                  

  17.       u16 CCR2_Val = 500;         

  18.       u16 CCR3_Val = 500;          

  19.       u16 CCR4_Val = 500;   

  20.     

  21.      TIM_TimeBaseStructure.TIM_Period = 999;       //当定时器从0计数到999,即为1000次,为一个定时周期    

  22.      TIM_TimeBaseStructure.TIM_Prescaler = 71;               

  23.      TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;        //设置时钟分频系数:不分频             

  24.   

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

  26.      TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);                     

  27.   

  28.      TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;            //配置为PWM模式1     

  29.      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                 

  30.     // TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;           

  31.      TIM_OCInitStructure.TIM_Pulse = CCR1_Val;           //设置跳变值,当计数器计数到这个值时,电平发生跳变   

  32.      TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //当定时器计数值小于CCR1_Val时为高电平    

  33.      TIM_OC1Init(TIM1, &TIM_OCInitStructure);         //使能通道1    

  34.      TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);    

  35.   

  36.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;     

  37.     TIM_OCInitStructure.TIM_Pulse = CCR2_Val;          //设置通道2的电平跳变值,输出另外一个占空比的PWM     

  38.     TIM_OC2Init(TIM1, &TIM_OCInitStructure);          //使能通道2   

  39.     TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);            

  40.   

  41.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;     

  42.     TIM_OCInitStructure.TIM_Pulse = CCR3_Val;        //设置通道3的电平跳变值,输出另外一个占空比的PWM     

  43.     TIM_OC3Init(TIM1, &TIM_OCInitStructure);         //使能通道3     

  44.     TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);      

  45.   

  46.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   

  47.     TIM_OCInitStructure.TIM_Pulse = CCR4_Val;        //设置通道4的电平跳变值,输出另外一个占空比的PWM    

  48.     TIM_OC4Init(TIM1, &TIM_OCInitStructure);        //使能通道4   

  49.     TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);    

  50.   

  51.     TIM_ARRPreloadConfig(TIM1, ENABLE);                         // 使能TIM1重载寄存器ARR      

  52.     TIM_CtrlPWMOutputs(TIM1, ENABLE);   

  53.     TIM_Cmd(TIM1, ENABLE);    

  54. }   

  55. void TIM1_PWM_Init(void)  

  56. {         

  57.      TIM1_GPIO_Config();       

  58.      TIM1_Mode_Config();        

  59. }  


TIM8产生2路PWM程序:


  1. static void TIM8_GPIO_Config(void)  

  2. {    

  3.       GPIO_InitTypeDef GPIO_InitStructure;    

  4.       RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);     

  5.       RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);     

  6.       

  7.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7|GPIO_Pin_9;  

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

  9.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  

  10.   GPIO_Init(GPIOC, &GPIO_InitStructure);      

  11.   }  

  12. static void TIM8_Mode_Config(void)  

  13. {          

  14.       TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;          

  15.       TIM_OCInitTypeDef  TIM_OCInitStructure;         

  16.       u16 CCR1_Val = 500;                  

  17.       u16 CCR2_Val = 500;         

  18.       u16 CCR3_Val = 500;          

  19.       u16 CCR4_Val = 500;   

  20.     

  21.      TIM_TimeBaseStructure.TIM_Period = 999;       //当定时器从0计数到999,即为1000次,为一个定时周期    

  22.      TIM_TimeBaseStructure.TIM_Prescaler = 71;               

  23.      TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;        //设置时钟分频系数:不分频             

  24.   

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

  26.      TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);                     

  27.   

  28.      TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;            //配置为PWM模式1     

  29.      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                 

  30.     // TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;           

  31.      TIM_OCInitStructure.TIM_Pulse = CCR1_Val;           //设置跳变值,当计数器计数到这个值时,电平发生跳变   

  32.      TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //当定时器计数值小于CCR1_Val时为高电平    

  33.      TIM_OC1Init(TIM8, &TIM_OCInitStructure);         //使能通道1    

  34.      TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable);    

  35.   

  36.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;     

  37.     TIM_OCInitStructure.TIM_Pulse = CCR2_Val;          //设置通道2的电平跳变值,输出另外一个占空比的PWM     

  38.     TIM_OC2Init(TIM8, &TIM_OCInitStructure);          //使能通道2   

  39.     TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);            

  40.   

  41.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;     

  42.     TIM_OCInitStructure.TIM_Pulse = CCR3_Val;        //设置通道3的电平跳变值,输出另外一个占空比的PWM     

  43.     TIM_OC3Init(TIM8, &TIM_OCInitStructure);         //使能通道3     

  44.     TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Enable);      

  45.   

  46.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   

  47.     TIM_OCInitStructure.TIM_Pulse = CCR4_Val;        //设置通道4的电平跳变值,输出另外一个占空比的PWM    

  48.     TIM_OC4Init(TIM8, &TIM_OCInitStructure);        //使能通道4   

  49.     TIM_OC4PreloadConfig(TIM8, TIM_OCPreload_Enable);    

  50.   

  51.     TIM_ARRPreloadConfig(TIM8, ENABLE);                         // 使能TIM8重载寄存器ARR      

  52.     TIM_CtrlPWMOutputs(TIM8, ENABLE);   

  53.     TIM_Cmd(TIM8, ENABLE);    

  54. }   

  55. void TIM8_PWM_Init(void)  

  56. {         

  57.      TIM8_GPIO_Config();       

  58.      TIM8_Mode_Config();        

  59. }  



关键字:stm32  高级定时器  产生PWM 引用地址:stm32 高级定时器产生PWM

上一篇:stm32 TIM2 重映射
下一篇:STM32 TIM2通道重映射 PWM 无输出波形

推荐阅读最新更新时间:2024-03-16 15:41

STM32 禁用或开启总中断
STM32在使用时有时需要禁用全局中断,比如MCU在升级过程中需禁用外部中断,防止升级过程中外部中断触发导致升级失败。 ARM MDK中提供了如下两个接口来禁用和开启总中断: __disable_irq(); // 关闭总中断 __enable_irq(); // 开启总中断 但测试发现这样一个问题,在关闭总中断后,如果有中断触发,虽然此时不会引发中断,但在调用__enable_irq()开启总中断后,MCU会立即处理之前触发的中断。这说明__disable_irq()只是禁止CPU去响应中断,没有真正的去屏蔽中断的触发,中断发生后,相应的寄存器会将中断标志置位,在__enable_irq()开启中断后,由于相应的中断
[单片机]
第六种串口协议实现
编写语言:C++ 编写平台:VS 运用平台:STM32和PC 非常实用的一个解析程序,自己编写的也简单。 *.h #define BUF_LEN 1024 //buf长度 #define CONF_BUF_LEN 128 //保存代解析数据 #define DATA_BUF_LEN 100 //保存解析数据 //此处为最大传输数据 #define CONF_BUF_BEST_LEN 4 //基本数据长度 /*/////////////////协议定义////////////////////// // 0x6B 0x66 长度 数据 校验(长度+数据的和) //最基本的数据 0x6B 0x66 0x
[单片机]
第六种串口协议实现
STM32平衡小车】平衡小车的PID环体会心得
平衡环: P可增加响应速度 P过小,响应太慢,不能达到直立。 P过大,会出现大幅度的低频抖动。 D可消除P大了之后产生的大幅低频抖动。 D过大,会出现高频抖动。 速度环: P可增加速度的响应,I和P有比例关系I=P/200. P过小,响应慢,出现的现象是加速减速慢,迟钝。 P过大,会出现低频抖动。 转向环 P过下,转弯不及时 P过大,大幅度抖动 两个东西待解决 1、左右轮编码器之和数值输出的范围确定 2、小车转向的gyro范围确定 一、机械中值的确定 不管是那个环,小车物理人为的短时直立,这个必须要做到,不然调试任何参数,任何环都是扯。 机械中值的确定方法,通过OLED上显示的陀螺仪倾角确定,存在某一个
[单片机]
STM32—进入STOP模式后功耗下不去问题
背景: 最近调试板子进入STOP模式后发现电流为mA级别,功耗降不下去,最终发现是ADC开启后,忘记关闭了,导致有1.45mA的电流消耗。 内容: 利用HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI)函数使板子进入STOP模式后,电流一直降不下去。之后调了好久,才发现调用ADC采集后,忘记把ADC关掉了,真是蛋疼啊。代码如下: HAL_ADC_Start(&hadc); //开启ADC HAL_ADC_PollForConversion(&hadc,10);//进行ADC 转换,然后对转换后数据进行换算。关键的一步
[单片机]
<font color='red'>STM32</font>—进入STOP模式后功耗下不去问题
STM32之NVIC
STM32(Cortex-M3) 中NVIC(嵌套向量中断控制)的理解 一、STM32 (Cortex-M3) 中的优先级概念 STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作 亚优先级 或 副优先级 ,每个中断源都需要被指定这两种优先级。 1. 何为占先式优先级(pre-emption priority) 高占先式优先级的中断事件会打断当前的主程序/中断程序运行 抢断式优先响应,俗称中断嵌套。 2. 何为副优先级(subpriority) 在占先式优先级相同的情况下,高副优先级的中断优先被响应; 在占先式优先级相同的情况下,如果有低副优先级中断正
[单片机]
STM32的各个MCU性能评判
1写在前面 我们经常听见某手机发布会,安兔兔跑分多少多少,其实这个跑分就是体现手机性能的一个指标。我们使用STM32开发产品,选择MCU时,一般会综合考虑MCU各方面性能。对于MCU来说,一个重要指标是功耗,还有一个重要指标就是性能。 当我们进入ST官方微控制器网页,就会发现ST将MCU划分为不同层次,如下图: https://www.st.com/en/microcontrollers.html 从上面层次关系,大致可以了解ST各MCU的功耗和性能。 2 STM32 CoreMark跑分 STM32家族的32位微控制器基于ARM Cortex®-M处理器设计,为用户提供新的自由度。 产品集高性能、实时性、数字信号处理
[单片机]
<font color='red'>STM32</font>的各个MCU性能评判
STM32使用printf丢失第一个字母的问
STM32使用printf函数给串口打印信息的执行步骤为: 1.重定向printf函数 给uart.c文件中增加如下函数: //重定向c库函数printf到USART1 int fputc(int ch, FILE *f) { /* 清SR寄存器中的TC标志 */ USART_ClearFlag(USART1,USART_FLAG_TC); /* 发送一个字节数据到USART1 */ USART_SendData(USART1, (uint8_t) ch); /* 等待发送完毕 */ while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); return (ch
[单片机]
<font color='red'>STM32</font>使用printf丢失第一个字母的问
STM32 SysTick中断使用方法
SysTick中断属于核内外设中断器,中断号为-1。想要使用SysTick中断,只需在SysTick查询定时上进行稍微的修改。需要添加开启中断,直接用中断函数对计数标志位进行清零,不再使用查询方式判断计数是否结束去清零。中断函数接口SysTick_Handler在汇编文件中已经给出定义,直接到文件中查找即可。 本来NVIC提供了中断使能的函数,但是要求中断号要大于0(Value cannot be negative.),所以就不能调用NVIC中断使能函数了,直接在操作寄存器开启中断就可以了。 修改如下: #include delay.h #include led.h void Systick_Delayus
[单片机]
<font color='red'>STM32</font> SysTick中断使用方法
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved