- 寄存器版本
参考手册:
STM32F4xx中文参考手册.pdf
STM32F405xx,STM32F407xx.pdf
- pwm.h
#ifndef __PWM_H
#define __PWM_H
#include "sys.h"
//模块使能宏
#define TIM1_NUM 1
#define TIM5_NUM 1
#define PWM1 TIM1->CCR1
#define PWM2 TIM1->CCR2
#define PWM3 TIM1->CCR3
#define PWM4 TIM1->CCR4
#define PWM5 TIM5->CCR1
#define PWM6 TIM5->CCR2
#define PWM7 TIM5->CCR3
#define PWM8 TIM5->CCR4
//输出通道初始化
void out_pwm_io_init(u16 arr,u16 psc);
//TIM PWM输出
void setPwm(uint16_t num0,uint16_t num1,uint16_t num2,uint16_t num3);
#endif
#include"pwm.h"
void out_pwm_io_init(u16 arr,u16 psc)
{
#if TIM1_NUM==1
/******* TIM1 CH1_E9 CH2_E11 CH3_E13 CH4_E14 *******/
RCC->AHB1ENR|=1<<4;
RCC->APB2ENR|=1<<0;
GPIO_Set(GPIOE,PIN9|PIN11|PIN13|PIN14,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);
GPIO_AF_Set(GPIOE,9|11|13|14,1);
TIM1->ARR=arr; //设定计数器自动重装值
TIM1->PSC=psc; //设定预分频系数
TIM1->CCMR1 |=6<<4; //CH1 PWM1 模式
TIM1->CCMR1 |=6<<12; //CH2 PWM1 模式
TIM1->CCMR2 |=6<<4; //CH3 PWM1
TIM1->CCMR2 |=6<<12;//CH4 PWM1
TIM1->CCMR1 |=1<<3; // ch1预装载使能
TIM1->CCMR1 |=1<<11; // ch2预装载使能
TIM1->CCMR2 |=1<<3;// ch3预装载使能
TIM1->CCMR2 |=1<<11;// ch4预装载使能
/****/
TIM1->EGR|=1<<0; //ug位置一 不知道加这一句有什么用 看手册需要加
TIM1->CCER |=1<<0; //oc1 输出使能
TIM1->CCER |=0<<1; //oc1 高电平有效
TIM1->CCER |=1<<4; //CH2输出使能
TIM1->CCER |=0<<5; //oc2 高电平有效
TIM1->CCER |=1<<8; //CH3输出使能
TIM1->CCER |=0<<9; //oc3 高电平有效
TIM1->CCER |=1<<12; //CH4输出使能
TIM1->CCER |=0<<13; //oc4 高电平有效
//TIM4->BDTR |= 1<<15; //TIM1必须要这句话才能输出PWM
TIM1->CR1|=1<<7; //arpe使能
TIM1->CR1|=1<<0; //使能定时器4
#endif
#if TIM5_NUM==1
// TIM5 CH1_A0 CH2_A1 CH3_A2 CH4_