Linux-Ubuntu之裸机驱动最后一弹PWM控制显示亮度

Linux-Ubuntu之裸机驱动最后一弹PWM控制显示亮度

  • 一, PWM实现原理
  • 二,软件实现
  • 三,正点原子裸机开发总结

一, PWM实现原理

PWM和学习51时候基本上一致,控制频率(周期)和占空比,51实验是利用中断进行控制的,在中断中设置计数,低于占空比设定值,会让引脚一直为高电平,高于的话,让引脚为低电平,用周期数值限制,但是这个简单的地方在于能直接控制高低电平。在这个板子上,主要是控制寄存器值,有频率相关寄存器PWMx_PWMPR,向上计数器从0开始计数,一直加一,当等于这个PWMx_PWMPR设定的值,就实现一个周期,然后再从0开始计数。占空比相关寄存器 PWMx_PWMSAR,默认高电平时,向上计数器值等于FIFO值,就会使得PWM引脚输出低电平,FIFO的值就是来源于PWMx_PWMSAR,因此这个PWMx_PWMSAR值越大,相当于占空比越高。从采样寄存器 PWMx_PWMSAR 读取一次数据,FIFO 里面的数据就会减一,每产生一个周期的 PWM 信号,FIFO 里面的数据就会减一,相当于被用掉了。PWM 有个 FIFO 空中断,当FIFO 为空的时候就会触发此中断,可以在此中断处理函数中向 FIFO 写入数据,这个实验就利用了中断,在中断函数中,实现对PWMSAR写数据。
寄存器配置包括时钟源,分频值,周期寄存器PWMx_PWMPR,采样寄存器PWMx_PWMSAR,中断控制,相关使能。
在这里插入图片描述

二,软件实现

PWM函数:

/*pwm.h*/
#ifndef _DSP_PWM_H
#define _DSP_PWM_H
#include "imx6ul.h"


struct pwm_period_and_rate_struct
{
    unsigned char pwm_rate;//占空比
};
extern struct pwm_period_and_rate_struct pwm_dev;

void pwm_init(void);
void pwm1_fifo_irqhandler(unsigned int gocciar,void *param);
void pwm1_period_set(unsigned int value);
void pwm1_rate_set(unsigned char rate);

#endif 
/*pwm.c*/
#include "dsp_pwm.h"
#include "dsp_int.h"
struct pwm_period_and_rate_struct pwm_dev;

/*初始化*/
void pwm_init(void)
{
    /*1.引脚初始化*/
    IOMUXC_SetPinMux(IOMUXC_GPIO1_IO08_PWM1_OUT,0);		
	IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO08_PWM1_OUT,0XB090);


    /*2.PWM初始化,时钟源60MHZ,分频1000,*/
    PWM1->PWMCR = 0;
    PWM1->PWMCR |=(1<<16)|(65<<4)|(1<<26);
    

    /*3.设置周期和占空比*/
    unsigned int i=0;
    pwm1_period_set(1000);//设置频率为1000KHZ(周期)
    pwm_dev.pwm_rate=50;
    for(i=0;i<4;i++)
    {
        pwm1_rate_set( pwm_dev.pwm_rate);//默认占空比为50,因为有四个FIFO,所以写四次
    }
    /*4.使能FIFO空中断*/
    PWM1->PWMIR |= 1<<0;    
    system_register_irqhandler(PWM1_IRQn,(system_irq_handler_t)pwm1_fifo_irqhandler,NULL);
    GIC_EnableIRQ(PWM1_IRQn);/*FIFO引起的中断*/
    PWM1->PWMSR |= (1<<3);//中断标志位写1清0

    /*5.使能PWM*/
    PWM1->PWMCR |=1<<0;
}
/*中断处理函数*/
void pwm1_fifo_irqhandler(unsigned int gocciar,void *param)
{
    if(PWM1->PWMSR & (1<<3))//FIFO空中断
    {
        pwm1_rate_set(pwm_dev.pwm_rate);
        PWM1->PWMSR |= (1<<3);//中断标志位写1清0
    }
}

/*设置周期*/
void pwm1_period_set(unsigned int value)
{
    unsigned int model_value =0;
    if (value<2)
    {
        model_value = 2;
    }else model_value = value -2;
    PWM1->PWMPR = model_value&0xffff;
}

/*设置占空比*/
void pwm1_rate_set(unsigned char rate)
{
    unsigned short model_rate;
    pwm_dev.pwm_rate = rate;//将占空比写入结构体定义的值中
    unsigned int period = PWM1->PWMPR + 2;
    model_rate=(unsigned short )(period*(rate/100.0f));//将0-100转化为占空比放入寄存器第真实值
    PWM1->PWMSAR =model_rate & 0xffff;
}

主函数:

#include "main.h"

#include "dsp_clk.h"

#include "dsp_led.h"

#include "dsp_delay.h"

#include "beep.h"

#include "dsp_key.h"

#include "dsp_int.h"

#include "dsp_exti.h"

#include "dsp_epit.h"

#include "dsp_uart.h"

#include "stdio.h"

#include "dsp_lcd.h"

#include "dsp_lcdapi.h"

#include "dsp_rtc.h"

#include "dsp_i2c.h"

#include "dsp_ap3216c.h"

#include "dsp_spi.h"

#include "dsp_icm20608.h"

#include "dsp_pwm.h"

void imx6ul_hardfpu_enable(void)//使能浮点数运算

{

	uint32_t cpacr;

	uint32_t fpexc;



	/* 使能NEON和FPU */

	cpacr = __get_CPACR();

	cpacr = (cpacr & ~(CPACR_ASEDIS_Msk | CPACR_D32DIS_Msk))

		   |  (3UL << CPACR_cp10_Pos) | (3UL << CPACR_cp11_Pos);

	__set_CPACR(cpacr);

	fpexc = __get_FPEXC();

	fpexc |= 0x40000000UL;	

	__set_FPEXC(fpexc);

}





int main(void)

{



    unsigned char kkkk=0,rate=0;

	unsigned int key_result;

	

    imx6ul_hardfpu_enable();//打开浮点运算

    int_init();//中断初始化

    imx6u_clkinit();//时钟初始化

    key_init();//按键初始化

    clk_enable();//时钟初始化

    uart_init();//串口初始化

    beep_init();//凤鸣器初始化

    led_init();//led初始化

    lcd_init();//LCD读ID号

    rtc_init();//RTC初始化

    ap3216c_init();//传感器初始化

    icm20608_init();//加速度计 陀螺仪等传感器初始化

	pwm_init();//PWM初始化

    tftlcd_dev.forecolor = LCD_RED;

    tftlcd_dev.backcolor = LCD_WHITE;



    while(1)

    {

		key_result = key_value();

		if(key_result == 0)

		{

			rate +=10;

			if(rate>110)

			{

				rate=0;

			}

			printf("占空比 = %d\r\n",rate);

			pwm1_rate_set(rate);



		}

        led_mode(kkkk);

        delay(1000);

        kkkk = !kkkk;     

    }

    return 0;    

}

三,正点原子裸机开发总结

从12.5号到1.6号,中间去海南出差17天,耗时差不多一个月,把这个正点原子的二期视频给看完,程序都敲了一遍,感觉比51是难上一成,51学了20天,看完视频基本上能自己把代码完整敲完,不用对着,这个真整不了,说是裸机开发,感觉更像是学习寄存器控制,好多好多寄存器的位要去控制,还要去函数嵌套,实现各种功能,不过也学习了各种C语言的知识,像宏还能去利用函数,枚举类型和结构体的嵌套,各种函数的调用,指针和数组的使用很多吧。做过的实验有内核时钟控制,定时器和中断的使用,串口通信,DDR内存的使用,I2C和SPI控制显示屏的各种操作,还有像小杂的PWM,按键,灯,蜂鸣器等等吧,算是对这些硬件设备有了一个新的了解,真正的怎么样从内部去使用它,不过这些只是简单的入门,或者说现在还没入上门,哈哈哈哈哈。

2-3月这个月计划把系统移植这部分给整完,真正需要学的还在驱动开发上,现在还差一段距离,不知道过年回家了,还有心思学不,继续冲鸭,整完,过个好年!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java 性能监控工具详解:JConsole、VisualVM 和 Java Mission Control

在 Java 应用程序的开发和维护过程中&#xff0c;性能监控和故障诊断是至关重要的。本文将详细介绍三款常用的 Java 性能监控工具&#xff1a;JConsole、VisualVM 和 Java Mission Control&#xff08;JMC&#xff09;&#xff0c;并探讨它们的功能和使用方法。 1 JConsole 1…

一款好用的书签管理工具

多平台同步&#xff1a;可以在网页端、手机&#xff08;iOS 和 Android&#xff09;端同步使用。无论你是在电脑上浏览网页添加书签&#xff0c;还是在外出时使用手机&#xff0c;都能方便地访问和管理书签。例如&#xff0c;你在办公室电脑上收藏了一篇关于行业研究的网页&…

ansible-api分析(Inventory)

一. 简述&#xff1a; 通过ansible 实现系统初始化功能&#xff0c; 为和平台嵌入&#xff0c; 需要通过ansible的api进行功能实现。 准确来说&#xff0c;ansible并没有纯粹的外部接入api功能&#xff0c; 只是官方提供了原生类&#xff0c;用于继承接入&#xff0c;从而实现a…

智元机器人千台量产,开启具身智能新纪元

近日&#xff0c;智元机器人正式官宣一则重磅消息&#xff1a;其第 1000 台通用具身机器人成功下线&#xff0c;这无疑在科技领域投下了一颗震撼弹&#xff0c;引发行业内外的广泛关注。 这千台下线的机器人中&#xff0c;涵盖 731 台双足人形机器人&#xff0c;如远征 A2、灵…

ROS2 跨机话题通信问题(同一个校园网账号)

文章目录 写在前面的话校园网模式&#xff08;失败&#xff09;手机热点模式&#xff08;成功&#xff09; 我的实验细节实验验证1、ssh 用户名IP地址 终端控制2、互相 ping 通 IP3、ros2 run turtlesim turtlesim_node/turtle_teleop_key4、ros2 multicast send/receive5、从机…

SUB输入5V升压充电16.8V芯片HU5912

HU5912芯片&#xff0c;作为航誉微电子有限公司推出的一款高性能升压充电管理IC&#xff0c;自其面世以来&#xff0c;便以其出色的性能和广泛的应用领域&#xff0c;受到了业界的高度关注和赞誉。本文将详细介绍HU5912芯片的技术特点、应用优势、市场定位以及其在各类电子设备…

导出中心设计

业务背景 应用业务经常需要导出数据&#xff0c;但是并发的导出以及不合理的导出参数常常导致应用服务的内存溢出、其他依赖应用的崩溃、导出失败&#xff1b;因此才有导出中心的设计 设计思想 将导出应用所需的内存转移至导出中心&#xff0c;将导出的条数加以限制&#xf…

构建智能企业:中关村科金大模型企业知识库的技术解析与应用

在数字化转型的浪潮中&#xff0c;企业对智能化知识管理的需求日益增长。知识作为企业的核心资产&#xff0c;其高效管理和应用对于提升企业运营效率和决策质量至关重要。中关村科金大模型企业知识库凭借其强大的技术架构和广泛的应用场景&#xff0c;成为构建智能企业的重要工…

多线程访问FFmpegFrameGrabber.start方法阻塞问题

一、背景 项目集成网络摄像头实现直播功能需要用到ffmpeg处理rtmp视频流进行web端播放 通过网上资源找到大神的springboot项目实现了rtmp视频流转为http请求进行视频中转功能&#xff0c;其底层利用javacv的FFmpegFrameGrabber进行拉流、推流&#xff0c;进而实现了视频中转。 …

C++11——2:可变模板参数

一.前言 C11引入了可变模板参数&#xff08;variadic template parameters&#xff09;的概念&#xff0c;它允许我们在模板定义中使用可变数量的参数。这样&#xff0c;我们就可以处理任意数量的参数&#xff0c;而不仅限于固定数量的参数。 二.可变模板参数 我们早在C语言…

ENSP综合实验(中小型网络)

一、实验背景 在当今数字化的企业环境中&#xff0c;一个稳定、高效且安全的网络架构对于业务的持续运营和发展至关重要。随着企业内部各部门业务的不断拓展&#xff0c;如财务部门对数据保密性要求极高&#xff0c;访客区域的网络接入需求逐渐增多&#xff0c;以及对外提供特定…

nvidia控制面板找不到怎么回事?这有解决方法!

NVIDIA控制面板是一款用于管理和调整NVIDIA显卡的软件&#xff0c;它可以让你优化游戏和图形应用程序的性能和画质&#xff0c;以及设置多显示器、音视频、CUDA等功能。但是&#xff0c;有时候你可能会发现你的电脑上找不到NVIDIA控制面板&#xff0c;这可能是由于以下原因造成…

在Vue3项目中使用svg-sprite-loader

1.普通的svg图片使用方式 1.1 路径引入 正常我们会把项目中的静态资源放在指定的一个目录&#xff0c;例如assets,使用起来就像 <img src"../assets/svgicons/about.svg" /> 1.2封装组件使用 显然上面的这种方法在项目开发中不太适用&#xff0c;每次都需…

html+css+js网页设计 美食 美食3个页面(带js)

htmlcssjs网页设计 美食 美食3个页面(带js) 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&…

【235. 二叉搜索树的最近公共祖先 中等】

题目&#xff1a; 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一…

Visual Studio C++使用笔记

个人学习笔记 右侧项目不显示 CTRL ALT L 创建第一个项目 添加类&#xff08;头文件、CPP文件&#xff09;

【Shell脚本】Docker构建Java项目,并自动停止原镜像容器,发布新版本

本文简述 经常使用docker部署SpringBoot 项目&#xff0c;因为自己的服务器小且项目简单&#xff0c;因此没有使用自动化部署。每次将jar包传到服务器后&#xff0c;需要手动构建&#xff0c;然后停止原有容器&#xff0c;并使用新的镜像启动&#xff0c;介于AI时代越来越懒的…

vulhubn中potato靶场

IP和端口探测 80端口是一个图片 7120端口是这个 使用 hydra爆破密码 使用ssh远程登录 执行exp提权到root成功&#xff0c;找到Flag&#xff01;

复杂园区网基本分支的构建

目录 1、各主机进行网络配置。2、交换机配置。3、配置路由交换&#xff0c;进行测试。4、配置路由器接口和静态路由&#xff0c;进行测试。5、最后测试任意两台主机通信情况 模拟环境链接 拓扑结构 说明&#xff1a; VLAN标签在上面的一定是GigabitEthernet接口的&#xff0c…

信息科技伦理与道德2:研究方法

1 问题描述 1.1 讨论&#xff1f; 请挑一项信息技术&#xff0c;谈一谈为什么认为他是道德的/不道德的&#xff0c;或者根据使用场景才能判断是否道德。判断的依据是什么&#xff08;自身的道德准则&#xff09;&#xff1f;为什么你觉得你的道德准则是合理的&#xff0c;其他…