历史上的今天
今天是:2025年02月16日(星期日)
2020年02月16日 | 基于stm32的PWM输出呼吸灯(包括stm32呼吸灯代码)
2020-02-16 来源:elecfans
硬件电路图:

我的收获:

这是STM32数据手册上对TIM3通用定时器复用功能重映象的描述,假设让PA6作为PWM输出,从图中可以看出PA6对应TIM3的通道1,
使能TIM3通道1的函数为
TIM_OC1Init();1
同样的,如果想要使能PA7,它对应的是TIM3的通道2,那么使能通道2的函数便是:
TIM_OC2Init()1
以此类推,需要注意,使能不同相同定时器不同通道的函数是有一点小差别的,防止在程序中调用TIM_OC1Init()函数来使能TIM3通道2这种情况的发生。

注意看这里,假设使用的是TIM3的通道1,那么这里就要写成
TIM3-》CCR11
类似的如果用TIM3定时器的通道2,这里就要相应的改为
TIM3-》CCR21
这同样是为了防止本来计划使用的是TIM3的通道1,反而在这里自摆乌龙写为了TIM-》CCR2的情况,这样的错误一般很隐蔽,不容易查找。
相应的程序已经上传,但是不知道为什么在这里无法显示程序的下载地址,需要下载可以去我的资源里下载。
工程文件为
Progect–》RVMDK(uv4)–》iSO_STM32

STM32PWM输出实现LED灯渐亮渐灭程序:
/**说明:
*PA0:KEY1;PA1:KEY2;
*PA2:LED1;PA3:LED2;
*PA9:USART1_TX;PA10:USART1_RX
*/
#include “stm32f10x.h”
#include “stm32f10x_rcc.h”
#include “stm32f10x_gpio.h”
#include “stm32f10x_tim.h”
#include “stm32f10x_pwr.h”
#include “stm32f10x_exti.h”
#include “system_stm32f10x.h”
#include “misc.h”
void RCC_Configuration(void);
void GPIO_Configuration(void);
void TIM2_Configuration(void);
void delay_ms(u16 time);
int main()
{
u8 led_fx=1;
u16 led_dt=0;
RCC_Configuration();
GPIO_Configuration();
TIM2_Configuration();
while(1)
{
delay_ms(10);
if(led_fx==1)
{
led_dt++;
}else{
led_dt--;
}
if(led_dt》100) led_fx=0;//可以和初始值一样
if(led_dt==0) led_fx=1;
TIM_SetCompare3(TIM2,led_dt);//通道3没有重影像是PA2对应LED1
TIM_SetCompare4(TIM2,led_dt);//通道4没有重影像是PA3对应LED2
}
}
void RCC_Configuration(void)
{
SystemInit();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
//GPIO_AFIODeInit();和下面相同效果,可以查看源码证明
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//GPIO_PinRemapConfig(GPIO_PartialRemap2_TIM2,ENABLE);//端口映射函数
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;//GPIO_Pin_3对应channel3,主函数改为:TIM_SetCompare3
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void TIM2_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_DeInit(TIM2);
TIM_InternalClockConfig(TIM2);
//定时器初始化
TIM_TimeBaseStructure.TIM_Period = 100-1;//初始值是100,2MHz=2000KHz,2MHz/100=0.02MHz,所有周期T=1/0.02MHz=50us,示波器显示周期应该为50us
TIM_TimeBaseStructure.TIM_Prescaler = 36-1;//36倍分频,72MHz/36=2MHz
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
//PWM初始化
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 50;//占空比值是50,所以占空比是:50/100=50%
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OC3Init(TIM2,&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_Pulse = 20;
TIM_OC4Init(TIM2,&TIM_OCInitStructure);
//TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Enable);
//TIM_ARRPreloadConfig(TIM2, ENABLE);
TIM_Cmd(TIM2,ENABLE);
TIM_CtrlPWMOutputs(TIM2,ENABLE);
}
void delay_ms(u16 time)
{
u16 i=0;
while(time--)
{
i=12000;
while(i--);
}
}
史海拾趣
|
WinCE5.0挂接IDE硬盘的疑惑? 有个项目,想使用IDE44pin接口挂接最少64GB的外部存储器,现有如下问题和大家讨论: 1.工作电压: 现在手头上的IDE电路是直接从S3C2440上IO口引出,鉴于3.3V的IO电压,似乎不能正常驱 ...… 查看全部问答> |
|
求binArrayStart和binArrayEnd的定义的线索 问题描述: 大家好。我最近在修改Boot程序。在bootinit.c文件中有如下定义: IMPORT UCHAR binArrayStart []; & ...… 查看全部问答> |
|
在dialog中有个tab control,在每个tab的dialog中有个group box, group box中有个按钮。 现在的现实结果是tab control和group box都显示正常,按钮没有显示,什么原因? app方面菜鸟一个,期待大家指点… 查看全部问答> |
|
一、USB型51/AVR单片机编程器元器件清单 二、AVR ATmega16单片机学习板元器件清单 [ 本帖最后由 tiankai001 于 2010-8-8 15:35 编辑 ]… 查看全部问答> |
|
因为刚学DSP,做的是用2407产生6路3对对称PWM,一开始摸索的时候程序老是编译有问题,今天才把程序搞好``却发现我的板子出了问题,因为编的第一个程序所以没有把挖想放上来大家帮我看看这样写是不是能产生6路3对对称PWM``` 主程序如下 #include \\" ...… 查看全部问答> |




