stm32 PWM


主函数:
u16 time;
int main(void)
{
RCC_Configuration();
GPIO_Configuration();
NVIC_Configuration();
TIM_Configuration();
time=0;
while(1)
{
}
}


#include "time.h"
/*=============================================================================================
时钟设置:72M
使能TIM3和GPIOA
==============================================================================================*/
void RCC_Configuration()
{
SystemInit();//系统时钟设置位72MHz
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE); //使能GPIOA,GPIOB
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能定时器3
}


/*=============================================================================================
GPIO端口设置:
PORTA.7端口设置为复用推挽输出
==============================================================================================*/
void GPIO_Configuration()
{
GPIO_InitTypeDef GPIO_InitStructure; //定义一个结构体
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7; //设定管脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //50MHz翻转速度
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //设置模式,复用推挽输出,这个很重要
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化这些设置
}


/*=============================================================================================
NVIC设置:
中断优先级为最高
定时器3
==============================================================================================*/
void NVIC_Configuration()
{
NVIC_InitTypeDef NVIC_InitStructure; //定义结构体
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //采用分组2方式
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //定时器3
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //0抢断优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; //0从优先级
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能该通道
NVIC_Init(&NVIC_InitStructure); //初始化设置
}


/*=============================================================================================
TIM模块设置

==============================================================================================*/
void TIM_Configuration()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //定义两个结构体,一个基本机构,一个比较输出结构
TIM_OCInitTypeDef TIM_OCInitStructure;

TIM_TimeBaseStructure.TIM_Period=0xffff; //必须是0xffff
TIM_TimeBaseStructure.TIM_Prescaler=72-1; //时钟为72/72=1MHz
TIM_TimeBaseStructure.TIM_ClockDivision=0; //0个采样分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); //初始化设置

TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; //管脚输出模式:翻转模式
TIM_OCInitStructure.TIM_Pulse=2000; //翻转周期2000个脉冲
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; //使能这个通道
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High; //输出为正逻辑
TIM_OC2Init(TIM3,&TIM_OCInitStructure); //写入配置
//TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable); //使能预装载寄存器
//TIM_ARRPreloadConfig(TIM3,ENABLE);
TIM_ClearFlag(TIM3, TIM_FLAG_Update); //清除中断

//TIM_PrescalerConfig(TIM3, 0xEA5F, TIM_PSCReloadMode_Immediate); //设置预分频数

TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //TIM中断源设置,开启相应通道的捕获比较中断
TIM_Cmd(TIM3,ENABLE); //开启TIM3
TIM_CtrlPWMOutputs(TIM3,ENABLE); //通道输出使能
}


在这里要注意的是,你要看到你使能的中断源是什么,因为这个倒最后你要查询的东西!



void TIM3_IRQHandler(void)
{


// if(TIM_GetITStatus(TIM3, TIM_IT_CC2)==SET)//这个的中断源是TIM_IT_CC2这个通道
// {
// time++;
// TIM_ClearITPendingBit(TIM3, TIM_IT_CC2 );
// capture = TIM_GetCapture2(TIM3);
// TIM_SetCompare2(TIM3, capture + 2000);
// //这里解释下:
// //将TIM1_CCR1的值增加2000,使得下一个TIM事件也需要2000个脉冲,
// //另一种方式是清零脉冲计数器
// //TIM_SetCounter(TIM2,0x0000);
// }

time++;
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET) //这个的中断源是TIM_IT_Update
{
capture++;
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
//GPIO_WriteBit(GPIOA,GPIO_Pin_9,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_9)));
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值