
目录1. 实验概述1.1 实验目的1.2 实验环境2. 硬件原理分析2.1 LED 硬件连接2.2 GPIO 工作原理3. 代码实现3.1 时钟使能3.2 LED 初始化3.3 LED 控制函数3.4 延时函数3.5 主函数4. 编译与下载4.1 编译工程4.2 烧写程序5. 实验现象5.1 异常排查思路6. 总结7. 参考资料1. 实验概述本实验基于 I.MX6U 开发板采用 STM32 开发模式编写 LED 灯驱动。通过本实验读者可以了解如何从 STM32 开发模式转入 I.MX6U 裸机开发同时掌握 STM32 库的运行方式。下面是本实验的整体流程是否实验准备硬件连接确认编写代码编译工程烧写程序观察实验现象LED 是否正常闪烁?实验成功1.1 实验目的学习 I.MX6U 开发板裸机开发的基本流程掌握 STM32 开发模式在 I.MX6U 上的移植方法理解 GPIO 初始化和控制的底层原理1.2 实验环境硬件平台I.MX6U 开发板开发模式STM32 模式编译器ARM GCC 交叉编译工具链2. 硬件原理分析2.1 LED 硬件连接LED0 连接到 I.MX6U 的 GPIO1_IO03 引脚当 GPIO1_IO03 输出低电平时 LED 点亮输出高电平时 LED 熄灭。2.2 GPIO 工作原理I.MX6U 的 GPIO 模块通过以下寄存器控制IOMUX_SW_MUXIO 复用寄存器配置引脚功能IOMUX_SW_PADIO 属性寄存器配置电气特性GPIO1-GDIR方向寄存器配置输入/输出GPIO1-DR数据寄存器控制引脚电平GPIO 初始化的完整流程如下使能外设时钟clk_enable()配置 IO 复用IOMUX_SW_MUX-GPIO1_IO03 0X5配置 IO 属性IOMUX_SW_PAD-GPIO1_IO03 0X10B0设置 GPIO 方向GPIO1-GDIR 0X0000008设置初始电平GPIO1-DR ~(1 3)LED 点亮3. 代码实现3.1 时钟使能voidclk_enable(void){CCM-CCGR00XFFFFFFFF;CCM-CCGR10XFFFFFFFF;CCM-CCGR20XFFFFFFFF;CCM-CCGR30XFFFFFFFF;CCM-CCGR40XFFFFFFFF;CCM-CCGR50XFFFFFFFF;CCM-CCGR60XFFFFFFFF;}使能 I.MX6U 所有外设时钟确保 GPIO 等外设正常工作。3.2 LED 初始化voidled_init(void){/* 1、初始化IO复用 */IOMUX_SW_MUX-GPIO1_IO030X5;/* 复用为GPIO1_IO03 *//* 2、配置GPIO1_IO03的IO属性 */IOMUX_SW_PAD-GPIO1_IO030X10B0;/* 3、初始化GPIO */GPIO1-GDIR0X0000008;/* GPIO1_IO03设置为输出 *//* 4、设置GPIO1_IO03输出低电平打开LED0 */GPIO1-DR~(13);}初始化步骤包括配置 IO 复用、设置 IO 属性、配置 GPIO 方向和初始电平。3.3 LED 控制函数voidled_on(void){GPIO1-DR~(13);/* 将GPIO1_DR的bit3清零 */}voidled_off(void){GPIO1-DR|(13);/* 将GPIO1_DR的bit3置1 */}通过操作 GPIO1_DR 寄存器的 bit3 控制 LED 的亮灭。3.4 延时函数voiddelay_short(volatileunsignedintn){while(n--){}}voiddelay(volatileunsignedintn){while(n--){delay_short(0x7ff);}}在 396MHz 主频下delay()函数延时时间大约为 1ms。3.5 主函数intmain(void){clk_enable();/* 使能所有的时钟 */led_init();/* 初始化led */while(1)/* 死循环 */{led_off();/* 关闭LED */delay(500);/* 延时500ms */led_on();/* 打开LED */delay(500);/* 延时500ms */}return0;}主函数完成时钟使能和 LED 初始化后进入死循环实现 LED 闪烁效果。主函数的运行流程如下main() 入口clk_enable()使能所有时钟led_init()初始化 LED进入死循环led_off()关闭 LEDdelay(500)延时 500msled_on()打开 LEDdelay(500)延时 500ms4. 编译与下载4.1 编译工程在工程目录下执行make命令编译代码生成.bin文件。4.2 烧写程序使用 SD 卡或 USB 下载工具将生成的.bin文件烧写到开发板。5. 实验现象程序运行后开发板上的 LED0 将以 500ms 的间隔交替闪烁。LED 亮灭的时序关系如下图所示000ms200ms400ms600ms800ms000ms200ms400ms600ms800ms000ms熄灭高电平点亮低电平熄灭高电平点亮低电平LED 状态LED0 闪烁时序图周期 1000ms从时序图可以看出LED0 在一个完整周期1000ms内先熄灭 500ms再点亮 500ms如此循环往复。其中熄灭对应led_off()将 GPIO1_DR 的 bit3 置 1输出高电平点亮对应led_on()将 bit3 清零输出低电平两个状态之间的切换由delay(500)延时函数控制。5.1 异常排查思路如果程序烧写后 LED 没有按预期闪烁可以从以下几个方面逐步排查1. 检查时钟使能是否生效clk_enable()中通过将CCM-CCGR0 ~ CCGR6全部置为0XFFFFFFFF来使能所有外设时钟。若时钟未正确使能GPIO 外设将无法工作。调试建议在clk_enable()之后读取CCM-CCGR1的值确认其等于0XFFFFFFFF若读取值异常检查是否遗漏了某个CCGR寄存器的赋值或确认CCM基地址映射是否正确。2. 检查 IO 复用配置是否正确IOMUX_SW_MUX-GPIO1_IO03 0X5将引脚复用为 GPIO 功能。若复用配置错误引脚可能仍处于其他外设功能状态导致 GPIO 输出无法到达引脚。调试建议读取IOMUX_SW_MUX-GPIO1_IO03确认其值为0X5同时检查IOMUX_SW_PAD-GPIO1_IO03的电气属性配置如上下拉、驱动能力确保电平能够正常驱动 LED。3. 检查 GPIO 方向寄存器是否设置成功GPIO1-GDIR 0X0000008将 GPIO1_IO03 配置为输出模式。若方向配置失败引脚仍处于输入模式无法输出电平。调试建议读取GPIO1-GDIR确认 bit3 为 1若方向配置正确但 LED 仍不亮可进一步读取GPIO1-DR确认 bit3 的电平状态是否随led_on()/led_off()调用而翻转。4. 检查硬件连接与电平逻辑软件配置无误时还需确认硬件连接。LED0 接在 GPIO1_IO03 上低电平点亮、高电平熄灭。调试建议用万用表测量 GPIO1_IO03 引脚电压观察是否在 0V 与 3.3V 之间切换若引脚电平正常翻转但 LED 不亮检查 LED 限流电阻、焊接及供电是否正常。5. 检查延时与主循环逻辑若 LED 常亮或常灭而不闪烁可能是主循环逻辑或延时函数异常。调试建议确认main()中while(1)循环内led_off()与led_on()交替调用若闪烁频率异常过快或过慢检查delay()的延时参数必要时用示波器或逻辑分析仪观察引脚波形。6. 总结7. 参考资料I.MX6U 官方数据手册i.MX 6ULL Applications Processor Reference ManualI.MX6U 官方数据手册i.MX 6ULL DatasheetSTM32 开发模式移植指南正点原子 I.MX6U 嵌入式 Linux 开发指南ARM GCC 交叉编译工具链文档GNU Arm Embedded ToolchainNXP 官方 I.MX6ULL 产品页面本实验通过 STM32 开发模式完成了 I.MX6U 的 LED 灯驱动开发掌握了 GPIO 初始化和控制的基本方法为后续更复杂的裸机实验打下基础。