文章目录

  • 作业内容
  • 思路分析
    • 1. 电路分析
    • 2. RCC章节分析
    • 3. GPIO章节分析
    • 4. TIM4章节分析(以蜂鸣器为例)
  • 代码实现
    • pwm.h
    • pwm.c
    • main.c

作业内容

完成PWM实验:实现蜂鸣器发出响声、马达震动和风扇转动

思路分析

1. 电路分析



蜂鸣器:TIM4_CH1---->PB6 gpio toggle gpiob6
风扇:TIM1_CH1---->PE9 gpio toggle gpioe9
马达:TIM16_CH1---->PF6 gpio toggle gpiof6

2. RCC章节分析

  1. 设置GPIOB控制器使能:RCC_MP_AHB4ENSETR[1] = 1
  2. 设置TIM4控制器使能:RCC_MP_APB1ENSETR[2] = 1

3. GPIO章节分析

  1. 设置PB6引脚为复用功能:GPIOB_MODER[13:12] = 10
  2. 设置PB6引脚复用功能为TIM4_CH1:GPIOB_AFRL[27:24] = 0010

4. TIM4章节分析(以蜂鸣器为例)

  1. TIM4_CR1[7] = 1 ------>自动重载计数器预加载使能
    TIM4_CR1[6:5] = 00 ------>设置边沿对齐模式
    TIM4_CR1[4] = 1 ------>设置递减计数器
    TIM4_CR1[0] = 1 ------>设置计数器使能
  2. TIM4_CCMR1[16][6:4] = 0110------>设置为PWM1模式
    TIM4_CCMR1[3] = 1 ------>设置预加载使能
    TIM4_CCMR1[1:0] = 00 ------>设置为输出模式
  3. TIM4_CCER[3] = 0------>设置TIM4_CH1通道为输出模式
    TIM4_CCER[1] = 0------>设置TIM4_CH1起始状态高电平
    TIM4_CCER[0] = 1------>设置TIM4_CH1输出使能
  4. TIM4_PSC------>设置预分频寄存器的值
  5. TIM4_ARR------>设置PWM方波最终周期
  6. TIM4_CCR1------>设置PWM方波的占空比

代码实现

pwm.h

#ifndef __PWM_H__
#define __PWM_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_tim.h"void buzzer_init(void);void motor_init(void);void fan_init(void);
#endif

pwm.c

#include "pwm.h"void buzzer_init(void)
{//设置GPIOB,TIM4的时钟使能RCC->MP_AHB4ENSETR |= (0x1 << 1);RCC->MP_APB1ENSETR |= (0x1 << 2);//设置PB6引脚为复用功能GPIOB->MODER &= (~(0x3 << 12));GPIOB->MODER |= (0x2 << 12);//设置PB6引脚为TIM4_CH1功能GPIOB->AFRL &= (~(0xf << 24));GPIOB->AFRL |= (0x2 << 24);//设置TIM4_CH1通道的预装载寄存器的缓冲区的使能//TIM4_CR1[7] = 0x1TIM4->CR1 |= (0x1 << 7);//设置定时器的计数方式,边沿对齐//TIM4_CR1[6:5] = 0x0TIM4->CR1 &= (~(0x3 << 5));//设置定时器计数的方向,采用递减计数/递增计数 //TIM4_CR1[4] = 0x1 | 0x0TIM4->CR1 |= (0x1 << 4);//使能TIM4_CH1计数器 //TIM4_CR1[0] = 0x1TIM4->CR1 |= (0x1 << 0);//设置TIM4_CH1通道为PWM1模式  //TIM4_CCMR1[16]  TIM4_CCMR1[6:4]//pwm模式1  = 0b0110TIM4->CCMR1 &= (~(0x1 << 16));TIM4->CCMR1 &= (~(0x7 << 4));TIM4->CCMR1 |= (0x6 << 4);//设置TIM4_CH1通道使能TIMx_CCR1预加载使能寄存器//TIM4_CCMR1[3] = 0x1TIM4->CCMR1 |= (0x1 << 3);TIM4->CCMR1 &= (~(0x3 << 0));//设置TIM4_CH1通道输出PWM方波的极性,//TIM_CCER[3] = 0b0 TIM4_CCER[1] = 0x1 or 0x0TIM4->CCER &= (~(0x1 << 3));TIM4->CCER &= (~(0x1 << 1));//设置TIM4_CH1通道的输出使能位,输出PWM方波 //TIM4_CCER[0] = 0x1TIM4->CCER |= (0x1 << 0);//设置预分频寄存器,TIM4_PSC[15:0]  CK_PSC = 209MHz//提供给TIM4的时钟源的频率是209MHzTIM4->PSC = 209 - 1;//设置PWM方波的最终的周期  TIM4_ARR[16:0]//得到一个1000-2000Hz的方波TIM4->ARR = 1000;//设置PWM方波的占空比   TIM4_CCR1[16:0]TIM4->CCR1 = 700;
}void motor_init(void)
{//设置GPIOF,TIM16的时钟使能RCC->MP_AHB4ENSETR |= (0x1 << 5);RCC->MP_APB2ENSETR |= (0x1 << 3);//设置PF6引脚为复用功能GPIOF->MODER &= (~(0x3 << 12));GPIOF->MODER |= (0x2 << 12);//设置PF6引脚为TIM16_CH1功能GPIOF->AFRL &= (~(0xf << 24));GPIOF->AFRL |= (0x1 << 24);//设置TIM16_CH1通道的预装载寄存器的缓冲区的使能//TIM16_CR1[7] = 0x1TIM16->CR1 |= (0x1 << 7);//设置定时器的计数方式,边沿对齐//TIM16_CR1[6:5] = 0x0//TIM16->CR1 &= (~(0x3 << 5));//设置定时器计数的方向,采用递减计数/递增计数 //TIM16_CR1[4] = 0x1 | 0x0//TIM16->CR1 |= (0x1 << 4);//使能TIM16_CH1计数器 //TIM16_CR1[0] = 0x1TIM16->CR1 |= (0x1 << 0);//设置TIM16_CH1通道为PWM1模式//TIM16_CCMR1[16]  TIM16_CCMR1[6:4]//pwm模式1  = 0b0110TIM16->CCMR1 &= (~(0x1 << 16));TIM16->CCMR1 &= (~(0x7 << 4));TIM16->CCMR1 |= (0x6 << 4);//设置TIM16_CH1通道使能TIMx_CCR1预加载使能寄存器//TIM16_CCMR1[3] = 0x1TIM16->CCMR1 |= (0x1 << 3);TIM16->CCMR1 &= (~(0x3 << 0));//设置TIM16_CH1通道输出PWM方波的极性,//TIM_CCER[3] = 0b0 TIM16_CCER[1] = 0x1 or 0x0//TIM16->CCER &= (~(0x1 << 3));TIM16->CCER &= (~(0x1 << 1));//设置TIM16_CH1通道的输出使能位,输出PWM方波 //TIM16_CCER[0] = 0x1TIM16->CCER |= (0x1 << 0);//设置预分频寄存器,TIM16_PSC[15:0]  CK_PSC = 209MHz//提供给TIM4的时钟源的频率是209MHzTIM16->PSC = 209 - 1;//设置PWM方波的最终的周期  TIM16_ARR[16:0]//得到一个1000-2000Hz的方波TIM16->ARR = 1000;//设置PWM方波的占空比   TIM16_CCR1[16:0]TIM16->CCR1 = 700;TIM16->BDTR |= (0x1 << 15);
}void fan_init(void)
{//设置GPIOE,TIM1的时钟使能RCC->MP_AHB4ENSETR |= (0x1 << 4);RCC->MP_APB2ENSETR |= (0x1 << 0);//设置PE9引脚为复用功能GPIOE->MODER &= (~(0x3 << 18));GPIOE->MODER |= (0x2 << 18);//设置PE9引脚为TIM1_CH1功能GPIOE->AFRH &= (~(0xf << 4));GPIOE->AFRH |= (0x1 << 4);//设置TIM1_CH1通道的预装载寄存器的缓冲区的使能//TIM1_CR1[7] = 0x1TIM1->CR1 |= (0x1 << 7);//设置定时器的计数方式,边沿对齐//TIM1_CR1[6:5] = 0x0TIM1->CR1 &= (~(0x3 << 5));//设置定时器计数的方向,采用递减计数//TIM1_CR1[4] = 0x1TIM1->CR1 |= (0x1 << 4);//使能TIM1_CH1计数器//TIM1_CR1[0] = 0x1TIM1->CR1 |= (0x1 << 0);//设置TIM1_CH1通道为PWM1模式  //TIM1_CCMR1[16]  TIM1_CCMR1[6:4]//pwm模式1  = 0b0110TIM1->CCMR1 &= (~(0x1 << 16));TIM1->CCMR1 &= (~(0x7 << 4));TIM1->CCMR1 |= (0x6 << 4);//设置TIM1_CH1通道使能TIMx_CCR1预加载使能寄存器//TIM1_CCMR1[3] = 0x1TIM1->CCMR1 |= (0x1 << 3);TIM1->CCMR1 &= (~(0x3 << 0));//设置TIM1_CH1通道输出PWM方波的极性,//TIM1_CCER[3] = 0b0 TIM1_CCER[1] = 0x1 or 0x0TIM1->CCER &= (~(0x1 << 1));//设置TIM1_CH1通道的输出使能位,输出PWM方波 //TIM1_CCER[0] = 0x1TIM1->CCER |= (0x1 << 0);//设置预分频寄存器,TIM1_PSC[15:0]  CK_PSC = 209MHz//提供给TIM1的时钟源的频率是209MHzTIM1->PSC = 209 - 1;//设置PWM方波的最终的周期  TIM1_ARR[16:0]//得到一个1000-2000Hz的方波TIM1->ARR = 1000;//设置PWM方波的占空比   TIM1_CCR1[16:0]TIM1->CCR1 = 700;TIM1->BDTR |= (0x1 << 15);
}

main.c

#include "pwm.h"
extern void printf(const char *fmt, ...);int main(void)
{buzzer_init();motor_init();fan_init();while(1);return 0;
}

10.2国庆作业(PWM实验)相关推荐

  1. 10.3国庆作业(UART实验)

    文章目录 作业内容 思路分析 1. 电路分析 RCC章节分析 GPIO章节分析 UART章节 代码实现 uart4.h uart4.c main.c 测试结果 作业内容 完成UART实验:实现串口工具 ...

  2. 10.6国庆作业(SPI实验)

    文章目录 作业内容 思路分析 电路图分析 通信协议 RCC章节分析 GPIO章节分析 代码实现 spi.h spi.c main.c 实验结果 作业内容 完成SPI实验:实现数码晶体管显示相应数字 思 ...

  3. 10.5国庆作业(IIC实验)

    文章目录 作业内容 思路分析 IIC硬件电路图 IIC时序 IIC协议 代码实现 iic.c main.c 测试结果 作业内容 完成IIC实验:实现扩展板上空气温湿度传感器对空气温度与湿度的测量 思路 ...

  4. c语言吴振国课后题答案,Exam10_C作业与实验10期中自测卷参考答案(最新整理)

    <Exam10_C作业与实验10&期中自测卷参考答案(最新整理)>由会员分享,可在线阅读,更多相关<Exam10_C作业与实验10&期中自测卷参考答案(最新整理)(4 ...

  5. 淮海工学院linux实验报告三,作业三 实验报告

    作业三 实验报告 网络通信 文件传输 实验一 1-1 实验题目 服务器端和客户端各传递1次字符串.考虑到使用TCP协议,所以传递字符串前先以4字节整数型方式传递字符串长度.连接时服务器端和客户端数据传 ...

  6. 数值分析matlab实验报告,数值分析第一次作业matlab实验报告.doc

    数值分析第一次作业matlab实验报告.doc 几种线性方程组迭代算法的MATLAB实现和性能比较用有限差分方法(五点差分格式)求解正方形域上的Poisson方程边值问题用MATLAB语言编写算法程序 ...

  7. 6、英飞凌-AURIX-TC3XX: PWM实验之使用 GTM -ATOM 实现

    目录 6.英飞凌-AURIX-TC3XX: PWM实验之使用 GTM -ATOM 实现 1.ATOM 简介 2.ATOM子模块的框架 3.ATOM 通道的五种操作模式: 4.ATOM通道结构 5.AR ...

  8. 5、英飞凌-AURIX-TC3X7: PWM实验之使用 GTM -TOM 实现

    目录 5.英飞凌-AURIX-TC3X7: PWM实验之使用 GTM -TOM 实现 1.GTM -TOM简介 2.TOM框图 3.TOM全局通道控制--TGC0, TGC1 4.实验简介 4.1.实 ...

  9. ARM接口实验-PWM实验

    一.PWM概念 1.PWM:脉冲宽度调制定时器 2.脉冲:方波信号,高低电平的变化产生方波信号 3.周期:高低电平变化所需要的时间,单位:ms 4.频率:周期和频率之间是倒数关系,1S钟可以产生的多少 ...

最新文章

  1. linux shell的配置文件信息
  2. android短信照片换ios9,iOS9不越狱恢复短信和照片方法说明
  3. 日记 [2007年01月26日] 用 phpMyAdmin 让 MySQL 数据库管理温和化
  4. ios 旋转加载gif_加载GIF动画方法 iOS
  5. 打分排序系统漫谈1 - 时间衰减
  6. ios学习--TableView详细解释
  7. 新电子书:解决生产中Java应用程序错误的完整指南
  8. 【三维深度学习】多视角场景点云重建模型PointMVS
  9. python在编程序网站_Python的用户登录接口编制以及实现流程图
  10. python读取json并列_python解析含有重复key的json方法
  11. ModelSim6.3 使用教程By Sunev
  12. vbs 窗体文字获取文档_MDI类型窗体设置背景图片
  13. readResolve()原理
  14. My安卓知识6--关于把项目从androidstudio工程转成eclipse工程并导成jar包
  15. Linux权限管理 - 特殊权限之sudo权限
  16. 《个人信息去标识化指南》笔记
  17. Chrome OS 下载及安装教程
  18. python中sys.argv的用法_python的sys.argv[]用法解释
  19. Kotlin For循环详解
  20. NX二次开发-UFUN获取工程图详细信息UF_DRAW_ask_drawing_info

热门文章

  1. 大家是怎么学好python啊??
  2. 史上最强大的procreate笔刷,调色卡,字体分享站点大推荐
  3. 戴尔笔记本开机时卡在logo处底下小进度圈不动,进不了系统
  4. html笔记(完整版)
  5. QtMath:通用数学函数
  6. 一个为程序员定制的、WPF开发的小巧、美观桌面快捷工具
  7. 什么是BIO | NIO | AIO
  8. 景深与图像清晰的关系
  9. xgboost自定义损失函数评估函数
  10. SAP 如何在选择画面中显示图片 <转载> cl_gui_docking_container