资讯详情

STM32自带PWM输出实验

#include <stm32f10x_lib.h> #include "sys.h" #include "delay.h" #include "usart.h" #define LED0_val M3->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_C TIMx_CCR1时通道1为有效电平,否则为无效电平。 默认为高电平有效 计数模式是 TIM3_CR1 中 位4决定 位4 0:向上计数; 1:计数器向下计数。 默认为向上计数模式 定时器的值从0-----> TIM->ARR 到自动装载值 循环变化 //--------------------------------------------------------------------------------------- TIM3->CCMR1|=1<<11; //CH2预装载使能 TIM3->CCER|=1<<4; //OC2输出使能 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寄存器被装入。 //

还有一篇我发布的是定时器产生的pwm: http://www.ruidan.com/mcu/2125.html

-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台