本实验采用STM32MP157A

头文件:

#ifndef __PWM_H__
#define __PWM_H__#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_tim.h"
#include "stm32mp1xx_rcc.h"
//仨头文件里是别人封装好的地址结构体和宏定义//初始化
void pwm_init();//风扇
void fen_init();//马达
void mada_init();
#endif

功能函数

原理上大同小异,本文以风扇为例。(PF9引脚)

一: 首先是RCC寄存器使能GPIOE和TIM1

查芯片手册可知,GPIOF为AHB4总线,TIM1为APB2总线

    //RCC  PE9使能(GPIOE)RCC->MP_AHB4ENSETR |= (0x1 << 4);//TIM1使能 [0] = 1RCC->MP_APB2ENSETR |= (0x1 << 0);

二. GPIO初始化

设置引脚复用模式

查手册知,输出模式为AFRH[7:4]   =   0x1000

/*********GPIO章节初始化**************///设置引脚复用模式 GPIOE[19:18] = 0x01GPIOE->MODER &= (~(0x3 << 18));GPIOE->MODER |= (0x2 << 18);//设置为AF1:0001 ,AFRH[7:4]GPIOE->AFRH &= (~(0xf << 4));GPIOE->AFRH |= (0x1 << 4);

三 TIM1设置

根据系统处理图,

1. 先设置分频器 系统提供时钟源 209MHz 209

TIM1->PSC &= ~(0xffff);
TIM1->PSC |= 0xd0;  //208

2.设置PWM方波最终周期1000Hz 对自动重载计数器进行赋值 1000

TIM1->ARR &= ~(0xffff);
TIM1->ARR |= (0x3E8);  //1000

3.设置PWM方波占空比 对比较/捕获寄存器进行赋值 700

 TIM1->CCR1 &= (~(0xffff));TIM1->CCR1 |= (0x2bc);

4.设置TIM1_CH1通道为PWM1模式

设置pwm1模式TIM4_CCMR1的16、[6:4] = 0110

TIM1->CCMR1 &= (~(0x1 << 16));  //16位置0
TIM1->CCMR1 &= (~(0x7 << 4));  //6~4位清零
TIM1->CCMR1 |= (0x6 << 4);     //置为110

5.设置TIM1_CH1通道预加载使能

TIM1->CCMR1 |= (0x1 << 3);

6.设置TIM1_CH1通道为输出模式

TIM1->CCMR1 &= (~(0x3 << 0));

7.设置TIM1_CH1通道输出模式极性高电平

TIM1->CCER &= (~(0x1 << 1));

8.设置TIM1_CH1通道比较捕获寄存器输出使能

TIM1->CCER |= (0x1 << 0);

9~12步

//9.设置TIM1_CH1通道自动重载计数器预加载使能
TIM1->CR1 |= (0x1 << 7);//10.设置TIM1_CH1通道采用边沿对其方式
TIM1->CR1 &= (~(0x3) << 5);//11.设置TIM1_CH1通道采用递减计数方式
TIM1->CR1 |= (0x1 << 4);//12.设置TIM1_CH1通道计数器使能
TIM1->CR1 |= (0x1 << 0);

*13.TIM1_BDTR,注意,此为风扇和马达特有的寄存器,蜂鸣器没有

TIM1->BDTR |= (0x1 << 15);

另外俩元件,TIMx寄存器设置方式相同,只是TIMx寄存器编号不同。而RCC寄存器使能和GPIO寄存器设置,则因为三个元件的引脚所在总线和引脚号的区别,导致都完全不同,要查表写。

以下附上完整代码,注意,因为不同芯片的引脚、总线可能不尽相同,此代码仅供参考,切勿照抄

#include "pwm.h"void pwm_init()
{
/***********RCC初始化**************///使能GPIOBRCC->MP_AHB4ENSETR = (0x1 << 1);RCC->MP_APB1ENSETR = (0x1 << 2);  /*****GPIO章节初始化*****/GPIOB->AFRL &= (~(0xf << 24));GPIOB->AFRL |= (0x2 << 24);//设置PB6引脚为输出模式//GPIOB_MODER[13:12] = 0b01GPIOB->MODER &= (~(0x3 << 12));GPIOB->MODER |= (0x2 << 12);/***********TMI4寄存器**************///TIM4_PSC寄存器TIM4->PSC &= ~(0xffff);TIM4->PSC |= 0xd0;  //208//TIM4_ARR寄存器   自动重载寄存器TIM4->ARR &= ~(0xffff);TIM4->ARR |= (0x3E8);  //1000//TIM4_CCMR1寄存器//设置pwm1模式TIM4_CCMR1 16 [6:4] = 0110TIM4->CCMR1 &= (~(0x1 << 16));  //16位置0TIM4->CCMR1 &= (~(0x7 << 4));  //6~4位清零TIM4->CCMR1 |= (0x6 << 4);     //置为110//设置预加载使能TIM4_CCMR1[3] = 1TIM4->CCMR1 |= (0x1 << 3);//设置为输出模式 TIM4_CCMR1[1:0] = 00TIM4->CCMR1 &= (~(0x3 << 0));//TIM4_CCER寄存器//设置为输出模式
//  TIM4->CCER |= (0x1 << 3);//设置起始位高电平TIM4->CCER &= (~(0x1 << 1));//配置输出使能TIM4->CCER |= (0x1 << 0);//TIME4_CCR1TIM4->CCR1 &= (~(0xffff));TIM4->CCR1 |= (0x12c);//TIM4_CR1寄存器//自动承载计数器预加载使能TIM4->CR1 |= (0x1 << 7);//设置边沿对齐模式TIM4->CR1 &= (~(0x3) << 5);//设置递减计数器TIM4->CR1 |= (0x1 << 4);//设置计数器使能TIM4->CR1 |= (0x1 << 0);
}void fen_init()
{//RCC  PE9使能(GPIOE)RCC->MP_AHB4ENSETR |= (0x1 << 4);//TIM1使能 [0] = 1RCC->MP_APB2ENSETR |= (0x1 << 0);/*********GPIO章节初始化**************///设置引脚复用模式 GPIOE[19:18] = 01GPIOE->MODER &= (~(0x3 << 18));GPIOE->MODER |= (0x2 << 18);//设置为AF1:0001 ,AFRH[7:4]GPIOE->AFRH &= (~(0xf << 4));GPIOE->AFRH |= (0x1 << 4);/***********TMI1寄存器***************///1.设置分频器 系统提供时钟源 209MHz 209TIM1->PSC &= ~(0xffff);TIM1->PSC |= 0xd0;  //208//2.设置PWM方波最终周期1000Hz 对自动重载计数器进行赋值 1000TIM1->ARR &= ~(0xffff);TIM1->ARR |= (0x3E8);  //1000//3.设置PWM方波占空比 对比较/捕获寄存器进行赋值 700TIM1->CCR1 &= (~(0xffff));TIM1->CCR1 |= (0x2bc);//4.设置TIM1_CH1通道为PWM1模式//设置pwm1模式TIM4_CCMR1 16 [6:4] = 0110TIM1->CCMR1 &= (~(0x1 << 16));  //16位置0TIM1->CCMR1 &= (~(0x7 << 4));  //6~4位清零TIM1->CCMR1 |= (0x6 << 4);     //置为110//5.设置TIM1_CH1通道预加载使能TIM1->CCMR1 |= (0x1 << 3);//6.设置TIM1_CH1通道为输出模式TIM1->CCMR1 &= (~(0x3 << 0));//7.设置TIM1_CH1通道输出模式极性高电平TIM1->CCER &= (~(0x1 << 1));    //8.设置TIM1_CH1通道比较捕获寄存器输出使能TIM1->CCER |= (0x1 << 0);//9.设置TIM1_CH1通道自动重载计数器预加载使能TIM1->CR1 |= (0x1 << 7);//10.设置TIM1_CH1通道采用边沿对其方式TIM1->CR1 &= (~(0x3) << 5);//11.设置TIM1_CH1通道采用递减计数方式TIM1->CR1 |= (0x1 << 4);//12.设置TIM1_CH1通道计数器使能TIM1->CR1 |= (0x1 << 0);//13.TIM1_BDTR TIM1->BDTR |= (0x1 << 15);
}void mada_init()
{//RCC  PF6使能(GPIOE)RCC->MP_AHB4ENSETR |= (0x1 << 5);//TIM16使能 [0] = 1RCC->MP_APB2ENSETR |= (0x1 << 3);/*********GPIO章节初始化**************///设置引脚复用模式 GPIOE[13:12] = 01GPIOF->MODER &= (~(0x3 << 12));GPIOF->MODER |= (0x2 << 12);//设置为AF1:0001 ,AFRH[27:24]GPIOF->AFRL &= (~(0xf << 24));GPIOF->AFRL |= (0x1 << 24);/***********TMI1寄存器***************///1.设置分频器 系统提供时钟源 209MHz 209TIM16->PSC &= ~(0xffff);TIM16->PSC |= 0xd0;  //208//2.设置PWM方波最终周期1000Hz 对自动重载计数器进行赋值 1000TIM16->ARR &= ~(0xffff);TIM16->ARR |= (0x3E8);  //1000//3.设置PWM方波占空比 对比较/捕获寄存器进行赋值 300TIM16->CCR1 &= (~(0xffff));TIM16->CCR1 |= (0x2bc);//4.设置TIM1_CH1通道为PWM1模式//设置pwm1模式TIM4_CCMR1 16 [6:4] = 0110TIM16->CCMR1 &= (~(0x1 << 16));  //16位置0TIM16->CCMR1 &= (~(0x7 << 4));  //6~4位清零TIM16->CCMR1 |= (0x6 << 4);     //置为110//5.设置TIM1_CH1通道预加载使能TIM16->CCMR1 |= (0x1 << 3);//6.设置TIM1_CH1通道为输出模式TIM16->CCMR1 &= (~(0x3 << 0));//7.设置TIM1_CH1通道输出模式极性高电平TIM16->CCER &= (~(0x1 << 1));   //8.设置TIM1_CH1通道比较捕获寄存器输出使能TIM16->CCER |= (0x1 << 0);//9.设置TIM1_CH1通道自动重载计数器预加载使能TIM16->CR1 |= (0x1 << 7);//10.设置TIM1_CH1通道采用边沿对其方式TIM16->CR1 &= (~(0x3) << 5);//11.设置TIM1_CH1通道采用递减计数方式TIM16->CR1 |= (0x1 << 4);//12.设置TIM1_CH1通道计数器使能TIM16->CR1 |= (0x1 << 0);//13.TIM1_BDTR TIM16->BDTR |= (0x1 << 15);
}

蜂鸣器、风扇、震动马达相关推荐

  1. Arduino UNO R3开发板+MQ-2烟雾浓度传感器+火焰传感器+舵机+无源蜂鸣器+风扇+步进电机+WIFI模块+RGB三色LED灯+SIM900A所构成的室内安全报警模块

    该系统模块主要由Arduino UNO R3开发板+MQ-2烟雾浓度传感器+火焰传感器+舵机+无源蜂鸣器+风扇+步进电机+WIFI模块+RGB三色LED灯+SIM900A所组成,MQ-2烟雾浓度传感器 ...

  2. PWM实验:蜂鸣器、风扇和马达

    1.作业要求 编写蜂鸣器/风扇/马达代码. 2.实现过程 1)pwm.h头文件 #ifndef __PWM_H__ #define __PWM_H__#include "stm32mp1xx ...

  3. stm32mp1 Cortex M4开发篇12:扩展板震动马达控制

    写在前面: 本文章为<ARM Cortex-M4裸机开发篇>系列中的一篇,,全系列总计14篇.笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板),Cortex- ...

  4. PWM实验(控制蜂鸣器,风扇,马达)

    cortex-A7核实现PWM对蜂鸣器,风扇,马达的控制 1.PWM概念 PWM为一种对模拟信号电平进行数字编码的方法,通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码 ...

  5. PWM方波驱动风扇,蜂鸣器,马达工作

    重点:会分析电路图,确定总线和引脚,通过这两个找到对应的地址设置相应位置上的值.库函数中已经封装好了相应的结构体指针对应的地址,可以直接根据名字访问结构体成员.使用非常方便 #include &quo ...

  6. STM32MP157 A7核蜂鸣器,风扇,马达

    pwm.c #include "pwm.h"//蜂鸣器初始化 TIM4_CH1 PB6 void hal_beep_init() {//rcc章节初始化RCC->MP_APB ...

  7. stm32 马达,风扇,蜂鸣器

    电路分析 由图可知 蜂鸣器:TIM4_CH1---->PB6 风扇:TIM1_CH1---->PE9 马达:TIM16_CH1---->PF6 可以用以下代码检查硬件是否正常 gpi ...

  8. 基于STM32MP157A的蜂鸣器,马达,震动马达PWM实验

    PWM实验 PWM概念 代码实现 pwm.c pwm.h main.c PWM概念 1.PWM:脉冲宽度调制定时器 2.脉冲:方波信号,高低电平的变化产生方波信号 3.周期:高低电平变化所需要的时间, ...

  9. 台式计算机打不了蜂鸣,电脑主机启动不了,开机蜂鸣器也不响,主板指示灯

    公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:电脑主机启动不了,开机蜂鸣器也不响,主板指示灯亮电源回答:清理一下里面各个接口,和内存条就OK了 参考回答:这个不好说那里的问题,有 ...

最新文章

  1. mysql40190_MySQL 内核深度优化
  2. 多线程编程 java_java多线程编程
  3. Linux下使用OTL操作mysql数据库
  4. CTFshow 命令执行 web62
  5. 从美图、4399生根,到趣店、瑞幸落户,厦门离中国的西雅图还有多远?
  6. 20. C# -- Base, this 关键字
  7. 单片机c语言出租车计时程序,基于单片机的出租车计费(c语言).doc
  8. android_ratingbar的使用错误
  9. Python+OpenCV:尺度不变特征变换(SIFT)的加速健壮特性(SURF)
  10. JAVA贪吃蛇游戏1.0版本
  11. 多维数据查询效率分析(2)
  12. struts2通配符使用
  13. html网页加线条,「网站特效」html5 canvas粒子线条特效制作方法
  14. 上瘾读书笔记:让用户养成使用习惯的四大产品逻辑
  15. mac提示“已损坏,无法打开。 您应该将它移到废纸篓“的终极解决方案
  16. 精短高效的XML解析器,纯C单一程序,应用于银行的国税库行横向联网接口系统中,稳定可靠,运行速度飞快
  17. 经方败案群20150303李小荣讲桂枝芍药知母汤
  18. 文件数字签名校验与信息获取
  19. 艾为aw87359 PA 关机状态下会漏电
  20. 科学中的人工智能革命

热门文章

  1. 海子的诗-以梦为马(祖国)
  2. 如何从ext3升级到ext4?
  3. Jmeter 之 Beanshell 用法
  4. 美赛BOOM数学建模4-3马尔科夫预测
  5. dump文件深度分析
  6. Driller分析与改进(二)
  7. 2013年9月16日
  8. Android 2018优秀开源框架整理收藏
  9. 手把手教你制作一目了然的可视化地图
  10. 毕业论文中的“自动生成目录”设置(经验四)