以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实验(中)的更多相关文章

  1. 讯为iTop4412嵌入式开发板学习之-------前言

    一.linux 工作的分类以及培养时间 Linux 作为一个庞大的体系,有很多相关的研究领域,总结起来大致有五个方向: 1.服务器维护:需要了解 Linux 服务,熟练使用 Shell,了解网络配置. ...

  2. uboot-tiny4412启动流程(下)----如何将自己的裸板测试程序加入uboot中启动测试

    今天在工作上搞了一天高通的芯片uboot程序,目的是希望将一个裸板的程序移植到uboot中,并且开机让它运行.这个芯片是NXP4330,目前是高通的一个芯片,基于ARM-contexA9架构,那么就跟 ...

  3. 【4412嵌入式开发板学习笔记】认识uboot

    转自迅为讨论群:http://www.topeetboard.com 重要说明:这份笔记不是4412开发配套的,是我在网上看视频的时候下载上课老师的笔记后修改的.所以我试了一下笔记上的uboot命令, ...

  4. 嵌入式开发板iTOP4412学习开发板

    网站:http://www.topeetboard.com 淘宝:https://item.taobao.com/item.htm?_u=okcahs0f42a&id=38712193806 ...

  5. 【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)

    作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42239705  参考博客 : [嵌入式开发]嵌入式 开发环境 (远 ...

  6. 【arm学习】我的第一个裸板程序

    初学ARM感觉写个裸板程序还真的不容易,可能是没有用到ADS,keil之类的开发平台的缘故吧.编译,链接过程在linux平台上完成,这样学起来更有实感,还能顺便熟悉linux环境,以及命令,何乐而不为 ...

  7. 学习嵌入式开发板的Android平台体系结构和源码结构

    本文转自迅为论坛资料:http://www.topeetboard.com 推荐学习嵌入式开发板平台:iTOP-4412开发板 下面这张图出自Google官方,展示了Android系统的主要组成部分. ...

  8. 嵌入式 hi3518c裸板uboot烧写、kernel烧写、fs烧写小结

    1.在uboot中我可以添加自己的命令,添加的方法是找到一个uboot的命令,然后模仿着去增加属于自己的命令代码以及实现函数就可以 2.记住在使用printf进行调试的时候,在遇到指针或者字符串的时候 ...

  9. S5PV210裸板驱动:启动

    以往2440和6410的启动方式,只要我们把裸板代码烧写到NAND FLASH的开始位置,当开发板上点启动时,处理器会自动从NAND FLASH上拷贝前面一段的代码到内部的RAM中执行.按照以前的方法 ...

  10. 裸板中中断异常处理,linux中断异常处理 ,linux系统中断处理的API,中断处理函数的要求,内核中登记底半部的方式

    1.linux系统中的中断处理  1.0裸板中中断异常是如何处理的?     以s5p6818+按键为例          1)按键中断的触发        中断源级配置            管脚功 ...

随机推荐

  1. Node.js 应用全链路追踪技术——全链路信息存储

    作者:vivo 互联网前端团队- Yang Kun 本文是上篇文章<Node.js 应用全链路追踪技术--全链路信息获取>的后续.阅读完,再来看本文,效果会更佳哦. 本文主要介绍在Node ...

  2. Go使用协程批量获取数据,加快接口返回速度

    服务端经常需要返回一个列表,里面包含很多用户数据,常规做法当然是遍历然后读缓存. 使用Go语言后,可以并发获取,极大提升效率. 使用channel package main import ( &quo ...

  3. v-html渲染页面的时候 css样式无效

    感谢: https://www.cnblogs.com/niuxiaoxian/p/9443873.html 当我们用v-html渲染页面的时候会发现样式并没有添加上,如下 复制代码 <temp ...

  4. JAVA虚拟机06-垃圾回收及引用类型

    Java和C++之间有一堵由内存自动分配和垃圾收集技术围成的高墙 1.了解垃圾收集.内存自动分配的意义 2.JAVA虚拟机各个区域的垃圾回收简介 3.判断对象是否存活 3.1引用计数算法 3.2可达性 ...

  5. 玫瑰花变蚊子血,自动化无痕浏览器对比测试,新贵PlayWright Vs 老牌Selenium,基于Python3.10

    也许每一个男子全都有过这样的两个女人,至少两个.娶了红玫瑰,久而久之,红的变了墙上的一抹蚊子血,白的还是床前明月光:娶了白玫瑰,白的便是衣服上沾的一粒饭黏子,红的却是心口上一颗朱砂痣.--张爱玲< ...

  6. 主流的第三方直播SDK对比(腾讯云、即构、阿里云、声网、网易云信、网宿)

    直播业务概述 大家所熟知的直播平台虎牙.斗鱼.快手.抖音.B站,直播功能看似普遍,但从零到一开发却不简单.直播中运用到的技术难点非常之多,音频视频处理/编解码,前后处理,直播分发,即时通讯等技术,学好 ...

  7. 一文详解ATK Loss论文复现与代码实战

    摘要:该方法的主要思想是使用数值较大的排在前面的梯度进行反向传播,可以认为是一种在线难例挖掘方法,该方法使模型讲注意力放在较难学习的样本上,以此让模型产生更好的效果. 本文分享自华为云社区<AT ...

  8. 按照参数名ASCII码表升序顺序排序,生成签名用

    签名生成方法如下: 对所有请求参数(不包括 signature 参数),按照参数名ASCII码表升序顺序排序.如:foo=1, bar=2, foo_bar=3, baz=4 排序后的顺序是 bar= ...

  9. JavaScript之this、let、const关键字

    各场景下的this this的意思:百度翻译为:这.这么.本 在JavaScript中,表示当前对象的引用关键字,没有特殊含义. 在一个方法中,this表示该方法所属的对象. 如果单独使用,this表 ...

  10. 报错解决:DENIED Redis正在保护模式下运行

    DENIED Redis正在保护模式下运行,因为已启用保护模式,未指定绑定地址,也未向客户端请求身份验证密码.在此模式下,仅接受环回接口的连接.如果您想从外部计算机连接到Redis,您可以采用以下解决 ...