开发平台
野火STM32F429开发板
使用标准库开发
高级定时器
高级定时器其实就是基本定时器加上输入捕获、输出比较和断路死区,所以有四个初始化函数:
定时器时基初始化函数
TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
输出比较初始化函数
TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
输入捕获初始化函数
TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);
死区初始化函数
TIM_BDTRConfig(TIM_TypeDef* TIMx, TIM_BDTRInitTypeDef *TIM_BDTRInitStruct);
编程思路
初始化RGB灯的引脚
驱动DHT11(上一篇)
定时器时基初始
定时器输出比较初始化
配置基本定时器:
void BASE_Tim_Config (void)
{
TIM5_CLK_ENABLE();
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period=100-1;(定时器周期,实际上就是ARR重装载值)
TIM_TimeBaseInitStruct.TIM_Prescaler=90-1;
TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIMX,&TIM_TimeBaseInitStruct);
TIM_Cmd(TIMX,ENABLE);
}
(1) 基本定时器只有向上计数
(2) 配置ARR的值
(3) 配置分频系数
(4) 基本定时器没有重复计数器
(5)使能定时器
配置高级定时器的输出比较:
void TIM_OC_Config(void)
{
TIM_OCInitTypeDef TIM_OCInitStruct;
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_Pulse=0;
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low;
TIM_OC3Init(TIMX,&TIM_OCInitStruct);
TIM_CtrlPWMOutputs(TIMX,ENABLE);
TIM_ARRPreloadConfig(TIMX,ENABLE);
TIM_Cmd(TIMX,ENABLE);
}
(1) 选择PWM模式
(2) 脉宽初始化为0,是决定占空比
(3) 设置极性决定定时器通道有效电平
(4) 比较输出使能
(5) 主动输出使能
(6) 使能ARR重装载
(7)使能定时器
补充:
初始化输出比较函数有四个,每个定时器的通道不一样,所要选择的初始化函数也不一样,要查看手册(这里用的是TIM5,通道为CH3)
定时器周期:T=(ARR+1)*(PSC+1)/TCK
占空比:脉宽/ARR重装载的值
代码如下:
PWM.h
#ifndef __PWM__H
#define __PWM__H
#include "stm32f4xx.h"
#include "DHT11.h"
#define GPIOH_CLK_ENABLE() RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH,ENABLE)
#define TIM5_CLK_ENABLE() RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE)
#define LED_R_PIN GPIO_Pin_10
#define LED_G_PIN GPIO_Pin_11
#define LED_B_PIN GPIO_Pin_12
#define LED_R_S_PIN GPIO_PinSource10
#define LED_G_S_PIN GPIO_PinSource11
#define LED_B_S_PIN GPIO_PinSource12
#define LED_R_PORT GPIOH
#define LED_G_PORT GPIOH
#define LED_B_PORT GPIOH
#define TIMX TIM5
void GPIO_Config(void);
void BASE_Tim_Config (void);
void TIM_OC_Config(void);
void TIMx_Config(void);
#endif
PWM.c
#include "PWM.h"
void GPIO_Config(void)
{
GPIOH_CLK_ENABLE();
//GPIO_PinAFConfig(LED_R_PORT,LED_R_S_PIN,GPIO_AF_TIM5); GPIO_PinAFConfig(LED_G_PORT,LED_G_PIN,GPIO_AF_TIM5);
GPIO_PinAFConfig(LED_B_PORT,LED_B_S_PIN,GPIO_AF_TIM5);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_100MHz;
//GPIO_InitStruct.GPIO_Pin=LED_R_PIN;
//GPIO_Init(LED_R_PORT,&GPIO_InitStruct);
//GPIO_InitStruct.GPIO_Pin=LED_G_PIN;
//GPIO_Init(LED_G_PORT,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin=LED_B_PIN;
GPIO_Init(LED_B_PORT,&GPIO_InitStruct);
}
void BASE_Tim_Config (void)
{
TIM5_CLK_ENABLE();
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period=100-1;
TIM_TimeBaseInitStruct.TIM_Prescaler=90-1;
TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIMX,&TIM_TimeBaseInitStruct);
TIM_Cmd(TIMX,ENABLE);
}
void TIM_OC_Config(void)
{
TIM_OCInitTypeDef TIM_OCInitStruct;
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_Pulse=0;
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low;
TIM_OC3Init(TIMX,&TIM_OCInitStruct);
//TIM_OC3PreloadConfig(TIMX,TIM_OCPreload_Enable);
TIM_CtrlPWMOutputs(TIMX,ENABLE);
TIM_ARRPreloadConfig(TIMX,ENABLE);
TIM_Cmd(TIMX,ENABLE);
}
void TIMx_Config(void)
{
BASE_Tim_Config ();
TIM_OC_Config();
}
main.c
#include "stm32f4xx.h"
#include "DHT11.h"
#include "USART.h"
#include "stdio.h"
#include "systick.h"
#include "PWM.h"
int main(void)
{
GPIO_Config();
USART_config();
Systick_Init ();
TIMx_Config();
printf("温度传感器控制led亮灭n");
while(1)
{
TIM_SetCompare3(TIMX,(DHT11_Data()-25)*6);
DELAY_us(1500000);
}
}
上一篇:RCC—使用HSE配置系统时钟
下一篇:硬件I2C驱动MPU6050
推荐阅读最新更新时间:2024-11-10 11:37
推荐帖子
- TI无线鼠标的资料
- 收到论坛送出的无线鼠标,但是很杯具,怎么都用不起,那个简报笔倒是很好用的,那位兄弟有相关的资料分享下。在TI网站查到无线鼠标的文档和代码,文档里有原理图,共享出来,那位兄弟有兴趣玩可以玩玩看。TI无线鼠标的资料想要一个无线鼠标,但是不知道会不会好用,别到时候买来一两天就给坏了https://bbs.eeworld.com.cn/thread-312050-2-1.html看一下16楼,如果以上操作步骤还是不行,就联系我们吧,我们再补寄给你一个;如果新的可以,旧的证明确实
- shower.xu 微控制器 MCU
- 求助:ir2110可以直接驱动E类逆变器吗?
- 求助:ir2110可以直接驱动E类逆变器吗?如果可以硬件该怎么连接?求助:ir2110可以直接驱动E类逆变器吗?怎么说呢楼主,能说出E类逆变器的,肯定是对逆变器有所研究为了搞清所谓E类,,在百度学术上有这种电路的mosfet管用ir2110驱动可以吗?频率可以达到多少?IR2110是双通道高压、高速电压型功率开关器件栅极驱动器,具有自举浮动电源,,IR2110即可利用自举驱动原理构成功率MOS,是常用逆变器驱动芯片之一吧,,网上资料应该有很多介绍在论坛中看到,有提到用信号发生
- lhskkk 电源技术
- 谁做过fir滤波器啊?求教????
- 谁做过fir滤波器啊?求教????谁做过fir滤波器啊?求教????正想做,求解是软件还是硬件啊
- 青囊湿依 模拟电子
- 硬盘足够大的请进
- 硬盘足够大的请进现在开启上传模式现在开启上传模式先上图先上图帮你算下:所以貌似直接上传资料到下载中心是不是更给力呢点击“图片”上传,就可以直接在帖子中放图片了坚持下来就是胜利回复沙发电子爱好者ABC的帖子资料目测还不错,不过好似非常非常的大呢?具体是多大的?我现在下载了70M,但是显示还是0%我去,大哥你还真一口气全部下载下来啊,应该有几十G。你可以打开文件夹,选择性的下载。回复6楼fengxin的帖子这个资料确实不少,,十分感谢!:
- 电子爱好者ABC 嵌入式系统
- 《嵌入式软件的时间分析》第一章阅读分享-澄清嵌入式实时系统的实时究竟是什么
- 第一章分享本章1.1实时系统一小节就澄清了实时系统的实时指的及时,而不是指的快,这点很重要,大部分嵌入式开发者可能都没搞懂这个概念,主要原因就是网上各种资料,甚至各种书籍都是各种相互抄袭,源头就是错的。换句话说,所谓实时系统是指的对及时响应有不同程度需求的系统,这种需求程度不一样就对应不同的实时系统,要求很严格就是必须实时响应否则会导致严重问题,那么这种系统就是硬实时(需求)系统,如果是有及时性要求但是要求没那么严格,偶尔一两次响应没那么及时也能接受,那么就是软实时(需
- qinyunti 汽车电子
- 宝钢的变频器应用
- 4、在宝钢,交流变频调速技术的应用尚有待开拓的新领域在宝钢,交流电动机变频调速技术虽然已得到了普遍的应用。但是,仍有待开拓的新领域:其一是风机、水泵设备的节能调速,其二是行车卷扬系统的节能调速。可以说交流调速技术应用于这两个方面其经济效益是十分可观的。4、1风机、水泵的节能调速虽然少数风机、水泵设备也用到了变频器。但是,其基本目的只是减小电动机的起动电流,以减小电动机在起动时对电网的冲击。如前所述,高炉鼓风机同步电动机的起动,1#、2#高炉出铁场除尘风机电动机的起动
- beh 工控电子
设计资源 培训 开发板 精华推荐
- 如今的手机摄像头为什么越来越多?
- Dish联手高通,推进5G RAN平台建设
- iPhone 12 Pro Max拆解照解密:主板袖珍、L型电池仅3687mAh
- Caviar推Apple Watch 6限量版系列 镶嵌109颗钻石
- 三星Exynos 1080旗舰芯片:5纳米EUV工艺
- Surface Pro 7配置曝光,计划10月2日发布
- Adobe AI发功 Premiere Pro学会自动裁视频比例
- 第25章 串行FLASH文件系统FatFs—零死角玩转STM32-F429系列
- iPhone 11预售量同比去年增480%:绿色成为爆款
- 第41章 RS-485通讯实验—零死角玩转STM32-F429系列