04、【江科大自化协stm32F103c8t6】笔记之【入门32单片机及利用TIM输出比较配置PWM】

八、OC输出比较

  • OC (output compare) 输出比较 比较CNT 和 CCR 寄存器的关系
  • IC (input compare) 输入捕获
  • CC (capture compare)输入捕获 和输出比较单元
    在这里插入图片描述
    在这里插入图片描述
    CNT计数
    CCR是我们给定的一个值

九、PWM配置

在这里插入图片描述
余晖和人眼视觉暂留现象(控制LED灯、电机、舵机(pwm作为一种通信协议)等)--------------------------------------->惯性的系统
在这里插入图片描述
一般来说,只用上面红框中的

在这里插入图片描述
————————————————————————————想要输出PWM波,就需要把下面的模块打通————————————————————————
在这里插入图片描述

1、RCC开启时钟

打开TIM外设和GPIO外设时钟

2、配置时基单元

包括前面的时钟源选择 + 时基单元配置
这个代码之前写过
在这里插入图片描述

3、配置输出比较单元

在这里插入图片描述
里面包括CCR的值、输出比较模式、极性选择、输出使能这些参数,在库函数里也是用结构体统一来配置的

4、配置GPIO

把PWM对应的GPIO口,初始化为复用推挽输出的配置(GPIO初始化代码习惯放在上面)

5、运行控制

启动计数器,这样就能输出PWM了

——————————————————————————————————————————————————————————————

下面展示一下代码(包括重映射):

#include "stm32f10x.h"                  // Device header

void PWM_Init(void)
{   
//RCC开启时钟,和TIM定时中断一样

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);  //引脚重映射用到AFIO,开启AFIO时钟
	
	//GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE); //引脚重映射配置 (部分重映射1,使能) 这样就能把PA0换成PA15了    //查表TIM2复用功能重映像
	//GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//解除JTAG调试端口,可以使用PA15,PB3,PB4(一般我们解除JTAG的调试端口,保留SWD调试端口),GPIO_PinRemapConfig()是重映射函数



//总结:如果你想让PA15、PB3、PB4这三个引脚当作GPIO来使用的话,就加一下上面注释掉的1、3句,先打开AFIO,再用AFIO将JTAG复用解除掉
//     如果你想重映射定时器或者其他外设的复用引脚,那就加一下上面注释掉的1、2句,先打开AFIO,再用AFIO重映射外设复用的引脚
//     如果你重映射的引脚又正好是调试端口,那这上面注释掉的三句都得加上,打开AFIO,重映射外设复用的引脚,解除调试端口




//4、配置GPIO

	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //选择复用推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;		//重映射之后 GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
//2、配置时基单元

	TIM_InternalClockConfig(TIM2);//选择时基单元的时钟,选择内部时钟,可以不写,因为定时器上电后默认选择内部时钟


	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;		//ARR=====固定住的话,周期就是100
	TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;		//PSC=====固定住的话,周期就是100
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);

//3、配置输出比较单元

	TIM_OCInitTypeDef TIM_OCInitStructure;//初始化输出比较单元
	TIM_OCStructInit(&TIM_OCInitStructure); //给结构体赋初始值 里面定义默认给的初始值,防止高级定时器出错
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM1模式
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出比较极性 high 高级性 极性不翻转 有效电平为高电平
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = 0;		//CCR寄存器的值   多少就是百分之多少的占空比
	TIM_OC1Init(TIM2, &TIM_OCInitStructure);//PA0口对应第一个输出比较通道OC1
//CCR ARR PSC共同决定pwm的周期和占空比  ★看公式

//5、运行控制

	TIM_Cmd(TIM2, ENABLE);
}

void PWM_SetCompare1(uint16_t Compare)
{
	TIM_SetCompare1(TIM2, Compare); //CCR为0,通过setcompare可以设置CCR的值,单独更改通道1的CCR的值
}

输出比较的函数介绍

这四个函数就是配置输出比较模块,一个函数配置一个单元

void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

用来给输出比较结构体赋一个默认的值的

void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct);

//——————————————————————————————————————————————★★★★★★★★★★———————————————————————————————到这里,输出比较的配置基本完成————————————————————————



单独修改CCR寄存器值的函数————————————————————————————————————★★★★★★★★★★——————————————————更改占空比所用到的四个函数—————————————————————————

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);

————————————————————————————————————————————————★★★★★★★★★★——————————
在这里插入图片描述

十、重映射(重映像)

使用AFIO复用功能引脚重映射
重映射方式和引脚对应关系 ,选择重映射方式 查看参考手册
在这里插入图片描述
gpio.c 选择重映射方式

GPIO_PartialRemap1_TIM2 //部分重映射1
GPIO_PartialRemap2_TIM2//部分重映射2
GPIO_FullRemap_TIM2//完全重映射

在这里插入图片描述
在这里插入图片描述
GPIO_PinRemapConfig()是重映射函数

—————————————————————————————————————————————————————————————————————————

解除调试端口参数:

  *     @arg GPIO_Remap_SWJ_NoJTRST      : Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST//解除JTRST引脚的复用   PB4------>GPIO
  *     @arg GPIO_Remap_SWJ_JTAGDisable  : JTAG-DP Disabled and SW-DP Enabled//解除JTAG调试端口的复用 PA15、PB3、PB4
  *     @arg GPIO_Remap_SWJ_Disable      : Full SWJ Disabled (JTAG-DP + SW-DP)//把SWD和JTAG的调试端口全部解除掉
  • 把SWD和JTAG的调试端口全部解除掉,5个引脚全部变成GPIO,没有调试功能了,之后st-link下载不进去程序了,只能使用串口下载,下载一个新的没有调试端口的程序,这样才能把调试端口弄回来,这个参数不能乱用
    在这里插入图片描述

十一、了解部分

1、配置强制输出模式

void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);

2、配置CCR寄存器的预装功能的,影子寄存器,写入的值不会立即生效,而是在更新事件才会生效

void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);

3、配置快速使能的

void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);

4、这个功能在手册里,外部事件时清除REF信号,那一节有介绍

void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);

5、单独设置输出比较的极性的

void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);//这里带“N”的就是高级定时器里互补通道的配置
void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);//OC4没有互补通道

6、单独修改输出使能参数的

void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx);
void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN);

7、选择输出比较模式


void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode);

  • 13
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Clockwisee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值