一、思路
通过 Tim 定时器可以设置多路 PWM 实现呼吸灯,所以我们使能一个 TIM3,因为 TIM3 的通道2(CH2)正好映射到 PB5(LED)
然后配置 PB5 为复用推挽输出,50MHZ
pwm通过定时器 TIM3 的计数器 CNT 从 0 到 ARR(ARR可以设置为0-65535) 进行周期的自增或自减, CNT 每自增或自减一次与 CCR2 比较一次,CCR2的值由我们自己设置,一般通过 while 循环按照我们希望的时间 比如1s增加1
如果在PWM模式1下 CNT向上计数时 CNT < CCR2 则将 PB5设为高电平
如果在PWM模式2下 CNT向上计数时 CNT < CCR2 则将 PB5设为低电平
通过 占空比 = 高电平时间 / 总时间 的变化实现呼吸灯效果
二、pwm_init()代码
void pwm_init() {
//1.配置AFIO 进行端口映射
//使能AFIO
RCC->APB2ENR |= 1 << 0;
//使能GPIOB RCC时钟
RCC->APB2ENR |= 1 << 3;
//使能TIM3
RCC->APB1ENR |= 1 << 1;
//把TIM3部分映射到GPIOB5
AFIO->MAPR |= 1 << 11;
AFIO->MAPR &= ~(1 << 10);
//2.配置GPIOB5端口
//设置GPIOB5为 复用推挽输出 即 [23:22] = CNF[1:0]
GPIOB->CRL |= 1 << 23;
GPIOB->CRL &= ~(1 << 22);
//设置GPIOB5为 输出模式 速度50MHZ 即 [21:20] = MODE[1:1]
GPIOB->CRL |= 1 << 21;
GPIOB->CRL |= 1 << 20;
//LED-OFF
GPIOB->ODR |= 1 << 5;
//3.配置TIM3
//PSC为定时器的分频器
TIM3->PSC = 0;
//ARR为定时器计数上限 设置自动重装载值
TIM3->ARR = 5000;
//TIM3->CH2 设置PWM模式1
TIM3->CCMR1 |= 6 << 12;
//TIM3->CH2 预装载使能
TIM3->CCMR1 |= 1 << 11;
//TIM3->CH2 输出使能
TIM3->CCER |= 1 << 4;
TIM3->CR1 |= 1 << 7;
//使能计数器
TIM3->CR1 |= 1 << 0;
//通过while循环设置TIM3->CCR2的值
int nFlag = 1;
int nPwmValue = 0;
while (1) {
//通过for循环设置每次变化时间
for (volatile int i = 0; i < 100; i++) {}
//通过设置 nFlag 的设置自增或自减
if (nFlag) {
nPwmValue++;
} else {
nPwmValue--;
}
//设置周期最大值
if (nPwmValue >= 5000) {
nFlag = 0;
}
//设置周期最小值
if (nPwmValue <= 0) {
nFlag = 1;
}
//设置 CCR2 的值
TIM3->CCR2 = nPwmValue;
}
}
三、 分步讲解
1.配置AFIO 进行端口映射 (部分芯片可能不支持 可采用跳线方式实现)
//使能AFIO
RCC->APB2ENR |= 1 << 0;
//使能GPIOB RCC时钟
RCC->APB2ENR |= 1 << 3;
//使能TIM3
RCC->APB1ENR |= 1 << 1;
//把TIM3部分映射到GPIOB5
AFIO->MAPR |= 1 << 11;
AFIO->MAPR &= ~(1 << 10);
2.配置GPIOB5端口
//设置GPIOB5为 复用推挽输出 即 [23:22] = CNF[1:0]
GPIOB->CRL |= 1 << 23;
GPIOB->CRL &= ~(1 << 22);
//设置GPIOB5为 输出模式 速度50MHZ 即 [21:20] = MODE[1:1]
GPIOB->CRL |= 1 << 21;
GPIOB->CRL |= 1 << 20;
//LED-OFF
3.配置TIM3
//PSC为定时器的分频器
TIM3->PSC = 0;
//ARR为定时器计数上限 设置自动重装载值
TIM3->ARR = 5000;
//TIM3->CH2 设置PWM模式1
TIM3->CCMR1 |= 6 << 12;
//TIM3->CH2 预装载使能
TIM3->CCMR1 |= 1 << 11;
//TIM3->CH2 输出使能
TIM3->CCER |= 1 << 4;
//使能 ARPE ARR寄存器的值被装入缓冲器。
TIM3->CR1 |= 1 << 7;
//使能计数器
TIM3->CR1 |= 1 << 0;
//通过while循环设置TIM3->CCR2的值
int nFlag = 1;
int nPwmValue = 0;
while (1) {
//通过for循环设置每次变化时间
for (volatile int i = 0; i < 100; i++) {}
//通过设置 nFlag 的设置自增或自减
if (nFlag) {
nPwmValue++;
} else {
nPwmValue--;
}
//设置周期最大值
if (nPwmValue >= 5000) {
nFlag = 0;
}
//设置周期最小值
if (nPwmValue <= 0) {
nFlag = 1;
}
//设置 CCR2 的值
TIM3->CCR2 = nPwmValue;
}
上一篇:基于STM32最简单的呼吸灯
下一篇:STM32入门学习之GPIO(STM32F030F4P6基于CooCox IDE)(寄存器操作版
推荐帖子
- 【MSPM0L1306 LaunchPad】 7 UART基本实验(1)
- 【MSPM0L1306LaunchPad】7UART基本实验(1)【MSPM0L1306LaunchPad】1开箱+环境搭建+点灯【MSPM0L1306LaunchPad】2GUIComposerGUI玩板子【MSPM0L1306LaunchPad】3Ti云开发环境【MSPM0L1306LaunchPad】4用MDK环境点灯【MSPM0L1306LaunchPad】5用ccstheia环境点灯【MS
- damiaa MSPM0 MCU
- TT50短信透明收发模块PCB封装
- TT50短信透明收发模块PCB封装TT50短信透明收发模块PCB封装
- songbo 模拟电子
- 想请个嵌入式工程师指导一下自己
- 自己在学习linux嵌入式开发两个多月了,主是linux系统移植,和驱动程序开发。本人现在在武汉,希望你在武汉工作。不会占用你太多时间,在你有空的时候指导一下。价钱面议qq41013774想请个嵌入式工程师指导一下自己这个祝楼主好运吧,顶一下!师傅领进门,修行在个人在武汉?哎武汉这方面的人不是很多
- jiangxuewz 嵌入式系统
- 求问带SDK定制的FPGA的型号与大致价位
- 学校要和企业做一个项目,想用FPGA做数据库的东西,我想问问带SDK定制的FPGA都有哪些型号?大概价格是多少?谢谢大家~!求问带SDK定制的FPGA的型号与大致价位带SDK定制的?不懂,可以问问FAE
- sukidasakura EE_FPGA学习乐园
- PCB参考层
- 在PCB的设计向导中,会出现如图所示对话框,问你要不要指定电源或者地参考层的数目,老师教的时候没提到这个,我也一直是按默认做的,但看见网上好多设计都涉及到接地参考层,所以想请教一下设置参考层与否有什么区别? PCB参考层附件请重新上传如遇到问题请通过站内短信联系我回复楼主zzbaizhi的帖子无法上传附件或者图片回复沙发soso的帖子请通过站短告知我你的登陆密码我试试:)我刚刚找了个ID试了一下没有问题是不是网速的问题?还是弹出什么提示呢?如果是99
- zzbaizhi PCB设计
- Cortex-M3 的指针问题
- 急急??各位大虾我想问一下在Cortex-M3的内核下我定义一个32位的指针P,我把P加一是不是相当于加的4如果是16位的地址指针是不是相当于加的是2啊Cortex-M3的指针问题是这个与内核无关吧哦谢谢了昨晚发了我才猛然发现翻了这么个低级错误
- 爱好汽车电子 微控制器 MCU
设计资源 培训 开发板 精华推荐
- DER-803 - 60 W USB PD 3.0,采用 3.3 V-21 V PPS 电源,使用 InnoSwitch3-Pro 和 VIA Labs VP302 控制器
- 久绘PCB1.0
- LT3091HT7 2 端子电流源的典型应用
- 使用 Diodes Incorporated 的 PT8A3518 的参考设计
- TCR4S28DWBG、200mA、2.8V输出电压CMOS低压降稳压器的典型应用
- ENC28J60,以太网 PICtail Plus 子板
- OP184ESZ-REEL 3V 单电源、50Hz 至 60Hz 有源陷波滤波器和假接地的典型应用
- 使用 ROHM Semiconductor 的 BD5236 的参考设计
- 使用 Aimtec 的 AM2M-0515D-NZ 的参考设计
- SM840021,用于 SM840021 的评估板,用于以太网交换机的 125 MHz PLL 时钟发生器