STM32复习笔记(十九) —— 高级定时器(PWM互补输出)

STM32复习笔记(十九) —— 高级定时器(PWM互补输出)

1.本例程软件设计思路

使用 TIM1 输出比较,从 TIM1_CH1 and TIM1_CH1N 通道输出一组互补 PWM 波

2.代码编写

于 main.c 中编写代码

#include "stm32f10x.h"
#include "dr_usart.h"

void TIM1_CH1_GPIO_Config(void)
{
	/* 开启 GPIOA 时钟 */
	RCC->APB2ENR |= ((uint16_t)0x01 << 2);
	
	/* 开启 GPIOB 时钟 */
	RCC->APB2ENR |= ((uint16_t)0x01 << 3);
	
	/* 开启 AFIO 时钟 */
	RCC->APB2ENR |= ((uint16_t)0x01 << 0);
	
	/* 配置 TIM1_CH1(PA8) 为复用推挽输出,10MHz */
	GPIOA->CRH &= ~((uint32_t)0x0F << 0);
	GPIOA->CRH |=  ((uint32_t)0x09 << 0);
	
	/* 配置 TIM1_CH1N(PB13) 为复用推挽输出,10MHz */
	GPIOB->CRH &= ~((uint32_t)0x0F << 20);
	GPIOB->CRH |=  ((uint32_t)0x09 << 20);
}

void TIM1_Config(void)
{
	/* 开启 TIM1 时钟 */
	RCC->APB2ENR |= ((uint32_t)0x01 << 11);
	
	/* 向上计数 */
	TIM1->CR1 &= ~((uint16_t)0x07 << 4);
	
	/* 时钟分频因子 */
	TIM1->CR1 &= ~((uint16_t)0x03 << 8);
	
	/* 重装载值 9999+1 */
	TIM1->ARR = ((uint16_t)9999);
	
	/* 预分频器值 71+1 */
	TIM1->PSC = ((uint16_t)71);
	
	/* 重复计数器值 0 */
	TIM1->RCR = ((uint16_t)0);
	
	/* --------- --------- --------- --------- --------- --------- --------- - */
	
	/* 清除 CC1E,禁止输出 */
	TIM1->CCER &= ~((uint16_t)0x01 << 0);
	
	/* 清除 CCMR1 输出模式配置 */
	TIM1->CCMR1 &= ~((uint16_t)0xFF << 0);
	
	/* PWM 模式1 */
	TIM1->CCMR1 |= ((uint16_t)0x06 << 4);
	
	/* OC1 高电平有效 */
	TIM1->CCER &= ~((uint16_t)0x01 << 1);
	
	/* OC1N 高电平有效 */
	TIM1->CCER &= ~((uint16_t)0x01 << 3);
	
	/* OC1 输出使能 */
	TIM1->CCER |= ((uint16_t)0x01 << 0);
	
	/* OC1N 输出使能 */
	TIM1->CCER |= ((uint16_t)0x01 << 2);
	
	/* CCR1 寄存器值 5000 */
	TIM1->CCR1 = ((uint16_t)5000);
	
	/* OIS1 输出空闲状态 */
	TIM1->CR2 |= ((uint16_t)0x01 << 8);
	
	/* OIS1N 输出空闲状态 */
	TIM1->CR2 &= ~((uint16_t)0x01 << 9);
	
	/* --------- --------- --------- --------- --------- --------- --------- - */
	
	/* 禁止自动输出 */
	TIM1->BDTR &= ~((uint16_t)0x01 << 14);
	
	/* 配置 OSSR */
	TIM1->BDTR &= ~((uint16_t)0x01 << 11);
	
	/* 配置 OSSI */
	TIM1->BDTR &= ~((uint16_t)0x01 << 10);
	
	/* 锁定关闭 */
	TIM1->BDTR &= ~((uint16_t)0x03 << 8);
	
	/* 配置死区时间 */
	TIM1->BDTR |= ((uint16_t)0xFF << 0);
	
	/* 主输出使能 */
	TIM1->BDTR |= ((uint16_t)0x01 << 15);
	
	/* 开始计数 */
	TIM1->CR1 |= ((uint16_t)0x01 << 0);
}

int main(void)
{
	/* --------- (81 = 30 + 51) --------- --------- --------- --------- ------ */
	
	User_Init(); /* 中断优先级分组 (16级抢占优先级) and 配置串口1打印调试信息 */
	
	delay_(1);   /* 粗略延时 (约为ms级), 置于此处, 便于使用时复制调用 */
	
	/* --------- 换行基准 --------- --------- --------- --------- --------- -- */
	
	/* 配置 PA8 PB13 */
	TIM1_CH1_GPIO_Config();

	/* 配置 TIM1 */
	TIM1_Config();
	
	while(1);
}

点击编译,如无错误可进入仿真界面
SSS019.001
打开逻辑分析仪
STM32复习笔记(十九) —— 高级定时器(PWM互补输出)_第1张图片
添加 PA8 and PB13
STM32复习笔记(十九) —— 高级定时器(PWM互补输出)_第2张图片
点击运行
STM32复习笔记(十九) —— 高级定时器(PWM互补输出)_第3张图片
不难看出,TIM1_CH1(N) 输出了一组互补并带有死区的 PWM 波,程序运行结果与预想一致

你可能感兴趣的:(stm32)