C语言 Cortex-A7核 PWM实验

news2024/11/23 0:25:43

1 实验目的

驱动开发板蜂鸣器风扇、马达进行工作

2 代码

pwm.h

#ifndef __PWM_H__                   
#define __PWM_H__                   
                                    
#include "stm32mp1xx_rcc.h"         
#include "stm32mp1xx_gpio.h"        
#include "stm32mp1xx_tim.h"         
                                    
//蜂鸣器:PB6 ---> TIM4_CH1         
void hal_beep_init();               
//风扇:PE9 ---> TIM1_CH1           
void hal_fan_init();                
//马达:PF6 ---> TIM16_CH1          
void hal_monitor_init();            
                                    
#endif

pwm.c

#include "pwm.h"

//蜂鸣器:PB6 ---> TIM4_CH1
void hal_beep_init()
{
    //RCC章节初始化
    //1.使能GPIOB组控制器 MP_AHB4ENSETR[1] = 1
    RCC->MP_AHB4ENSETR |= (0x1 << 1);
    //2.使能TIM4组控制器 MP_APB1ENSETR[2] = 1
    RCC->MP_APB1ENSETR |= (0X1 << 2);

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

    //TIM1章节
    //PWM方波频率为 : 1000HZ
    //思路: 1.准备值(分频器,自动重载计数器,比较捕获寄存器)    
    //2.使能/输出
    TIM4->ARR = 1000;             //设置自动重载计数器中的值
    TIM4->PSC = 209-1;              //设置系统提供的时钟源进行分频
    TIM4->CCR1 = 300;             //设置捕获/比较寄存器中的值

    //CR1寄存器初始化
    TIM4->CR1 |= (0x1 << 7);      //设置自动重载计数器预加载使能 CR1[7] = 1
    TIM4->CR1 &= (~(0x3 << 5));   //设置计数器为边沿对齐模式 CR1[6:5] = 00
    TIM4->CR1 |= (0x1 << 4);      //设置计数器为递减计数器方式 CR1[4] = 1
    TIM4->CR1 |= (0x1 << 0);      //设置计数器使能 CR1[0] = 1
    //CCMR1寄存器初始化
    TIM4->CCMR1 &= (~(0x1 << 4)); //设置PWM模式选择 CCMR1[16][6:4] = 0110
    TIM4->CCMR1 &= (~(0x1 << 16));
    TIM4->CCMR1 |= (0x3 << 5);
    TIM4->CCMR1 |= (0x1 << 3);    //设置输出比较预加载使能 CCMR1[3] = 1
    TIM4->CCMR1 &= (~(0x3 << 0)); //设置捕获/比较选择输出
    //CCER、CCR1寄存器初始化
    TIM4->CCER &= (~(0x5 << 1));  //设置捕获比较寄存器默认输出极性为高电平 CCER[3][1] = 00(高电平)/01(低电平)
    TIM4->CCER |= (0x1 << 0);     //设置捕获/比较输出使能 CCER[0] = 1

}
//风扇:PE9 ---> TIM1_CH1
void hal_fan_init()
{
    //RCC章节初始化
    //1.使能GPIOE组控制器 MP_AHB4ENSETR[4] = 1
    RCC->MP_AHB4ENSETR |= (0x1 << 4);
    //2.使能TIM1组控制器 MP_AHB2ENSETR[0] = 1
    RCC->MP_APB2ENSETR |= (0X1 << 0);

    //GPIO章节初始化
    //1.设置PE9引脚为复用功能 [19:18] = 10
    GPIOE->MODER &= (~(0x3 << 18));
    GPIOE->MODER |= (0x1 << 19);
    //2.设置PE9引脚复用功能为TIM1_CH1功能  AF1 0001 GPIOE->AFRH[7:4] = 0001
    GPIOE->AFRH &= (~(0xf << 4));
    GPIOE->AFRH |= (0x1 << 4);

    //TIM1章节
    //PWM方波频率为 : 1000HZ
    //思路: 1.准备值(分频器,自动重载计数器,比较捕获寄存器)    
    TIM1->ARR = 1000;             //设置自动重载计数器中的值
    TIM1->PSC = 800;              //设置系统提供的时钟源进行分频
    TIM1->CCR1 = 300;             //设置捕获/比较寄存器中的值

    //CR1寄存器初始化
    TIM1->CR1 |= (0x1 << 7);      //设置自动重载计数器预加载使能 CR1[7] = 1
    TIM1->CR1 &= (~(0x3 << 5));   //设置计数器为边沿对齐模式 CR1[6:5] = 00
    TIM1->CR1 |= (0x1 << 4);      //设置计数器为递减计数器方式 CR1[4] = 1
    TIM1->CR1 |= (0x1 << 0);      //设置计数器使能 CR1[0] = 1
    //CCMR1寄存器初始化
    TIM1->CCMR1 &= (~(0x1 << 4)); //设置PWM模式选择 CCMR1[16][6:4] = 0110
    TIM1->CCMR1 &= (~(0x1 << 16));
    TIM1->CCMR1 |= (0x3 << 5);
    TIM1->CCMR1 |= (0x1 << 3);    //设置输出比较预加载使能 CCMR1[3] = 1
    TIM1->CCMR1 &= (~(0x3 << 0)); //设置捕获/比较选择输出
    //CCER、CCR1寄存器初始化
    TIM1->CCER &= (~(0x5 << 1));  //设置捕获比较寄存器默认输出极性为高电平 CCER[3][1] = 00(高电平)/01(低电平)
    TIM1->CCER |= (0x1 << 0);     //设置捕获/比较输出使能 CCER[0] = 1
    TIM1->BDTR |= (0x1 << 15);    //BDTR使能
}

//马达:PF6 ---> TIM16_CH1
void hal_monitor_init()
{
    //RCC章节初始化
    //1.使能GPIOF组控制器 MP_AHB2ENSETR[5] = 1
    RCC->MP_AHB4ENSETR |= (0x1 << 5);
    //2.使能TIM16组控制器 MP_APB2ENCLRR[3] = 1
    RCC->MP_APB2ENSETR |= (0X1 << 3);
    //GPIO章节初始化
    //1.设置PF6引脚为复用功能 GPIOF->MODER[13:12] = 10
    GPIOF->MODER &= (~(0x3 << 12));
    GPIOF->MODER |= (0x1 << 13);
    //2.设置PF6引脚复用功能为TIM16_CH1功能  AF1 0001 GPIOF->AFRL [27:24] = 0001
    GPIOF->AFRL &= (~(0xf << 24));
    GPIOF->AFRL |= (0x1 << 24);

    //TIM16章节
    //PWM方波频率为 : 1000HZ
    //思路: 1.准备值(分频器,自动重载计数器,比较捕获寄存器)    
    TIM16->ARR = 1000;             //设置自动重载计数器中的值
    TIM16->PSC = 209-1;              //设置系统提供的时钟源进行分频
    TIM16->CCR1 = 300;             //设置捕获/比较寄存器中的值

    //CR1寄存器初始化
    TIM16->CR1 |= (0x1 << 7);      //设置自动重载计数器预加载使能 CR1[7] = 1
    TIM16->CR1 &= (~(0x3 << 5));   //设置计数器为边沿对齐模式 CR1[6:5] = 00
    TIM16->CR1 |= (0x1 << 4);      //设置计数器为递减计数器方式 CR1[4] = 1
    TIM16->CR1 |= (0x1 << 0);      //设置计数器使能 CR1[0] = 1
    //CCMR1寄存器初始化
    TIM16->CCMR1 &= (~(0x1 << 4)); //设置PWM模式选择 CCMR1[16][6:4] = 0110
    TIM16->CCMR1 &= (~(0x1 << 16));
    TIM16->CCMR1 |= (0x3 << 5);
    TIM16->CCMR1 |= (0x1 << 3);    //设置输出比较预加载使能 CCMR1[3] = 1
    TIM16->CCMR1 &= (~(0x3 << 0)); //设置捕获/比较选择输出
    //CCER、CCR1寄存器初始化
    TIM16->CCER &= (~(0x5 << 1));  //设置捕获比较寄存器默认输出极性为高电平 CCER[3][1] = 00(高电平)/01(低电平)
    TIM16->CCER |= (0x1 << 0);     //设置捕获/比较输出使能 CCER[0] = 1

    TIM16->BDTR |= (0x1 << 15);     //BDTR使能
}

                                                                                                                                                                          
                                                                                                                                                                          
                                                                                                                                                                          
                                                                                                                                                                          
                                                                                                                                                                          
                                                                                                                                                                          
                                                                                                                                                                          
                                                                                                                                                                          
                                                                                                                                                                          
                                                                                                                                                                          
                                                                                                                                                                          

main.c

#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_beep_init(); //蜂鸣器初始化
    hal_fan_init();//风扇初始化
    hal_monitor_init();//马达初始化
    while(1)
    {

    }
    return 0;
}

3 实验效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1054656.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网页一直跳转到国家反诈中心页面

很明显&#xff0c;我进入的是vscode的官方下载地址。 但是一直会出现反诈中心的拦截 我们需要在控制面板中&#xff0c;找到网络&#xff0c; 将Internet 协议版本 4 (TCP/IPv4)的属性改成 使用下面的DNS 服务地址(E)&#xff1a;8.8.8.8 这样就可以正常访问相关的页面了

【day10.01】使用select实现服务器并发

用select实现服务器并发&#xff1a; linuxlinux:~/study/1001$ cat server.c #include <myhead.h>#define ERR_MSG(msg) do{\printf("%d\n",__LINE__);\perror(msg);\ }while(0)#define PORT 8880#define IP "192.168.31.38"int main(int argc, c…

动态规划算法(1)--矩阵连乘和凸多边形剖分

目录 一、动态数组 1、创建动态数组 2、添加元素 3、删除修改元素 4、访问元素 5、返回数组长度 6、for each遍历数组 二、输入多个数字 1、正则表达式 2、has.next()方法 三、矩阵连乘 1、什么是矩阵连乘&#xff1f; 2、动态规划思路 3、手推m和s矩阵 4、完…

Vue封装全局SVG组件

1.SVG图标配置 1.安装插件 npm install vite-plugin-svg-icons -D 2.Vite.config.ts中配置 import { createSvgIconsPlugin } from vite-plugin-svg-icons import path from path export default () > {return {plugins: [createSvgIconsPlugin({// Specify the icon fo…

cesium 热力图(CesiumHeatmap)

cesium 热力图 可添加、删除、显示、隐藏 完整代码 <!DOCTYPE html> <html lang="en"><head><meta charset="utf-8">

计算机毕设 大数据B站数据分析与可视化 - python 数据分析 大数据

文章目录 0 前言1 课题背景2 实现效果3 数据获取4 数据可视化5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自己做…

C++指针的使用

文章目录 1.C指针1.1 定义指针1.2 使用指针 2.空指针和野指针2.1 空指针2.2 野指针 3.指针所占空间4.使用const修饰指针4.1 const修饰指针4.2 const修饰常量4.3 const 既修饰指针也修饰常量 5.指针操作数组6.指针做函数参数7.使用指针知识实现冒泡排序 1.C指针 指针其实就是一…

基础数据结构之——【顺序表】(上)

从今天开始更新数据结构的相关内容。&#xff08;我更新博文的顺序一般是按照我当前的学习进度来安排&#xff0c;学到什么就更新什么&#xff08;简单来说就是我的学习笔记&#xff09;&#xff0c;所以不会对一个专栏一下子更新到底&#xff0c;哈哈哈哈哈哈哈&#xff01;&a…

掌动智能:替代JMeter的压力测试工具有哪些

JMeter是一个广泛使用的开源压力测试工具&#xff0c;但在实际应用中&#xff0c;也有一些其他优秀的替代品可供选择。本文将介绍几个可替代JMeter的压力测试工具&#xff0c;它们在功能、性能和易用性方面都具有独特优势&#xff0c;可以满足不同压力测试需求的选择。 一、Gat…

使用ExLlamaV2在消费级GPU上运行Llama2 70B

Llama 2模型中最大也是最好的模型有700亿个参数。一个fp16参数的大小为2字节。加载Llama 270b需要140 GB内存(700亿* 2字节)。 只要我们的内存够大&#xff0c;我们就可以在CPU上运行上运行Llama 2 70B。但是CPU的推理速度非常的慢&#xff0c;虽然能够运行&#xff0c;速度我…

[管理与领导-108]:IT人看清职场中的隐性规则 - 5 - 你会在不经意间被归属在不同的分类中,一旦分类定型,你就会被打上了某种标签(职场分类方法大全)

目录 前言&#xff1a; 一、关于分类 1.1 什么是分类 1.2 分类是人们理解复杂问题的一种常见方式 1.3 分类的优点与缺点 1.4 职场中的分类方法 二、职场对人的分类方法1&#xff1a;组织架构 2.1 职位和职级分类 2.2 按照部门、岗位进行分类 三、职场对人的分类方法2…

java Spring Boot按日期 限制大小分文件记录日志

上文 java Spring Boot 将日志写入文件中记录 中 我们实现另一个将控制台日志写入到 项目本地文件的效果 但是 这里有个问题 比如 我项目是个大体量的企业项目 每天会有一百万用户访问 那我每天的日志都记载同一个文件上 那不跟没记没什么区别吗&#xff1f; 东西怎么找&#x…

C++11之可变参数模板

可变参数模板 可变参数模板概念可变参数模板定义参数包展开方式递归展开参数包逗号表达式展开参数包 STL容器中的emplace相关接口函数 可变参数模板概念 C11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板&#xff0c;相比C98/03&#xff0c;类模版和函…

Java进阶02 Array、内存分析、this、面向对象、继承、override、super、实例化、多态、向下转型、Object

文章目录 一、数组(Array)二、数组的内存分析三、Array工具类四、面向对象的一些小知识五、进阶知识补充1. this关键字2.继承3.方法重写4.super关键字的使用5.子类对象实例化6.多态性的体现7.向下转型8.Object类 一、数组(Array) 数组&#xff1a;多个相同类型数据按照一定顺序…

基于 SpringBoot 2.7.x 使用最新的 Elasticsearch Java API Client 之 ElasticsearchClient

1. 从 RestHighLevelClient 到 ElasticsearchClient 从 Java Rest Client 7.15.0 版本开始&#xff0c;Elasticsearch 官方决定将 RestHighLevelClient 标记为废弃的&#xff0c;并推荐使用新的 Java API Client&#xff0c;即 ElasticsearchClient. 为什么要将 RestHighLevelC…

大喜国庆,聊聊我正式进入职场的这三个月...

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

Thymeleaf 内联语法使用教程

1 表达式内联 Thrmeleaf标准方言允许使用标签属性(th:)来实现很多的功能&#xff0c;但在有些场景之下&#xff0c;需要将表达式直接写入我们HTML 代码中和CSS代码中及JavaScript代码中【代码和html文件在一起&#xff0c;分能不开&#xff0c;待验证】&#xff0c;称为内联…

[Unity][VR]Oculus透视开发图文教程1-Passthrough应用XR项目设置

Oculus现在已向开发者公布了如何使用自己的设备Camera,本系列课程就来手把手地告诉你如何在Unity中使用这个特性。 第一步,既然用的是Quest的特性,那就需要先引入Quest的Unity开发SDK。并且完成基本的VR开发项目设置。 新建Unity项目后,在编辑器界面先点击Window,打开资…

【实验记录】一些小疑问

1.为什么要选择基于“外观”这一特性来作为回环检测的方案&#xff1f; 朴素思路复杂度高&#xff0c;不利于实时性&#xff1b;基于“里程计”的方案需要知道相机处于何位置下才能发生检测&#xff0c;这与我们需要知道的准确位置相矛盾 基于“外观”的方案与前端和后端均无关…

计算机图形学、贝塞尔曲线及绘制方法、反走样问题的解决(附完整代码)

贝塞尔曲线 1. 本次作业实现的函数及简单描述&#xff08;详细代码见后&#xff09;2. 与本次作业有关的基础知识整理3. 代码描述&#xff08;详细&#xff09;4. 完整代码5. 参考文献 &#xff08;本篇为作者学习计算机图形学时根据作业所撰写的笔记&#xff0c; 如有同课程请…