----------接着上一篇笔记写

  • 八、OC输出比较
  • 九、PWM配置
    • 1、RCC开启时钟
    • 2、配置时基单元
    • 3、配置输出比较单元
    • 4、配置GPIO
    • 5、运行控制
    • 输出比较的函数介绍
  • 十、重映射(重映像)
  • 十一、了解部分

八、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 headervoid 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、配置GPIOGPIO_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=====固定住的话,周期就是100TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;      //PSC=====固定住的话,周期就是100TIM_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);

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

  1. 01、【江科大自化协stm32F103c8t6】笔记之【入门32单片机及GPIO初始化参数配置】

    目录 一.前言 二.必要资料 1.C语言类型 2.片上资源/外设 3.引脚定义 4.系统结构 三.GPIO初始化 1.首先使用RCC开启GPIO的时钟 2.其次使用GPIO_Init函数初始化GPIO ...

  2. 02、【江科大自化协stm32F103c8t6】笔记之【入门32单片机及EXTI外部中断初始化参数配置】

    ----------接着上一篇笔记写 四.返回值函数 五.EXTI外部中断 1.配置RCC 2.配置GPIO 3.配置AFIO 4.配置EXTI 5.配置NVIC 中断函数 四.返回值函数 uint8 ...

  3. b站江科大自化协51单片机入门教程笔记(2)

    文章目录 6-1 矩阵键盘 6-2 矩阵键盘密码锁 7-1 定时器 7-2 按键控制LED流水灯 & 定时器时钟 独立按键模块 定时器模块 8-1 串口通信 8-2 串口向电脑发送数据 &am ...

  4. b站江科大自化协51单片机入门教程笔记(1)

    文章目录 1 综述 2-1 点亮一个LED 2-2 LED闪烁 2-3 LED流水灯 2-4 LED流水灯PLus 3-1 独立按键控制LED亮灭 3-2 独立按键控制LED状态 3-3 独立按键控制 ...

  5. 一份标准的STM32工程模板都需要哪些文件?(B站江科大自化协)

    大家好,我是烟火.目前BMS软件工程师在职,利用自由时间,输出一些基础知识合集,一方面巩固,另一方面写博客作为成长记录. 人间清醒: 明明有能力可以变成更优秀的人 遇见更好的人 过更喜欢的生活 如果因 ...

  6. 17、江科大stm32视频学习笔记——USART串口协议和USART串口外设

    目录 1.通信接口 2. 硬件电路 3.电平标准 4.串口参数及时序 5.USART简介 6.USART工作 (1)写操作 (2)读操作 (3)帧头和帧尾的添加和除由电路自动执行 (4)硬件数据控制流 ...

  7. 7、江科大stm32视频学习笔记——中断的应用:对射式红外传感器计次旋转编码器计次

    目录 1.标志位函数 2. 初始化的中断的步骤 3.对射式红外传感器计次 (1)接线图 (2)CountSensor.c (3)main.c 4.旋转编码器计次 (1)接线图(旋转编码器接在PB1.P ...

  8. 51单片机入门(江科大)之个人笔记

    目录 P3.单片机及开发板介绍 P4.点亮一个小灯泡 P5.LED闪烁 P6.LED流水灯 P7.独立按键控制LED亮灭 P8.独立按键控制LED状态 P9.独立按键控制LED显示二进制 P10.独立 ...

  9. 14、江科大stm32视频学习笔记——AD单通道和AD多通道代码

    目录 一.程序现象 1.AD单通道 2.AD多通道 二.原理图 三.AD单通道 1.AD.c(单次转换非扫描) 2.改为连续转换非扫描 3.main.c 四.AD双通道(单次转换非扫描) 1.思路 2 ...

最新文章

  1. 爬虫请求库 requests
  2. Spring IOC 容器源码分析 - 创建原始 bean 对象
  3. 使用Linq判断DataTable数据是否重复
  4. php:自定义session
  5. Nandflash希尔特编程器烧录带来的一些点知识信息
  6. python为什么不会溢出_深入分析python中整型不会溢出问题
  7. python3生成二维码实例fromm_Python使用mqtt极简例子
  8. uniapp图标_uniapp扩展自定义uniIcon组件图标
  9. Win11没有操作中心怎么办 Win11没有操作中心的解决方法
  10. ZEROC究竟是何方神圣? Leader-us 大神来的回答 Leader-us mycat的发起者
  11. django 1.8 官方文档翻译: 1-2-5 编写你的第一个Django应用,第5部分
  12. mysql锁优化_mysql锁以及配置优化
  13. 高接低挡,Isilon三款新品铺开战线
  14. java 电子书下载
  15. DHCP八种报文及其详解
  16. HanLp的应用 - 真实使用
  17. python使用多线程爬取
  18. 北京科技计算机类好不好,北京信息科技大学怎么样 在全国排名多少好不好
  19. 网易乐商北京(电面一)
  20. mac电脑usb连接android手机,Android安卓设备连接Mac的方法

热门文章

  1. 利用clipboardJs 点击按钮复制文本
  2. DBeaver 操作数据库
  3. Android DownloadManager下载管理,app更新
  4. Stereogram(极射赤面)投影--主要用于中高纬和极区的天气图
  5. Mac 5年了 清理了一下多出了 70个G
  6. UVM实战书籍再复习
  7. orbot android教程,Android Orbot malformed reply from SOCKS server
  8. java开发人员macOS系统上需要安装软件以及常用快捷键
  9. 电脑一直刷频,求解答
  10. Pytorch中shuffle=True的作用