IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 驱动开发指南 第十章 C 语言版 LED 灯实验 -> 正文阅读

[嵌入式]驱动开发指南 第十章 C 语言版 LED 灯实验

《I.MX6U 嵌入式 x Linux 驱动开发指南 V1.6 6》第十章 C 语言版 LED 灯实验

正点原子【第二期】手把手教你学Linux之ARM(MX6U)裸机篇

视频选集时间
P14第8.1讲 C语言版本LED驱动实验-实验原理分析 26:53
P15第8.2讲 C语言版本LED驱动实验-程序编写与验证39:57

一个简单的工程主要包括

启动文件
源文件
编译脚本
链接脚本

start.s

.global _start

_start:
	mrs r0, cpsr
	bic r0, r0, #0x1f
	orr r0, r0, #0x13
	msr cpsr, r0

	ldr sp, =0x80200000
	b main

main.h

#ifndef _MAIN_H_
#define _MAIN_H_

/*
 * CCM 相关寄存器地址
 */
#define CCM_CCGR0 *((volatile unsigned int *)0X020C4068)
#define CCM_CCGR1 *((volatile unsigned int *)0X020C406C)
#define CCM_CCGR2 *((volatile unsigned int *)0X020C4070)
#define CCM_CCGR3 *((volatile unsigned int *)0X020C4074)
#define CCM_CCGR4 *((volatile unsigned int *)0X020C4078)
#define CCM_CCGR5 *((volatile unsigned int *)0X020C407C)
#define CCM_CCGR6 *((volatile unsigned int *)0X020C4080)

/*
 * IOMUX 相关寄存器地址
 */
#define SW_MUX_GPIO1_IO03 *((volatile unsigned int *)0X020E0068)
#define SW_PAD_GPIO1_IO03 *((volatile unsigned int *)0X020E02F4)

/*
 * GPIO1 相关寄存器地址
 */
#define GPIO1_DR *((volatile unsigned int *)0X0209C000)
#define GPIO1_GDIR *((volatile unsigned int *)0X0209C004)
#define GPIO1_PSR *((volatile unsigned int *)0X0209C008)
#define GPIO1_ICR1 *((volatile unsigned int *)0X0209C00C)
#define GPIO1_ICR2 *((volatile unsigned int *)0X0209C010)
#define GPIO1_IMR *((volatile unsigned int *)0X0209C014)
#define GPIO1_ISR *((volatile unsigned int *)0X0209C018)
#define GPIO1_EDGE_SEL *((volatile unsigned int *)0X0209C01C)

#endif /* _MAIN_H_ */

main.c

#include "main.h"

/*
 * @description : 使能 I.MX6U 所有外设时钟
 * @param : 无
 * @return : 无
 */
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;
}

/*
 * @description : 初始化 LED 对应的 GPIO
 * @param : 无
 * @return : 无
 */
void led_init(void)
{
	/* 1、初始化 IO 复用, 复用为 GPIO1_IO03 */
	SW_MUX_GPIO1_IO03 = 0x5;

	/* 2、配置 GPIO1_IO03 的 IO 属性
	 *bit 16:0 HYS 关闭
	 *bit [15:14]: 00 默认下拉
	 *bit [13]: 0 kepper 功能
	 *bit [12]: 1 pull/keeper 使能
	 *bit [11]: 0 关闭开路输出
	 *bit [7:6]: 10 速度 100Mhz
	 *bit [5:3]: 110 R0/6 驱动能力
	 *bit [0]: 0 低转换率
	 */
	SW_PAD_GPIO1_IO03 = 0x10B0;

	/* 3、初始化 GPIO, GPIO1_IO03 设置为输出 */
	GPIO1_GDIR = 0x0000008;

	/* 4、设置 GPIO1_IO03 输出低电平,打开 LED0 */
	GPIO1_DR = 0x0;
}

/*
 * @description : 打开 LED 灯
 * @param : 无
 * @return : 无
 */
void led_on(void)
{
	/*
	 * 将 GPIO1_DR 的 bit3 清零
	 */
	GPIO1_DR &= ~(1<<3);
}

/*
 * @description : 关闭 LED 灯
 * @param : 无
 * @return : 无
 */
void led_off(void)
{
	/*
	 * 将 GPIO1_DR 的 bit3 置 1
	 */
	GPIO1_DR |= (1<<3);
}

/*
 * @description : 短时间延时函数
 * @param - n : 要延时循环次数(空操作循环次数,模式延时)
 * @return : 无
 */
void delay_short(volatile unsigned int n)
{
	while(n--){}
}

/*
 * @description : 延时函数,在 396Mhz 的主频下延时时间大约为 1ms
 * @param - n : 要延时的 ms 数
 * @return : 无
 */
void delay(volatile unsigned int n)
{
	while(n--)
	{
		delay_short(0x7ff);
	}
}

/*
 * @description : main 函数
 * @param : 无
 * @return : 无
 */
int main(void)
{
	clk_enable(); /* 使能所有的时钟 */
	led_init(); /* 初始化 led */

	while(1) /* 死循环 */
	{
		led_off(); /* 关闭 LED */
		delay(500); /* 延时大约 500ms */

		led_on(); /* 打开 LED */
		delay(500); /* 延时大约 500ms */
	}

	return 0;
}

Makefile

ARM_LINUX_IMX6ULL=/home/xlbtlmy/Desktop/IMX6ULL/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin
PREFIX_IMX6ULL=arm-linux-gnueabihf-

CC=$(ARM_LINUX_IMX6ULL)/$(PREFIX_IMX6ULL)gcc
LD=$(ARM_LINUX_IMX6ULL)/$(PREFIX_IMX6ULL)ld
OBJCOPY=$(ARM_LINUX_IMX6ULL)/$(PREFIX_IMX6ULL)objcopy
OBJDUMP=$(ARM_LINUX_IMX6ULL)/$(PREFIX_IMX6ULL)objdump

IDD=./imxdownload
SD=/dev/sdb

objs := start.o main.o

ledc.bin:$(objs)
	$(LD) -Timx6ull.lds -o ledc.elf $^
	$(OBJCOPY) -O binary -S ledc.elf $@
	$(OBJDUMP) -D -m arm ledc.elf > ledc.dis

%.o:%.s
	$(CC) -Wall -nostdlib -c -o $@ $<

%.o:%.S
	$(CC) -Wall -nostdlib -c -o $@ $<

%.o:%.c
	$(CC) -Wall -nostdlib -c -o $@ $<

sd:
	chmod +x $(IDD)
	$(IDD) ledc.bin $(SD)

clean:
	rm -rf *.o ledc.bin ledc.elf ledc.dis load.imx

imx6ull.lds

SECTIONS {
	. = 0x87800000;
	.text :
	{
		start.o
			main.o
			*(.text)
	}
	.rodata ALIGN(4) : {*(.rodata*)}
	.data ALIGN(4) : {*(.data)}
	_bss_start = .;
	.bss ALIGN(4) : {*(.bss) *(COMMON)}
	_bss_end = .;
}

编译

make

烧录

make sd
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 11:35:52  更:2022-05-05 11:38:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:51:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码