A7核PWM实验

这篇具有很好参考价值的文章主要介绍了A7核PWM实验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

头文件

#ifndef __PWM_H__
#define __PWM_H__

#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_tim.h"

//蜂鸣器初始化
void hal_pwm_init();
//风扇初始化
void hal_fan_init();
//马达初始化
void hal_monitor_init();

#endif

运行代码

#include "pwm.h"


void hal_pwm_init()
{
	//RCC章节初始化
	//GPIOB使能 RCC_MP_AHB4ENSETR[1] = 1
	RCC->MP_AHB4ENSETR |= (0x1 << 1);
	//TIM4使能 RCC_MP_ARB1ENSETR[2] = 1
	RCC->MP_APB1ENSETR |= (0x1 << 2);

	//GPIO章节初始化
	//设置复用功能 GPIOB_MODER[13:12] = 10
	GPIOB->MODER &= (~(0x3 << 12));
	GPIOB->MODER |= (0x1 << 13);
	//设置引脚对应复用功能为TIM4 GPIOB_AFRL[27:24] = 0010
	GPIOB->AFRL &= (~(0xf << 24));
	GPIOB->AFRL |= (0x1 << 25);

	//TIM4章节初始化 方波频率1000HZ 占空比
	//设置分频 TIM4_PSC = 208
	TIM4->PSC = 208;
	//设置方波周期 TIM4_ARR = 1000
	TIM4->ARR = 1000;
	//设置占空比 TIM4_CCR1 = 300
	TIM4->CCR1 = 700;
	//设置PWM模式 TIM4_CCMR1[16][6:4] = 0110
	TIM4->CCMR1 &= (~(0x1 << 16));
	TIM4->CCMR1 &= (~(0x7 << 4));
	TIM4->CCMR1 |= (0x3 << 5);
	//设置输出比较加载使能 TIM4_CCMR1[3] = 1
	TIM4->CCMR1 |= (0x1 << 3);
	//设置通道1输出 TIM4_CCMR1[1:0] = 00
	TIM4->CCMR1 &= ~(0x3);
	//设置通道1输出 TIM4_CCER[3] = 0
	TIM4->CCER &= (~(0x1 << 3));
	//设置起始状态为高电平 TIM4->CCER[1] = 1
	TIM4->CCER &= (~(0x1 << 1));
	//设置输出使能 TIM4_CCER[0] = 1
	TIM4->CCER |= 0x1;
	//设置自动预加载使能 TIM4_CR1[7] = 1
	TIM4->CR1 |= (0x1 << 7);
	//设置边沿对齐 TIM4_CR1[6:5] = 00
	TIM4->CR1 &= (~(0x3 << 5));
	//设置设置递减计数方式 TIM4_CR1[4] = 1
	TIM4->CR1 |= (0x1 << 4);
	//设置计数器使能 TIM4_CR1[0] = 0
	TIM4->CR1 &= ~(0x1);
}
void hal_fan_init()
{
	//RCC章节初始化
	//GPIOB使能 RCC_MP_AHB4ENSETR[4] = 1
	RCC->MP_AHB4ENSETR |= (0x1 << 4);
	//TIM4使能 RCC_MP_ARB1ENSETR[0] = 1
	RCC->MP_APB2ENSETR |= 0x1;

	//GPIO章节初始化
	//设置复用功能 GPIOB_MODER[19:18] = 10
	GPIOE->MODER &= (~(0x3 << 18));
	GPIOE->MODER |= (0x1 << 19);
	//设置引脚对应复用功能为TIM4 GPIOB_AFRH[7:4] = 0001
	GPIOE->AFRH &= (~(0xf << 4));
	GPIOE->AFRH |= (0x1 << 4);

	TIM1->BDTR |= (0x1 << 15);
	//设置分频 TIM1_PSC = 208
	TIM1->PSC = 208;
	//设置方波周期 TIM1_ARR = 1000
	TIM1->ARR = 1000;
	//设置占空比 TIM1_CCR1 = 300
	TIM1->CCR1 = 600;
	//设置PWM模式 TIM1_CCMR1[16][6:4] = 0110
	TIM1->CCMR1 &= (~(0x1 << 16));
	TIM1->CCMR1 &= (~(0x7 << 4));
	TIM1->CCMR1 |= (0x3 << 5);
	//设置输出比较加载使能 TIM1_CCMR1[3] = 1
	TIM1->CCMR1 |= (0x1 << 3);
	//设置通道1输出 TIM1_CCMR1[1:0] = 00
	TIM1->CCMR1 &= ~(0x3);
	//设置通道1输出 TIM1_CCER[3] = 0
	TIM1->CCER &= (~(0x1 << 3));
	//设置起始状态为高电平 TIM1->CCER[1] = 1
	TIM1->CCER &= (~(0x1 << 1));
	//设置输出使能 TIM1_CCER[0] = 1
	TIM1->CCER |= 0x1;
	//设置自动预加载使能 TIM1_CR1[7] = 1
	TIM1->CR1 |= (0x1 << 7);
	//设置边沿对齐 TIM1_CR1[6:5] = 00
	TIM1->CR1 &= (~(0x3 << 5));
	//设置设置递减计数方式 TIM1_CR1[4] = 1
	TIM1->CR1 |= (0x1 << 4);
	//设置计数器使能 TIM1_CR1[0] = 0
	TIM1->CR1 &= ~(0x1);
}
void hal_monitor_init()
{
	//RCC章节初始化
	//GPIOB使能 RCC_MP_AHB4ENSETR[5] = 1
	RCC->MP_AHB4ENSETR |= (0x1 << 5);
	//TIM4使能 RCC_MP_ARB1ENSETR[3] = 1
	RCC->MP_APB2ENSETR |= (0x1 << 3);

	//GPIO章节初始化
	//设置复用功能 GPIOB_MODER[13:12] = 10
	GPIOF->MODER &= (~(0x3 << 12));
	GPIOF->MODER |= (0x1 << 13);
	//设置引脚对应复用功能为TIM4 GPIOB_AFRL[27:24] = 0001
	GPIOF->AFRL &= (~(0xf << 24));
	GPIOF->AFRL |= (0x1 << 24);

	TIM16->BDTR |= (0x1 << 15);
	//TIM4章节初始化 方波频率1000HZ 占空比
	//设置分频 TIM16_PSC = 208
	TIM16->PSC = 208;
	//设置方波周期 TIM16_ARR = 1000
	TIM16->ARR = 1000;
	//设置占空比 TIM16_CCR1 = 300
	TIM16->CCR1 = 700;
	//设置PWM模式 TIM16_CCMR1[16][6:4] = 0110
	TIM16->CCMR1 &= (~(0x1 << 16));
	TIM16->CCMR1 &= (~(0x7 << 4));
	TIM16->CCMR1 |= (0x3 << 5);
	//设置输出比较加载使能 TIM16_CCMR1[3] = 1
	TIM16->CCMR1 |= (0x1 << 3);
	//设置通道1输出 TIM16_CCMR1[1:0] = 00
	TIM16->CCMR1 &= ~(0x3);
	//设置通道1输出 TIM16_CCER[3] = 0
	TIM16->CCER &= (~(0x1 << 3));
	//设置起始状态为高电平 TIM16->CCER[1] = 1
	TIM16->CCER &= (~(0x1 << 1));
	//设置输出使能 TIM16_CCER[0] = 1
	TIM16->CCER |= 0x1;
	//设置自动预加载使能 TIM16_CR1[7] = 1
	TIM16->CR1 |= (0x1 << 7);
	//设置边沿对齐 TIM16_CR1[6:5] = 00
	TIM16->CR1 &= (~(0x3 << 5));
	//设置设置递减计数方式 TIM16_CR1[4] = 1
	TIM16->CR1 |= (0x1 << 4);
	//设置计数器使能 TIM16_CR1[0] = 0
	TIM16->CR1 &= ~(0x1);
}

主函数文章来源地址https://www.toymoban.com/news/detail-466043.html

#include "pwm.h"
extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{
	int i,j;
	for(i = 0; i < ms;i++)
		for (j = 0; j < 1800; j++);
}

int main()
{
	hal_fan_init();
	while(1)		
	{
	}
	return 0;
}

到了这里,关于A7核PWM实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【正点原子STM32】DAC数模转换器(DAC特性、DAC工作原理、DAC输出实验配置步骤、DAC输出三角波实验、DAC输出正弦波实验配置步骤、PWM + RC滤波器、PWM DAC技术实现原理)

    一、DAC简介 1.1、什么是DAC? 1.2、DAC的特性参数 1.3、STM32各系列DAC的主要特性 二、DAC工作原理 2.1、DAC框图简介(F1/ F4 /F7/H7) 2.2、参考电压/模拟部分电压 2.3、DAC数据格式 2.4、触发源 2.5、DMA请求 2.6、DAC输出电压 三、DAC输出实验 3.1、实验简要 3.2、DAC寄存器介绍 3.3、DAC输出实

    2024年04月16日
    浏览(35)
  • 嵌入式C语言-预编译命令(#define、#if、#ifdef、#ifndef、#undef)

    宏定义 #define机制包含了一个规定,允许把参数替换到文本中,这种实现通常称为宏定义。下面是宏的声明方式: 其中,parameter-list(参数列表)是由逗号分割的符号列表,它们可能出现在stuff中。name必须与左括号紧邻。比如下面的例子: 提示 : 所有用于数值表达式进行求

    2024年02月07日
    浏览(30)
  • 【正点原子STM32连载】第二十一章 高级定时器输出指定个数PWM实验 摘自【正点原子】APM32E103最小系统板使用指南

    1)实验平台:正点原子APM32E103最小系统板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban 本章将介绍使用APM32E103高级定时器输出指定个数的PWM。通过本章的学习,读者将学习到高级定时器重

    2024年02月21日
    浏览(46)
  • STM32外设之TIM定时器使用及输出比较模式PWM生成,PWM频率和占空比计算,文末有固件库TIM驱动文件的函数讲解

    过来人的经验分享: TIM定时器在我们学习STM32的过程中是一个重要且稍微有点难度的外设了,就拿从学校里做的项目来说用到的也是一些基本的外设配置和传感器等等。TIM作为外设中稍微有点难度的外设相当关键,学好TIM,对以后学习单片机开发也有很大帮助。 定时器是stm3

    2024年02月07日
    浏览(39)
  • STM32 | CubeIDE 配置Include路径

    这个Matrix文件夹是我写代码的,c于.h文件 这样子在Cubeide 生成代码的时候,不会影响到自己编写的原有代码结构。 在这个时候需要关联Include才能正确识别; 点击工程选择Properties 点击C/C++ Build 点击Paths and Symbols Include选项卡中添加 ADD,你要包含的文件夹 如在Workspace中则对应点

    2024年02月15日
    浏览(36)
  • 在C++中控制调试信息的输出通常通过预处理指令(如 #define)和条件编译指令(如 #ifdef、#ifndef、#endif)来实现。

    在C++中,控制调试信息的输出通常通过预处理指令(如 #define )和条件编译指令(如 #ifdef 、 #ifndef 、 #endif )来实现。这种方法提供了一种灵活的方式来包含或排除调试代码,而无需对代码本身进行大量修改。以下是实现这一功能的一种常见方法: 定义一个宏用于控制调试

    2024年02月02日
    浏览(33)
  • STM32使用PWM

    1.定义:PWM,就是脉冲宽度调制,也就是占空比可变的脉冲波形。 2.适用条件:PWM所应用的场景必须为惯性系统,像led,当立即变为低电平时,led并不会瞬间熄灭,而是具有惯性,在短时间内为逐渐熄灭。 3.应用:智能车,机器人等项目。呼吸灯、驱动电机等。 频率为Ts的倒

    2024年02月09日
    浏览(33)
  • 09 STM32 - PWM

    脉冲宽度调制(Pulse Width Modulation,简称PWM),是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。 如下图所示,使用定时器定时,从0开始,到达ARR后清零重新计时,如此往复。得到时间t2,则t2为周期;设置比较值CCR,当

    2024年01月19日
    浏览(27)
  • STM32之PWM

    PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化, 占空比就是指在一个周期内,信号处于有

    2024年02月08日
    浏览(30)
  • STM32 HAL库 STM32CubeMX -- PWM(呼吸灯)

    PWM (Pulse Width Modulation)就是对外输出脉宽(即占空比)可调的方波信号,简称脉宽调制; 信号频率由自动重装寄存器ARR 的值决定,占空比由比较寄存器CCR 的值决定。 PWM模式1 : 在向上计数时 ,一旦TIMx_CNTTIMx_CCR1时通道1为有效电平,否则为无效电平; 在向下计数时 ,一旦

    2024年02月01日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包