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

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

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

相关文章

1.Python浅过(语法基础)

1.简介 Python是一种面向对象的解释型高级编程语言&#xff0c;是强类型的动态脚本语言。 解释型语言跨平台性比编译型语言&#xff08;如c语言&#xff09;好。 print("hello world")2.Bug,Debug 多看&#xff0c;多思考&#xff0c;多尝试、查资料、记录 3.prin…

Flutter:邀请海报,Widget转图片,保存相册

记录下&#xff0c;把页面红色区域内的内容&#xff0c;转成图片后保存到相册的功能 依赖 # 生成二维码 qr_flutter: ^4.1.0 # 保存图片 image_gallery_saver_plus: ^3.0.5view import package:demo/common/index.dart; import package:ducafe_ui_core/ducafe_ui_core.dart; i…

JVM实战—12.OOM的定位和解决

大纲 1.如何对系统的OOM异常进行监控和报警 2.如何在JVM内存溢出时自动dump内存快照 3.Metaspace区域内存溢出时应如何解决(OutOfMemoryError: Metaspace) 4.JVM栈内存溢出时应如何解决(StackOverflowError) 5.JVM堆内存溢出时应该如何解决(OutOfMemoryError: Java heap s…

科研绘图系列:R语言单细胞数据常见的可视化图形

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理图1图2图3图4图5图6系统信息参考介绍 单细胞数据常见的可视化图形 因为本教程是单细胞数据,因此运行本画图脚本需要电脑的内存最少32Gb 加载…

公共数据授权运营机制建设(六大机制、存在问题、发展路径)

前言在国家战略部署下&#xff0c;学界和各地方政府从理论和实践两个层面积极探索公共数据授权运营机制。本期将从学理上剖析公共数据授权运营的基本内容&#xff0c;说明公共数据授权运营到底包括哪些内容&#xff0c;并且举例说明各地在公共数据授权运营机制建设方面的典型经…

CDP集成Hudi实战-spark shell

[〇]关于本文 本文主要解释spark shell操作Hudi表的案例 软件版本Hudi1.0.0Hadoop Version3.1.1.7.3.1.0-197Hive Version3.1.3000.7.3.1.0-197Spark Version3.4.1.7.3.1.0-197CDP7.3.1 [一]使用Spark-shell 1-配置hudi Jar包 [rootcdp73-1 ~]# for i in $(seq 1 6); do s…

Python爬虫基础——百度新闻页面结构剖析

经过上一篇文章文章[Python爬虫基础——认识网页结构(各种标签的使用)]的介绍&#xff0c;我们对网页结构已经有了初步的认识&#xff0c;本篇文章针对百度新闻界界面结构进行剖析。 在浏览器地址栏中输入https://news.baidu.com/&#xff0c;然后按住F12打开发这工具在“Eleme…

【老白学 Java】保存 / 恢复对象状态

保存、恢复对象状态 文章来源&#xff1a;《Head First Java》修炼感悟。 上两篇文章分别讨论了对象序列化和反序列化&#xff0c;主要是针对数据文件进行读、写操作的介绍。 本篇文章通过一个完整的例子&#xff0c;复习一下对象保存与恢复的操作步骤&#xff0c;在文章最后做…

进程间通信——网络通信——UDP

进程间通信&#xff08;分类&#xff09;&#xff1a;网络通信、无名管道、有名管道、信号、消息队列、共享内存、信号量集 OSI七层模型&#xff1a;&#xff08;理论模型&#xff09; 应用层 : 要传输的数据信息&#xff0c;如文件传输&#xff0c;电子邮件等 表示层 : 数…

3272 小蓝的漆房

将devc设置支持编译就能用新的遍历方式 for(auto &x : s)//遍历容器s&#xff0c;变量为x /* 多循环的嵌套&#xff1a; 计数是否需要重置为0; 是否因为ans定义成全局变量导致ans在比较多时候会出现错误*/ /* 1.对于一个标准色&#xff0c;对目标数组遍历&#xff0c; 如…

海外云服务器能用来做什么?

海外云服务器不仅服务种类繁多&#xff0c;而且能满足多行业的需求&#xff0c;方便了越来越多的企业与个人。本文将探讨海外云服务器的核心服务及其适用领域&#xff0c;帮助企业更好地了解这一技术资源。 云存储&#xff1a;安全高效的数据管理 海外云服务器为用户提供了稳定…

导出中心设计

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

Re77 读论文:LoRA: Low-Rank Adaptation of Large Language Models

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文全名&#xff1a;LoRA: Low-Rank Adaptation of Large Language Models ArXiv网址&#xff1a;https://arxiv.org/abs/2106.09685 官方GitHub网站&#xff08;包含在RoBERTa、DeBERTa、GPT-2上用Lora微调…

Redis 数据库源码分析

Redis 数据库源码分析 我们都知道Redis是一个 <key,value> 的键值数据库&#xff0c;其实也就是一个 Map。如果让我来实现这样一个 Map&#xff0c;我肯定是用数组&#xff0c;当一个 key 来的时候&#xff0c;首先进行 hash 运算&#xff0c;接着对数据的 length 取余&…

我的nvim的init.lua配置

nvim的配置文件路径在&#xff5e;/.config/nvim路径下&#xff1a; 一、目录如下&#xff1a; coc-settings.json文件是配置代码片段路径的文件init.lua配置文件的启动脚本lua/config.lua 全局配置文件lua/keymaps.lua 快捷键映射键文件lua/plugins.lua 插件的安装和配置文件…

权限掩码umask

1 、 设置新建文件或目录的默认权限 在 Linux 系统中&#xff0c;当用户创建一个新的文件或目录时&#xff0c;系统都会为新建的文件或目录分配默认的权限&#xff0c;该默认权限与umask 值有关&#xff0c;其具体关系是&#xff1a; 新建文件的默认权限 0666-umask 值 新建…

宝安湾区之光附近的钓鱼点

工作日的午休我经常在公司附近骑行&#xff0c;有时候也会骑行到宝安的湾区之光。但是我最感兴趣的除了湾区之光摩天轮&#xff0c;还有雷打不动的快乐钓鱼佬。 上图红框区域的河岸每天都会出现零零散散的快乐钓鱼佬&#xff0c;他们好像都有自己的钓鱼窝点。我发现来这里钓鱼也…

音视频-----RTSP协议 音视频编解码

流媒体协议详解&#xff1a;RTSP、RTP、RTCP、SIP、SDP、RTMP、WebRTC、WebSocket-CSDN博客 上文讲解比较清楚 多媒体编解码基础知识 一文详解WebRTC、RTSP、RTMP、SRT-腾讯云开发者社区-腾讯云 流媒体协议简介 &#xff08;整理&总结&#xff09;-CSDN博客 RTP :(Real-…

家教老师预约平台小程序系统开发方案

家教老师预约平台小程序系统将连接学生/家长与家教老师&#xff0c;提供一站式的家教服务预约体验。 一、用户需求分析1、家教老师&#xff1a;希望获得更多的学生资源&#xff0c;通过平台展示自己的教学特长和经验&#xff0c;管理个人日程&#xff0c;接收并确认预约请求&a…

Linux 系统安装 NCBI Blast + A Quick Guide

前言 NCBI BLAST&#xff08;Basic Local Alignment Search Tool&#xff09;是由美国国家生物技术信息中心&#xff08;NCBI&#xff09;开发的一个深受生物信息学研究者青睐的基因序列比对工具。作为生物序列信息比对的行业标准&#xff0c;BLAST可用于分析核酸&#xff08;…