STM32自带PWM输出实验
#include "sys.h"
#include "delay.h"
#include "usart.h"
#define LED0_val TIM3->CCR2
void PWM_init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<1; //TIM3时钟使能
GPIOA->CRH&=0xfffffff0; //PA8
GPIOA->CRH|=0x00000004; //PA8 浮空输入
GPIOA->CRL&=0x0fffffff;
GPIOA->CRL|=0xB0000000; //PA7复用输出
GPIOA->ODR|=1<7; //PA7上啦
TIM3->ARR=arr; //设置重装载值
TIM3->PSC=psc; //设置预分频系数
TIM3->CCMR1|=7<12; //CH2 PWM2模式
TIM3->CCMR1|=1<11; //CH2预装载使能
TIM3->CCER|=1<4; //OC2输出使能
TIM3->CR1|=0x0080; //ARPE使能
TIM3->CR1|=0x01; //使能定时器3
}
int main(void)
{
u16 pwm=0;
u8 dir=1;
Stm32_Clock_Init(9);
delay_init(72);
uart_init(72,9600);
PWM_init(900,0); //频率72000/900 80KHZ
while(1)
{
delay_ms(10);
if(dir)pwm++;
else pwm--;
if(pwm>300)dir=0;
if(pwm==0)dir=1;
LED0_val=pwm;
}
}
void PWM_init(u16 arr,u16 psc)函数解析:
GPIOA->CRL&=0x0fffffff;
GPIOA->CRL|=0xB0000000; //PA7复用输出 因为TIM3_CH2 通道是I/O口复用的形式连接到PA7上的
TIM3->ARR; //设置自动重装载值
TIM3->PSC; //设置分频系数
TIM3->CCMR1|=7<12; //CH2 PWM2模式
CCMR1用于控制CH1 和CH2通道
由于7=0x111;
所以OC1M[2:0]为
111:PWM模式2- 在向上计数时,一旦TIMx_CNT TIM3->CCMR1|=1<11; //CH2预装载使能 TIM3->CCER|=1<4; //OC2输出使能
默认为高电平有效
计数模式是 TIM3_CR1 中 位4决定
位4 0:计数器向上计数; 1:计数器向下计数。
默认为向上计数模式
定时器的值从0-----> TIM->ARR 到自动装载值 循环变化
//---------------------------------------------------------------------------------------
CC2E:输入/捕获1输出使能 (Capture/Compare 1 output enable)
CC2通道配置为输出: 0: 关闭- OC1禁止输出。 1: 开启- OC2信号输出到对应的输出引脚。
CC2通道配置为输入: 该位决定了计数器的值是否能捕获入TIMx_CCR1寄存器。 0:捕获禁止; 0:捕获使能。
TIM3->CR1|=0x0080; //ARPE使能
ARPE:自动重装载预装载允许位 (Auto-reload preload enable)
0:TIMx_ARR寄存器没有缓冲; 1:TIMx_ARR寄存器被装入缓冲器。
//
STM32PWM输出实 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)