一、100ASK_IMX6ULL嵌入式裸板学习_LED实验(中)
以C语言方式驱动(例程与代码分析)
韦东山的例程:
start.s部分:
.text
.global _start @全局标号
_start:
//设置栈
ldr sp,=0x80200000 @设置SP指针,则栈大小为0x200000
bl clean_bss @清除BSS段
bl main @跳转到C语言的main函数
halt:
b halt @一个循环
/* 清除BSS段,就是在链接地址处将bss段清零 */
clean_bss:
ldr r1, =__bss_start //bss起始地址,r1的值作为内存地址
ldr r2, =__bss_end //bss结束地址
mov r3, #0
clean:
str r3, [r1] //将r3中的值放入r1所指向的内存地址
add r1, r1, #4 //然后r1加上4
cmp r1, r2
bne clean
mov pc, lr
led.h部分:
#ifndef __LED_H__
#define __LED_H__
/**********************************************************************
* 函数名称: led_init
* 功能描述: 初始化LED引脚,就是把它设置为输出引脚
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
***********************************************************************/
void led_init(void); //定义LED初始化函数led_init(void)
/**********************************************************************
* 函数名称: led_ctl
* 功能描述: 设置LED状态
* 输入参数:
* on : 1-LED点亮, 0-LED熄灭
* 输出参数: 无
* 返 回 值: 无
***********************************************************************/
void led_ctl(int on); //定义LED点亮函数
#endif
main.c部分:
#include "led.h"
void delay(volatile unsigned int d)
{
while(d--);
}
int main()
{
led_init(); //LED初始化
while(1)
{
led_ctl(1); //点亮LED
delay(1000000);
led_ctl(0); //熄灭LED
delay(1000000);
}
return 0;
}
led.c部分:
#include "led.h"
static volatile unsigned int *CCM_CCGR1 ;
static volatile unsigned int *IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3;
static volatile unsigned int *GPIO5_GDIR ;
static volatile unsigned int *GPIO5_DR ;
/**********************************************************************
* 函数名称: led_init
* 功能描述: 初始化LED引脚,就是把它设置为输出引脚
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
***********************************************************************/
void led_init(void)
{
unsigned int val;
CCM_CCGR1 = (volatile unsigned int *)(0x20C406C); //这一步是多余的操作,但是由于[31:30]是保留位,赋值0b11也不会造成什么影响
IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3 = (volatile unsigned int *)(0x2290014);
GPIO5_GDIR = (volatile unsigned int *)(0x020AC000 + 0x4);
GPIO5_DR = (volatile unsigned int *)(0x020AC000);
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
/* GPIO5_IO03 */
/* a. 使能GPIO5
* set CCM to enable GPIO5
* CCM_CCGR1[CG15] 0x20C406C
* bit[31:30] = 0b11
*/
*CCM_CCGR1 |= (3<<30); //这一步是多余的操作,但是由于[31:30]是保留位,赋值0b11也不会造成什么影响
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
/* b. 设置GPIO5_IO03用于GPIO
* set IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3
* to configure GPIO5_IO03 as GPIO
* IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3 0x2290014
* bit[3:0] = 0b0101 alt5
*/
val = *IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3;
val &= ~(0xf);
val |= (5);
*IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3 = val;
/* c. 设置GPIO5_IO03作为output引脚
* set GPIO5_GDIR to configure GPIO5_IO03 as output
* GPIO5_GDIR 0x020AC000 + 0x4
* bit[3] = 0b1
*/
*GPIO5_GDIR |= (1<<3);
}
/**********************************************************************
* 函数名称: led_ctl
* 功能描述: 设置LED状态
* 输入参数:
* on : 1-LED点亮, 0-LED熄灭
* 输出参数: 无
* 返 回 值: 无
***********************************************************************/
void led_ctl(int on)
{
if (on) /* on: output 0*/
{
/* d. 设置GPIO5_DR输出低电平
* set GPIO5_DR to configure GPIO5_IO03 output 0
* GPIO5_DR 0x020AC000 + 0
* bit[3] = 0b0
*/
*GPIO5_DR &= ~(1<<3); //置零操作,点亮LED
}
else /* off: output 1*/
{
/* e. 设置GPIO5_IO3输出高电平
* set GPIO5_DR to configure GPIO5_IO03 output 1
* GPIO5_DR 0x020AC000 + 0
* bit[3] = 0b1
*/
*GPIO5_DR |= (1<<3); //置1操作,关闭LED
}
}
小结(分析)
在led.c代码部分,static volatile unsigned int
定义了所要使用的寄存器的指针变量,其中:
static:为静态局部变量
一、100ASK_IMX6ULL嵌入式裸板学习_LED实验(中)的更多相关文章
- 讯为iTop4412嵌入式开发板学习之-------前言
一.linux 工作的分类以及培养时间 Linux 作为一个庞大的体系,有很多相关的研究领域,总结起来大致有五个方向: 1.服务器维护:需要了解 Linux 服务,熟练使用 Shell,了解网络配置. ...
- uboot-tiny4412启动流程(下)----如何将自己的裸板测试程序加入uboot中启动测试
今天在工作上搞了一天高通的芯片uboot程序,目的是希望将一个裸板的程序移植到uboot中,并且开机让它运行.这个芯片是NXP4330,目前是高通的一个芯片,基于ARM-contexA9架构,那么就跟 ...
- 【4412嵌入式开发板学习笔记】认识uboot
转自迅为讨论群:http://www.topeetboard.com 重要说明:这份笔记不是4412开发配套的,是我在网上看视频的时候下载上课老师的笔记后修改的.所以我试了一下笔记上的uboot命令, ...
- 嵌入式开发板iTOP4412学习开发板
网站:http://www.topeetboard.com 淘宝:https://item.taobao.com/item.htm?_u=okcahs0f42a&id=38712193806 ...
- 【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42239705 参考博客 : [嵌入式开发]嵌入式 开发环境 (远 ...
- 【arm学习】我的第一个裸板程序
初学ARM感觉写个裸板程序还真的不容易,可能是没有用到ADS,keil之类的开发平台的缘故吧.编译,链接过程在linux平台上完成,这样学起来更有实感,还能顺便熟悉linux环境,以及命令,何乐而不为 ...
- 学习嵌入式开发板的Android平台体系结构和源码结构
本文转自迅为论坛资料:http://www.topeetboard.com 推荐学习嵌入式开发板平台:iTOP-4412开发板 下面这张图出自Google官方,展示了Android系统的主要组成部分. ...
- 嵌入式 hi3518c裸板uboot烧写、kernel烧写、fs烧写小结
1.在uboot中我可以添加自己的命令,添加的方法是找到一个uboot的命令,然后模仿着去增加属于自己的命令代码以及实现函数就可以 2.记住在使用printf进行调试的时候,在遇到指针或者字符串的时候 ...
- S5PV210裸板驱动:启动
以往2440和6410的启动方式,只要我们把裸板代码烧写到NAND FLASH的开始位置,当开发板上点启动时,处理器会自动从NAND FLASH上拷贝前面一段的代码到内部的RAM中执行.按照以前的方法 ...
- 裸板中中断异常处理,linux中断异常处理 ,linux系统中断处理的API,中断处理函数的要求,内核中登记底半部的方式
1.linux系统中的中断处理 1.0裸板中中断异常是如何处理的? 以s5p6818+按键为例 1)按键中断的触发 中断源级配置 管脚功 ...
随机推荐
- .net core + vue + elementui 删除指定日期段、指定路径下的所有文件
1.呈现效果 2.后端 1)服务层 /// <summary> /// 删除指定修改日期段及指定路径下的所有文件 /// </summary> /// <param na ...
- react 项目的性能优化
react 项目的性能优化有哪些? 1.react 模块化处理 就是将react内容进行模块化划分,一个模块一个组件,react更新机制是组件重新更新 2.在react项目中更新数据,不要直接将 us ...
- LG P3809 【模板】后缀排序
贴模板 注意:\(\text{id}\) 表示第二关键字排序后(其实无需排序,利用上轮的 \(\text{sa}\) 值即可)相应的第一关键字的位置 计数排序为了稳定性最后确定位置时要倒着开始 复制的 ...
- 基于Vue3的Leaflet基础
1. 概述 Leaflet 是一个开源.轻量并且对移动端友好的交互式地图 JavaScript 库,大小仅仅只有 39 KB, 拥有绝大部分开发者所需要的所有地图特性 Leaflet 的官网为:Lea ...
- pytorch学习笔记二之自动差分引擎
自动差分引擎¶ torch.autograd是 PyTorch 的自动差分引擎,可为神经网络训练提供支持. 1. 背景¶ 神经网络(NN)是在某些输入数据上执行的嵌套函数的集合. 这些函数 ...
- ABP微服务系列学习-使用Tye启动微服务
Tye是微软开源的一款开发人员工具, 能够用于简化微服务以及分布式应用程序的开发.测试以及部署过程.Tye 的首要目标是简化微服务的开发,具体方式包括仅用一行命令执行多项服务.在容器中使用依赖项目,以 ...
- LeetCode-393 UTF-8编码验证
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/utf-8-validation 题目描述 给定一个表示数据的整数数组 data ,返回它是否为有 ...
- C语言学习--指针大小端
// 大端存储: 数据的高位存储在内存的低地址位置 //数据0x12345678, 四字节地址0x0, 0x1,0x2,0x3 //存储方式: 0x0: 存储12, 0x1:存34 0x2: 存5 ...
- 一台服务器部署ShareWAF,后面接多台Web服务器,该如何配置?
ShareWAF做为WAF,可以不只是WAF,还可以充当负载或路由的角色. 比如可以有这样一种部署架构: 在此结构中,ShareWAF部署于一台服务器,后面接多台独立的WEB服务器. ShareWAF ...
- 使用python往已有内容的PDF文件写入数据
只使用reportlab库好像没法在已经有内容的PDF页面中写入数据,只能生成一个空的PDF文件再写入.所以这里我是配合pdfrw库来实现的.具体见示例 from reportlab.pdfgen.c ...