【linux-IMX6ULL配置GPIO通用流程-以及时钟配置】

目录

  • 1. GPIO模式控制流程
    • 1.1 LED、蜂鸣器、按键
    • 1.2 GPIO控制流程
  • 2. 标准库的简要分析及实现:
    • 2.1 问题引入:
    • 2.2 代码实现:
  • 3. 时钟配置总结:
    • 3.1 时钟树概要:
    • 3.2 IMX6ULL时钟概要及时钟树:
    • 3.3 IMX6ULL时钟配置代码:

1. GPIO模式控制流程

1.1 LED、蜂鸣器、按键

  这些功能的实现都是利用了引脚的GPIO模式,通过GPIO模式进行引脚配置输出或者输入,进而实现LED、蜂鸣器、按键,的功能

1.2 GPIO控制流程

  核心配置思路如下:引脚X->寄存器A->寄存器A1->寄存器B(伪寄存器)

  • 引脚X:顾名思义,看得见,摸得着的物理引脚,一个引脚可以配置成多个模式,X可取范围是1-32,因为这个芯片是32位的,一个寄存器最多能控制32个引脚的输入和输出;
  • 寄存器A:例如对于引脚X,那么我如何把这个引脚配置成我想要的模式呢?例如配置成GPIO模式,答案就是通过寄存器A,也就是IOMUXC_SW_MUX_CTL_PAD_GPIO1_X寄存器,每个引脚都有对应的寄存器A,通过配置寄存器A来确定GPIO的工作模式
  • 寄存器A1:A和A1是一一映射的,一个引脚确定了模式,下一步就是配置电气属性,因此寄存器A1就是配置电气属性的,例如确定了GPIO的工作模式,下一步就是配置这个引脚的电气属性:就是通过寄存器A1来配置的,在数据手册中也叫:IOMUXC_SW_PAD_CTL_PAD_GPIO1_X
  • 寄存器B:引脚确定了模式和电器属性,那么下一步就是确定这个模式下如何进行工作,例如上面确定了GPIO(通用输入输出模式)那么下一步就是配置寄存器B(GPIO寄存器)进行输入或者输出、上下拉、保持、速度等功能的配置
  • 思路如下图:

2. 标准库的简要分析及实现:

2.1 问题引入:

  仔细观察一下,对于以下数据手册中引脚的寄存器地址分布,是不是每个引脚之间的寄存器地址都差4。所以知道了GPIO1_DR的地址后,剩下的寄存器地址我们都可以推出来,因此可以把这一类的寄存器放在一个结构体中,因为结构体存储数据是可以按照等字节连续存储,如何把结构体中的第一个值的地址宏定义一下,那么结构体中的其他寄存器的地址自动获得
在这里插入图片描述

2.2 代码实现:

 &emsp注意,代码把地址强制转换成了结构体指针,因为物理硬件地址不会发生变化,在一些底层的硬件编程中,需要直接访问特定的硬件寄存器。通过将寄存器的地址定义为一个结构体指针,可以方便地进行访问和操作。

//定义结构体中的首地址,那么结构体中的其他寄存器的地址自动获得
#define GPIO1_BASE                  (0x0209C000)
#define GPIO2_BASE                  (0x020A0000)
#define GPIO3_BASE                  (0x020A4000)
#define GPIO4_BASE                  (0x020A8000)
#define GPIO5_BASE                  (0x020AC000)typedef struct 
{volatile unsigned int DR;							volatile unsigned int GDIR; 							volatile unsigned int PSR;								volatile unsigned int ICR1; 							volatile unsigned int ICR2; 							 volatile unsigned int IMR;								 volatile unsigned int ISR;			volatile unsigned int EDGE_SEL;  
}GPIO_Type;#define GPIO1				((GPIO_Type *)GPIO1_BASE)//注意,这里把地址强制转换成了结构体指针,//因为物理硬件地址不会发生变化
//在一些底层的硬件编程中,需要直接访问特定的硬件寄存器。
//通过将寄存器的地址定义为一个结构体指针,可以方便地进行访问和操作。
#define GPIO2				((GPIO_Type *)GPIO2_BASE)
#define GPIO3				((GPIO_Type *)GPIO3_BASE)
#define GPIO4				((GPIO_Type *)GPIO4_BASE)
#define GPIO5				((GPIO_Type *)GPIO5_BASE)

  以上就是一个简单的标准库的实现,其实可以把整个模块都按照这样的形式写出来,例如,IO口寄存器,GPIO,USART,CLOCK,等等

3. 时钟配置总结:

3.1 时钟树概要:

  对于每款MCU都有专有的时钟路线,但是这些芯片有共同点,那就是时钟树,时钟树的根就是外部的晶振,通过对外部晶振的倍频和分频可以得到几大主干道,也就是时钟树的枝干,而通过这些枝干在进行分频和倍频可以得到各个外设需要的时钟。

3.2 IMX6ULL时钟概要及时钟树:

  IMX6ULL大体上有7个PLL和8个PFD时钟总线,其余的大都是从这些时钟总线上分频得到的;其中PLL1作为ARM内核的时钟总线,是要首先进行初始化的,初始化过程中注意点ARM时钟切换频率时要先进行时钟的转接,换好后再把系统时钟接回来;配置ARM时钟时主要参考图如下:
在这里插入图片描述
  配置其他时钟主要参考是时钟树,IMX6ULL时钟树部分截图:注意时钟树中黄色的是寄存器对选择器的配置,红色的是寄存器对分频器的的控制,分频过程中注意不要直接清零,清零代表不分频,可能时钟频率会超出下线的承受范围导致板子卡死,注意有的分频过后要进行握手检测,也就是握手换频率不用关时钟,关时钟换频率不用握手;
在这里插入图片描述

3.3 IMX6ULL时钟配置代码:

#include "bsp_clk.h"
/*使能外设时钟*/
void clk_enable(void)
{CCM->CCGR0 = 0xFFFFFFFF;CCM->CCGR1 = 0xFFFFFFFF;CCM->CCGR2 = 0xFFFFFFFF;CCM->CCGR3 = 0xFFFFFFFF;CCM->CCGR4 = 0xFFFFFFFF;CCM->CCGR5 = 0xFFFFFFFF;CCM->CCGR6 = 0xFFFFFFFF;
}/*初始化时钟*/
void imx6u_clkinit(void)
{unsigned int reg=0;/*初始化6u的主频为528MHz*/if((((CCM->CCSR)>>2) & 0x1)==0)  /*当前时钟使用的是pll1_main_clk,也就是pll1,要进行时钟切换*/{CCM->CCSR &= ~(1<<8);/*设置step_clk=osc_clk=24MHz*/CCM->CCSR |= (1<<2);/*pll1_main_clk=step_clk=24MHz*/}/*系统时钟切换已经设置好了,下一步就是设置PLL1=1056MHz,根据公式设置DIV_SELECT这八位为88,且使能*/CCM_ANALOG->PLL_ARM = ((1<<13)|((88<<0) & 0x7f));CCM->CACRR = 1;/*设置二分频*//*现在设置好了时钟,下一步就是把时钟切换回来*/CCM->CCSR &= ~(1<<2);/*把这一位PLL1_SW_CLK_SEL清零就行,切换回来了,设置pll1_main_clk=1056MHz*//*二位选择器,通过PLL1_SW_CLK_SEL=0/1来进行选择时钟频率*//*设置PL2的4路PFD*/reg=CCM_ANALOG->PFD_528;reg &=~(0x3f3f3f3f);reg |=(32<<24);             /*初始化PLL2_PFD3=297MHz,利用公式的得到:*/reg |=(24<<16);             /*初始化PLL2_PFD2=396MHz,利用公式的得到:*/reg |=(16<<8);              /*初始化PLL2_PFD1=594MHz,利用公式的得到:*/reg |=(27<<0);              /*初始化PLL2_PFD0=352MHz,利用公式的得到:*/CCM_ANALOG->PFD_528=reg;    /*设置完毕*//*设置PL3的4路PFD*/reg=0;reg=CCM_ANALOG->PFD_480;reg &=~(0x3f3f3f3f);reg |=(19<<24);              /*初始化PLL3_PFD3=454.7MHz,利用公式的得到:*/reg |=(17<<16);              /*初始化PLL3_PFD2=508.2MHz,利用公式的得到:*/reg |=(16<<8);               /*初始化PLL3_PFD1=540MHz,利用公式的得到:*/reg |=(12<<0);               /*初始化PLL3_PFD0=720MHz,利用公式的得到:*/CCM_ANALOG->PFD_480=reg;     /*设置完毕*//*设置AHB_CLK_ROOT=132MHZ*/CCM->CBCMR &= ~(3<<18);CCM->CBCMR |= (1<<18);//四路选择器选择时钟PLL2_PFD2,即设置:PRE_PERIPH_CLK_SEL=400M(396Mhz)/*设置第二个选择器,通过CBCDR寄存器进行设置*/CCM->CBCDR &= ~(1<<25);while (CCM->CDHIPR & (1<<5));  /*等待握手信号*/reg=0;reg= CCM->CBCDR;reg &= ~(7<<10);  //先清零,这里不能直接先 CCM->CBCDR &= ~(7<<10)清零,因为清零直接变成1分频,超过了132Mhz,直接死机reg |= (2<<10);   //在赋值3分频CCM->CBCDR=reg;while((CCM->CDHIPR >> 1) & (0x1));/*等待握手信号*//*设置IPG_CLK_ROOT=66MHz*//*通过设置CBCDR寄存器的IPG_PODF位实现*/reg=0;reg = CCM->CBCDR;reg &= ~(3<<8);reg |= (1<<8);CCM->CBCDR=reg; /*设置完毕*//*设置PERCLK_CLK_ROOT时钟为66Mhz*//*设置CSCMR1寄存器的PERCLK_CLK_SEL位为0(第六位),两路选择器选择进入66MHz*/CCM->CSCMR1 &= ~(1<<6); /*时钟源已经选择了IPG,可以对照着时钟树进行了解*//*分频器不分频*/CCM->CSCMR1 &= ~(0x3f << 0);/*设置完毕,1分频,66MHZ*/}

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

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

相关文章

机器学习周记(第三十七周:语义分割)2024.4.29~2024.5.5

目录 摘要 ABSTRACT 1 DeepLabV3 1.1 空间金字塔池化&#xff08;ASPP&#xff09; 1.2 解码器&#xff08;Decoder&#xff09; 1.3 Xception 2 相关代码 摘要 DeepLabV3 是由Google Brain团队开发的深度学习模型&#xff0c;专注于语义分割任务。它采用深度卷积神经网…

QtWindows任务栏

目录 引言任务栏进度右键菜单缩略图工具栏完整代码 引言 针对Windows系统的任务栏&#xff0c;Qt基于系统的原生接口封装有一些非常见类&#xff0c;如QWinTaskbarButton、QWinTaskbarButton、QWinThumbnailToolBar等&#xff0c;用于利用工具栏提供更多的信息&#xff0c;诸如…

【CTF Web】XCTF GFSJ0482 weak_auth Writeup(弱口令+密码爆破)

weak_auth 小宁写了一个登陆验证页面&#xff0c;随手就设了一个密码。 解法 随便输入一些字符&#xff0c;提示以 admin 登录。 使用 Burp 抓包。 导入密码字典。 进行爆破。 得到密码。 账号&#xff1a;admin 密码&#xff1a;123456取得 flag。 Flag cyberpeace{42c9664…

Servlet框架

简介 Servlet是运行在web服务器或应用服务器上的程序&#xff0c;他是作为来自web浏览器或其他http客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。 使用Servlet可以手机来自网页表单的用户输入&#xff0c;呈现来自数据库或者其他源记录&#xff0c;还可以动态创…

解决网络ping不通问题

网络ping不通可能有多种原因&#xff0c;以下是一些常见的解决方法&#xff1a; 1. 检查IP地址和域名&#xff1a;确保你使用的是正确的IP地址或者域名来ping目标设备。如果IP地址或者域名错误&#xff0c;ping请求将无法到达目标设备。 2. 检查网络连接&#xff1a;首先确保…

【LeetCode刷题】153. 寻找旋转排序数组中的最小值

1. 题目链接2. 题目描述3. 解题方法4. 代码 1. 题目链接 153. 寻找旋转排序数组中的最小值 2. 题目描述 3. 解题方法 根据题目分析&#xff0c;可以明确一点&#xff0c;无论该数组如何旋转&#xff0c;都会有这样的一个性质&#xff0c;就是nums[0] > nums[n-1]&#xf…

RK3568 学习笔记 : u-boot 千兆网络无法 ping 通PC问题的解决方法二

参考 RK3568 学习笔记 : u-boot 千兆网络无法 ping 通PC问题的解决 前言 rk3568 rockchip 提供的 u-boot&#xff0c;默认的设备树需要读取 单独分区 resouce.img 镜像中的 设备树文件&#xff0c;也就是 Linux 内核的设备树 dtb 文件&#xff0c;gmac 网络才能正常的 ping 通…

STM32F1之FLASH闪存

目录 1. 简介 2. 闪存模块组织 3. FLASH基本结构 4. FLASH解锁 5. 使用指针访问存储器 6. 程序存储器全擦除 7. 程序存储器页擦除 8. 程序存储器编程 9. 选项字节 1. 简介 STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分&#xff0c;通过…

【Android】Android应用性能优化总结

AndroidApp应用性能优化总结 最近大半年的时间里&#xff0c;大部分投在了某国内新能源汽车的某款AndroidApp开发上。 由于该App是该款车上&#xff0c;常用重点应用。所以车厂对应用性能的要求比较高。 主要包括&#xff1a; 应用冷启动达到***ms。应用热(温)启动达到***ms应…

RK3568笔记二十四:基于Flask的网页监控系统

若该文为原创文章&#xff0c;转载请注明原文出处。 此实验参考 《鲁班猫监控检测》&#xff0c;原代码有点BUG&#xff0c;已经下载不了。2. 鲁班猫监控检测 — [野火]嵌入式AI应用开发实战指南—基于LubanCat-RK系列板卡 文档 (embedfire.com) 一、简介 记录简单的摄像头监…

易语言IDE界面美化支持库

易语言IDE界面美化支持库 下载下来可以看到&#xff0c;是一个压缩包。 那么&#xff0c;怎么安装到易语言中呢&#xff1f; 解压之后&#xff0c;得到这两个文件。 直接将clr和lib丢到易语言安装目录中&#xff0c;这样子就安装完成了。 打开易语言&#xff0c;在支持库配置…

在营销的世界,你一定要记住:营满,则销

营销的世界中,有一个非常重要的一件事,这几个字一定要记住: 营满,则销;营未满,则不销。 你有没有把握,这是一个没办法可以复杂的东西,真得看营销人的直觉,营跟销是独立的两件事,营在营势,销是自然而然的。这里, 什么样的客户,看到什么样的产品。会有什么样的抗…

HCIP的学习(11)

OSPF的LSA详解 LSA头部信息 ​ [r2]display ospf lsdb router 1.1.1.1----查看OSPF某一条LSA的详细信息&#xff0c;类型以及LS ID参数。 链路状态老化时间 指一条LSA的老化时间&#xff0c;即存在了多长时间。当一条LSA被始发路由器产生时&#xff0c;该参数值被设定为0之后…

32 OpenCV Harris角点检测

文章目录 cornerHarris 算子示例 角点检测 cornerHarris 算子 void cv::cornerHarris ( InputArray src,OutputArray dst,int blockSize,int ksize,double K,int borderType BORDER_DEFAULT) src:待检测Harris角点的输入图像&#xff0c;图像必须是CV 8U或者CV 32F的单通道…

Maven 在项目的 pom.xml 文件中 指定 阿里云的景象仓库

配置 在 项目的 pom.xml 文件中添加如下配置即可 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&…

【Unity】位图字体制作工具:蒲公英

一般来讲&#xff0c;如果需要制作位图字体&#xff0c;一般是使用 BMFont 这种第三方工具&#xff1a;BMFont - AngelCode.comhttp://www.angelcode.com/products/bmfont/ 然而这个工具对于非程序员来说&#xff0c;操作起来较为繁琐困难。每次美术修改了字体之后&…

【区块链】比特币架构

比特币架构 2009年1月&#xff0c;在比特币系统论文发表两个月之后&#xff0c;比特币系统正式运行并开放了源码&#xff0c;标志着比特币网络的正式诞生。通过其构建的一个公开透明、去中心化、防篡改的账本系统&#xff0c;比特币开展了一场规模空前的加密数字货币体验。在区…

C++手写协程项目(协程实现线程结构体、线程调度器定义,线程挂起、切换、恢复函数,模块测试)

协程结构体定义 之前我们使用linux下协程函数实现了线程切换&#xff0c;使用的是ucontext_t结构体&#xff0c;和基于这个结构体的四个函数。现在我们要用这些工具来实现我们自己的一个线程结构体&#xff0c;并实现线程调度和线程切换、挂起。 首先我们来实现以下线程结构体…

Linux常用软件安装(JDK、MySQL、Tomcat、Redis)

目录 一、上传与下载工具Filezilla1. filezilla官网 二、JDK安装1. 在opt中创建JDK目录2.上传JDK压缩文件到新建目录中3.卸载系统自代jdk4.安装JDK5.JDK环境变量配置6. 验证是否安装成功 三、安装MySQL1.创建mysql文件夹2.下载mysql安装压缩包3.上传到文件夹里面4. 卸载系统自带…

ThreeJS:光线投射与3D场景交互

光线投射Raycaster 光线投射详细介绍可参考&#xff1a;https://en.wikipedia.org/wiki/Ray_casting&#xff0c; ThreeJS中&#xff0c;提供了Raycaster类&#xff0c;用于进行鼠标拾取&#xff0c;即&#xff1a;当三维场景中鼠标移动时&#xff0c;利用光线投射&#xff0c;…