当前位置: 首页 > news >正文

《嵌入式硬件(八):基于IMX6ULL的点灯操作》

一、IMX6ULL启动代码

.global _start_start:ldr pc, =_reset_handlerldr pc, =_undefine_handlerldr pc, =_svc_handlerldr pc, =_prefetch_abort_handlerldr pc, =_data_abort_handlerldr pc, =_reserved_handlerldr pc, =_irq_handlerldr pc, =_fiq_handler_undefine_handler:ldr pc, =_undefine_handler_svc_handler:ldr pc, =_svc_handler_prefetch_abort_handler:ldr pc, =_prefetch_abort_handler_data_abort_handler:ldr pc, =_data_abort_handler_reserved_handler:ldr pc, =_reserved_handler_irq_handler:ldr pc, =_irq_handler_fiq_handler:ldr pc, =_fiq_handler_reset_handler:mrs r0, cpsrbic r0, r0, #0x1Forr r0, r0, #0x12   //irqmsr cpsr, r0ldr sp, =0x86000000	//起始地址80000000,ram大小为512mb(20000000)	80000000~A0000000-1mrs r0, cpsrbic r0, r0, #0x1Forr r0, r0, #0x1F   //systemmsr cpsr, r0   ldr sp, =0x84000000	//给irq分配的栈指针空间

二、点灯的步骤

                1)初始化时钟

                2)设置引脚功能复用(GPIO)

                3)引脚电气属性(功率、电阻)

                4)设置外设引脚的输入输出方向

                5)设置数据寄存器拉低/拉高电平

三、初始化系统时钟


ARM内核为了低功耗,刚开始是全部关闭(通过cg门)

把这七个寄存器全部打开,值全部设置为默认值,初始化系统时钟

四、功能复用

  

        设置为gpio1

五、电气属性

        默认值就行,因为是输出

   

      六、外设引脚GDRI

                设置输入输出

七、数据寄存器DR

 八、点灯代码

        1.代码结构

bsp为各种.c.h文件,im6ull为内核文件,obj是生成文件的保存路径,project是主函数以及启动文件

2.bsp

        1)led.c
#include "led.h"
#include "fsl_iomuxc.h"
#include  "MCIMX6Y2.h"void init_led(void)
{IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03, 0);IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO03_GPIO1_IO03, 0x10B0);GPIO1->GDIR |= (1 << 3);
}void led_on(void)
{GPIO1->DR &= ~(1 << 3);
}void led_off(void)
{GPIO1->DR |= (1 << 3);
}void led_nor(void)
{GPIO1->DR ^= (1 << 3);
}
        2)led.h
#ifndef _LED_H_
#define _LED_H_extern void init_led(void);
extern void led_on(void);
extern void led_off(void);
extern void led_nor(void);#endif

3.project

        1)main.c
#include "MCIMX6Y2.h"
#include "fsl_iomuxc.h"
#include "led.h"void enable_clocks(void)
{CCM->CCGR0 = 0xFFFFFFFF;CCM->CCGR1 = 0xFFFFFFFF;CCM->CCGR2 = 0xFFFFFFFF;CCM->CCGR3 = 0xFFFFFFFF;        CCM->CCGR4 = 0xFFFFFFFF;CCM->CCGR5 = 0xFFFFFFFF;CCM->CCGR6 = 0xFFFFFFFF;  
}void delay(unsigned int n)
{while(n--);
}int main(void)
{enable_clocks();init_led();while(1){led_nor();delay(0xFFFFF);}return 0;
}
        2)start.S
.global _start_start:ldr pc, =_reset_handlerldr pc, =_undefine_handlerldr pc, =_svc_handlerldr pc, =_prefetch_abort_handlerldr pc, =_data_abort_handlerldr pc, =_reserved_handlerldr pc, =_irq_handlerldr pc, =_fiq_handler_undefine_handler:ldr pc, =_undefine_handler_svc_handler:ldr pc, =_svc_handler_prefetch_abort_handler:ldr pc, =_prefetch_abort_handler_data_abort_handler:ldr pc, =_data_abort_handler_reserved_handler:ldr pc, =_reserved_handler_irq_handler:ldr pc, =_irq_handler_fiq_handler:ldr pc, =_fiq_handler_reset_handler:mrs r0, cpsrbic r0, r0, #0x1Forr r0, r0, #0x12   //irqmsr cpsr, r0ldr sp, =0x80600000mrs r0, cpsrbic r0, r0, #0x1Forr r0, r0, #0x1F   //systemmsr cpsr, r0   ldr sp, =0x80400000bl _bss_clearb main_bss_clear:ldr r0, =__bss_startldr r2, =__bss_end
loop:mov r1, #0str r1, [r0]add r0, r0, #4cmp r0, r2blt loopbx lrfinished:b finished

4.Makefile

target = ledcross_compiler = arm-linux-gnueabihf-cc = $(cross_compiler)gcc
ld = $(cross_compiler)ld
objcopy = $(cross_compiler)objcopy
objdump = $(cross_compiler)objdumpincdirs = bsp imx6ull
srcdirs = bsp projectinclude = $(patsubst %, -I%, $(incdirs))cfiles = $(foreach dir, $(srcdirs), $(wildcard $(dir)/*.c))
sfiles = $(foreach dir, $(srcdirs), $(wildcard $(dir)/*.S))cfilenodir = $(notdir $(cfiles))
sfilenodir = $(notdir $(sfiles))cobjs = $(patsubst %, obj/%, $(cfilenodir:.c=.o))
sobjs = $(patsubst %, obj/%, $(sfilenodir:.S=.o))objs = $(cobjs) $(sobjs)VPATH = $(srcdirs)$(target).bin : $(objs)$(ld) -Timx6ull.lds -o$(target).elf $^$(objcopy) -O binary -S -g $(target).elf $@$(objdump) -D $(target).elf > $(target).dis$(sobjs) : obj/%.o : %.S@mkdir -p obj$(cc) -Wall -nostdlib -c $(include) -o $@ $<$(cobjs) : obj/%.o : %.c@mkdir -p obj		$(cc) -Wall -nostdlib -c $(include) -o $@ $<.PHONY : clean
clean:rm -rf $(objs) $(target).elf $(target).bin $(target).dis


文章转载自:

http://L3zQmvmd.qsswb.cn
http://6e5KJkm2.qsswb.cn
http://WR5zhBPS.qsswb.cn
http://Z4O5MvHl.qsswb.cn
http://woinKCn4.qsswb.cn
http://i9JbI3tl.qsswb.cn
http://BNvMYWvW.qsswb.cn
http://7Hfz3qY3.qsswb.cn
http://JL8lRyrM.qsswb.cn
http://iUmqpoEU.qsswb.cn
http://NlZaIK6I.qsswb.cn
http://6bSKbaYf.qsswb.cn
http://58lmuj4X.qsswb.cn
http://Ngfbnrux.qsswb.cn
http://9SKi7CAW.qsswb.cn
http://0gL9t2pN.qsswb.cn
http://0EWuxQSL.qsswb.cn
http://cIn1WmbH.qsswb.cn
http://47HGqrWk.qsswb.cn
http://MRXJwIdN.qsswb.cn
http://Eyy6pfdu.qsswb.cn
http://n47Uw5Tv.qsswb.cn
http://aGfJIWvq.qsswb.cn
http://FbNALOjI.qsswb.cn
http://Yh5DWAhQ.qsswb.cn
http://ztVHSo4M.qsswb.cn
http://bGU8KAYF.qsswb.cn
http://xF6SqD7u.qsswb.cn
http://mvsbQRMy.qsswb.cn
http://wvRxEWFX.qsswb.cn
http://www.dtcms.com/a/382994.html

相关文章:

  • css的基本知识
  • AOP 切面日志详细
  • 软件工程实践二:Spring Boot 知识回顾
  • 从美光暂停报价看存储市场博弈,2026年冲突加剧!
  • Bean.
  • Kafka 入门指南:从 0 到 1 构建你的 Kafka 知识基础入门体系
  • 从qwen3-next学习大模型前沿架构
  • 【Linux】深入Linux多线程架构与高性能编程
  • Python爬虫-爬取拉勾网招聘数据
  • Python|Pyppeteer解决Pyppeteer启动后,页面一直显示加载中,并显示转圈卡死的问题(37)
  • C++_STL和数据结构《1》_STL、STL_迭代器、c++中的模版、STL_vecto、列表初始化、三个算法、链表
  • 【计算机网络 | 第16篇】DNS域名工作原理
  • C++算法题中的输入输出形式(I/O)
  • 【算法详解】:编程中的“无限”可能,驾驭超大数的艺术—高精度算法
  • Linux基础开发工具(gcc/g++,yum,vim,make/makefile)
  • NLP:Transformer之多头注意力(特别分享4)
  • arm芯片的功能优化方案
  • 【C++】动态数组vector的使用
  • 软件工程实践三:RESTful API 设计原则
  • [硬件电路-221]:PN结的电阻率是变化的,由无穷大到极小,随着控制电压的变化而变化,不同的电场方向,电阻率的特征也不一样,这正是PN的最有价值的地方。
  • 用户争夺与智能管理:定制开发开源AI智能名片S2B2C商城小程序的战略价值与实践路径
  • 5 遥感与机器学习第三方库安装
  • 告别双系统——WSL2+UBUNTU在WIN上畅游LINUX
  • 【开题答辩全过程】以 SpringBoot的淘宝购物优惠系统的设计与实现为例,包含答辩的问题和答案
  • SpringMVC @RequestMapping的使用演示和细节 详解
  • 后端json数据反序列化枚举类型不匹配的错误
  • 【贪心算法】day10
  • vue动画内置组件
  • 构建完整的RAG生态系统并优化每个组件
  • 20250914-03: Langchain概念:提示模板+少样本提示