C语言 Cortex-A7核 PWM实验

2023-10-06 04:26
文章标签 语言 实验 cortex pwm a7

本文主要是介绍C语言 Cortex-A7核 PWM实验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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] = 1RCC->MP_AHB4ENSETR |= (0x1 << 1);//2.使能TIM4组控制器 MP_APB1ENSETR[2] = 1RCC->MP_APB1ENSETR |= (0X1 << 2);//GPIO章节初始化//1.设置PB6引脚为复用功能 GPIOB->MODER[13:12] = 10GPIOB->MODER &= (~(0x3 << 12));GPIOB->MODER |= (0x1 << 13);//2.设置PB6引脚复用功能为TIM4_CH1功能  GPIOB->AFRL[27:24] = 0010GPIOB->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] = 1TIM4->CR1 &= (~(0x3 << 5));   //设置计数器为边沿对齐模式 CR1[6:5] = 00TIM4->CR1 |= (0x1 << 4);      //设置计数器为递减计数器方式 CR1[4] = 1TIM4->CR1 |= (0x1 << 0);      //设置计数器使能 CR1[0] = 1//CCMR1寄存器初始化TIM4->CCMR1 &= (~(0x1 << 4)); //设置PWM模式选择 CCMR1[16][6:4] = 0110TIM4->CCMR1 &= (~(0x1 << 16));TIM4->CCMR1 |= (0x3 << 5);TIM4->CCMR1 |= (0x1 << 3);    //设置输出比较预加载使能 CCMR1[3] = 1TIM4->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] = 1RCC->MP_AHB4ENSETR |= (0x1 << 4);//2.使能TIM1组控制器 MP_AHB2ENSETR[0] = 1RCC->MP_APB2ENSETR |= (0X1 << 0);//GPIO章节初始化//1.设置PE9引脚为复用功能 [19:18] = 10GPIOE->MODER &= (~(0x3 << 18));GPIOE->MODER |= (0x1 << 19);//2.设置PE9引脚复用功能为TIM1_CH1功能  AF1 0001 GPIOE->AFRH[7:4] = 0001GPIOE->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] = 1TIM1->CR1 &= (~(0x3 << 5));   //设置计数器为边沿对齐模式 CR1[6:5] = 00TIM1->CR1 |= (0x1 << 4);      //设置计数器为递减计数器方式 CR1[4] = 1TIM1->CR1 |= (0x1 << 0);      //设置计数器使能 CR1[0] = 1//CCMR1寄存器初始化TIM1->CCMR1 &= (~(0x1 << 4)); //设置PWM模式选择 CCMR1[16][6:4] = 0110TIM1->CCMR1 &= (~(0x1 << 16));TIM1->CCMR1 |= (0x3 << 5);TIM1->CCMR1 |= (0x1 << 3);    //设置输出比较预加载使能 CCMR1[3] = 1TIM1->CCMR1 &= (~(0x3 << 0)); //设置捕获/比较选择输出//CCER、CCR1寄存器初始化TIM1->CCER &= (~(0x5 << 1));  //设置捕获比较寄存器默认输出极性为高电平 CCER[3][1] = 00(高电平)/01(低电平)TIM1->CCER |= (0x1 << 0);     //设置捕获/比较输出使能 CCER[0] = 1TIM1->BDTR |= (0x1 << 15);    //BDTR使能
}//马达:PF6 ---> TIM16_CH1
void hal_monitor_init()
{//RCC章节初始化//1.使能GPIOF组控制器 MP_AHB2ENSETR[5] = 1RCC->MP_AHB4ENSETR |= (0x1 << 5);//2.使能TIM16组控制器 MP_APB2ENCLRR[3] = 1RCC->MP_APB2ENSETR |= (0X1 << 3);//GPIO章节初始化//1.设置PF6引脚为复用功能 GPIOF->MODER[13:12] = 10GPIOF->MODER &= (~(0x3 << 12));GPIOF->MODER |= (0x1 << 13);//2.设置PF6引脚复用功能为TIM16_CH1功能  AF1 0001 GPIOF->AFRL [27:24] = 0001GPIOF->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] = 1TIM16->CR1 &= (~(0x3 << 5));   //设置计数器为边沿对齐模式 CR1[6:5] = 00TIM16->CR1 |= (0x1 << 4);      //设置计数器为递减计数器方式 CR1[4] = 1TIM16->CR1 |= (0x1 << 0);      //设置计数器使能 CR1[0] = 1//CCMR1寄存器初始化TIM16->CCMR1 &= (~(0x1 << 4)); //设置PWM模式选择 CCMR1[16][6:4] = 0110TIM16->CCMR1 &= (~(0x1 << 16));TIM16->CCMR1 |= (0x3 << 5);TIM16->CCMR1 |= (0x1 << 3);    //设置输出比较预加载使能 CCMR1[3] = 1TIM16->CCMR1 &= (~(0x3 << 0)); //设置捕获/比较选择输出//CCER、CCR1寄存器初始化TIM16->CCER &= (~(0x5 << 1));  //设置捕获比较寄存器默认输出极性为高电平 CCER[3][1] = 00(高电平)/01(低电平)TIM16->CCER |= (0x1 << 0);     //设置捕获/比较输出使能 CCER[0] = 1TIM16->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 实验效果

这篇关于C语言 Cortex-A7核 PWM实验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/152820

相关文章

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

C 语言的基本数据类型

C 语言的基本数据类型 注:本文面向 C 语言初学者,如果你是熟手,那就不用看了。 有人问我,char、short、int、long、float、double 等这些关键字到底是什么意思,如果说他们是数据类型的话,那么为啥有这么多数据类型呢? 如果写了一句: int a; 那么执行的时候在内存中会有什么变化呢? 橡皮泥大家都玩过吧,一般你买橡皮泥的时候,店家会赠送一些模板。 上

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD