STM32 使用TIM3的通道3、4输出PWM信号(纯寄存器操作)

STM32 使用TIM3的通道3、4输出PWM信号(纯寄存器操作)


STM32 使用TIM3的通道3、4输出PWM信号(纯寄存器操作)

#define GPIOB_CRL *((unsigned int *)0x40010c00) //寄存器CRL地址
#define GPIOB_CRH *((unsigned int *)0x40010c04)
#define GPIOB_ODR *((unsigned int *)0x40010c0c)
#define GPIOB_BSRR *((unsigned int *)0x40010C10)
#define GPIOB_BRR *((unsigned int *)0x40010C14)

#define RCC_APB2ENR *((unsigned int *)0x40021018)
#define RCC_APB1ENR *((unsigned int *)0x4002101C)
#define RCC_CFGR2 *((unsigned int *)0x4002102C)
#define RCC_CFGR *((unsigned int *)0x40021004)
#define RCC_CR *((unsigned int *)0x40021000)

#define SETENAB_0_31 *((unsigned int *)0xE000E100) //NVIC寄存器配置 中断号0-31使能寄存器 每一位对应一个中断
#define SETENAB_32_63 *((unsigned int *)0xE000E104)

#define TIM3 ((Universal_TIM_TypeDef *) 0x40000400) //通用定时器3地址
typedef struct
typedef struct
{
unsigned int CR1; //控制寄存器
unsigned int CR2; //控制寄存器
unsigned int SMCR;
unsigned int DIER; //DMA/中断允许
unsigned int SR; //状态寄存器
unsigned int EGR; //事件产生寄存器
unsigned int CCMR1; //捕获/比较模式寄存器
unsigned int CCMR2;
unsigned int CCER; //捕获/比较使能寄存器
unsigned int CNT; //计数器
unsigned int PSC; //预分频器
unsigned int ARR; //自动重装载预装载寄存器
unsigned int RESERVED7; //用于占位 无实际意义
unsigned int CRR1; //捕获/比较寄存器
unsigned int CRR2;
unsigned int CRR3;
unsigned int CRR4;
unsigned int RESERVED8;
unsigned int DCR; //DMA控制寄存器
unsigned int DMAR; //DMA地址
} Universal_TIM_TypeDef;
void TIM3_INIT(void)
{
RCC_APB1ENR|=0x0002; //外设时钟TIM3使能
SETENAB_0_31=1<<29; //TIM3全局中断使能

TIM3->CR1=0X0000;        //关闭单脉冲模式  请求源设置为三个都可以   UEV事件使能 边沿对齐  向上计数 定时器关闭    
TIM3->CR1|=0X0080;      //自动重装载预装载使能 ARPE
TIM3->CR2=0X0000;
TIM3->DIER=0X0001;       //更新中断使能
TIM3->SR=0X0000;       //清除中断标志
TIM3->CCMR2=0X787C;    // bit0-1 CC3S=00 通道3配置为输出  bit2=1   输出比较3快速使能   bit3=1 通道3预装载使能   
												//bit4-6=111 输出比较3模式  为PWM2模式(向上计数时大于计数值有效 小于无效)    bit7=0  输出比较3清零使能     输出4同理
TIM3->CCER=0X1100;      //bit9=0 (CC3配置为输出时,为0表示OC3高电平有效)  bit8=1   bit12=1  OC3  OC4输出使能

TIM3->PSC=7199;      //预分频系数    72M/7200=10K,
TIM3->ARR=999;      //计数器自动重装载数值  
TIM3->CRR3=900;
TIM3->CRR4=400;

}
void AFGPIO_INIT(void)
{
RCC_APB2ENR = 0X18; //GPIOB 时钟使能

GPIOB_CRL = 0X444844BB;   	//低8位模式 速度 设置  复用推挽输出 速度50M   TIM3  CH3/PB0,CH4/PB1
GPIOB_CRH = 0X33444444;    	//高8位模式 速度 设置  推挽输出   速度50M
GPIOB_ODR=0X0000;

}
int main(void)
{
AFGPIO_INIT();
TIM3_INIT();
TIM3->CR1|=0X0001; //使能计数器TIM3
while(1)
{
}
}

你可能感兴趣的:(STM32 使用TIM3的通道3、4输出PWM信号(纯寄存器操作))