04、【江科大自化协stm32F103c8t6】笔记之【入门32单片机及利用TIM输出比较配置PWM】
----------接着上一篇笔记写
- 八、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】相关推荐
- 01、【江科大自化协stm32F103c8t6】笔记之【入门32单片机及GPIO初始化参数配置】
目录 一.前言 二.必要资料 1.C语言类型 2.片上资源/外设 3.引脚定义 4.系统结构 三.GPIO初始化 1.首先使用RCC开启GPIO的时钟 2.其次使用GPIO_Init函数初始化GPIO ...
- 02、【江科大自化协stm32F103c8t6】笔记之【入门32单片机及EXTI外部中断初始化参数配置】
----------接着上一篇笔记写 四.返回值函数 五.EXTI外部中断 1.配置RCC 2.配置GPIO 3.配置AFIO 4.配置EXTI 5.配置NVIC 中断函数 四.返回值函数 uint8 ...
- b站江科大自化协51单片机入门教程笔记(2)
文章目录 6-1 矩阵键盘 6-2 矩阵键盘密码锁 7-1 定时器 7-2 按键控制LED流水灯 & 定时器时钟 独立按键模块 定时器模块 8-1 串口通信 8-2 串口向电脑发送数据 &am ...
- 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 独立按键控制 ...
- 一份标准的STM32工程模板都需要哪些文件?(B站江科大自化协)
大家好,我是烟火.目前BMS软件工程师在职,利用自由时间,输出一些基础知识合集,一方面巩固,另一方面写博客作为成长记录. 人间清醒: 明明有能力可以变成更优秀的人 遇见更好的人 过更喜欢的生活 如果因 ...
- 17、江科大stm32视频学习笔记——USART串口协议和USART串口外设
目录 1.通信接口 2. 硬件电路 3.电平标准 4.串口参数及时序 5.USART简介 6.USART工作 (1)写操作 (2)读操作 (3)帧头和帧尾的添加和除由电路自动执行 (4)硬件数据控制流 ...
- 7、江科大stm32视频学习笔记——中断的应用:对射式红外传感器计次旋转编码器计次
目录 1.标志位函数 2. 初始化的中断的步骤 3.对射式红外传感器计次 (1)接线图 (2)CountSensor.c (3)main.c 4.旋转编码器计次 (1)接线图(旋转编码器接在PB1.P ...
- 51单片机入门(江科大)之个人笔记
目录 P3.单片机及开发板介绍 P4.点亮一个小灯泡 P5.LED闪烁 P6.LED流水灯 P7.独立按键控制LED亮灭 P8.独立按键控制LED状态 P9.独立按键控制LED显示二进制 P10.独立 ...
- 14、江科大stm32视频学习笔记——AD单通道和AD多通道代码
目录 一.程序现象 1.AD单通道 2.AD多通道 二.原理图 三.AD单通道 1.AD.c(单次转换非扫描) 2.改为连续转换非扫描 3.main.c 四.AD双通道(单次转换非扫描) 1.思路 2 ...
最新文章
- 爬虫请求库 requests
- Spring IOC 容器源码分析 - 创建原始 bean 对象
- 使用Linq判断DataTable数据是否重复
- php:自定义session
- Nandflash希尔特编程器烧录带来的一些点知识信息
- python为什么不会溢出_深入分析python中整型不会溢出问题
- python3生成二维码实例fromm_Python使用mqtt极简例子
- uniapp图标_uniapp扩展自定义uniIcon组件图标
- Win11没有操作中心怎么办 Win11没有操作中心的解决方法
- ZEROC究竟是何方神圣? Leader-us 大神来的回答 Leader-us mycat的发起者
- django 1.8 官方文档翻译: 1-2-5 编写你的第一个Django应用,第5部分
- mysql锁优化_mysql锁以及配置优化
- 高接低挡,Isilon三款新品铺开战线
- java 电子书下载
- DHCP八种报文及其详解
- HanLp的应用 - 真实使用
- python使用多线程爬取
- 北京科技计算机类好不好,北京信息科技大学怎么样 在全国排名多少好不好
- 网易乐商北京(电面一)
- mac电脑usb连接android手机,Android安卓设备连接Mac的方法