本次练习实践开发板为飞凌IMX6UL开发板,教程资料参考韦东山老师的嵌入式教程。
看原理图确定引脚及操作方法
点亮LED涉及的寄存器操作
步骤1: 使能GPIO1和GPIO5
具体参考IMX6UL手册IMX6ULRM.pdf第18章CCM system clock部分表格
步骤2: 设置GPIO1_09和GPIO5_09为GPIO
从IMX6UL手册的第31章 IOMUXC Memory Map/Register Definition部分可以找到这两个引脚复用的配置寄存器信息。
主要功能代码
#include "led.h"
void led_init(void)
{
unsigned int val;
CCM_CCGR1 = (unsigned int*)(0x20C406C);
IOMUXC_SW_MUX_CTL_PAD_SNVS_TAMPER9 = (unsigned int*)(0x20E0040);
IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO09 = (unsigned int*)(0x20E0080);
GPIO5_GDIR = (unsigned int*)(0x20AC004);
GPIO1_GDIR = (unsigned int*)(0x209C004);
GPIO5_DR = (unsigned int*)(0x20AC000);
GPIO1_DR = (unsigned int*)(0x209C000);
val = *CCM_CCGR1;
val |= (3<<30);
val |= (3<<26);
*CCM_CCGR1 = val;
val = *IOMUXC_SW_MUX_CTL_PAD_SNVS_TAMPER9;
val &= ~(0xf);
val |= 5;
*IOMUXC_SW_MUX_CTL_PAD_SNVS_TAMPER9 = val;
val = *IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO09;
val &= ~(0xf);
val |= 5;
*IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO09 = val;
val = *GPIO5_GDIR;
val |= (1<<9);
*GPIO5_GDIR = val;
val = *GPIO1_GDIR;
val |= (1<<9);
*GPIO1_GDIR = val;
}
void led_ctl(int status)
{
unsigned int val;
if (status) {
#if 1
val = *GPIO5_DR;
val &= ~(1<<9);
*GPIO5_DR = val;
#endif
val = *GPIO1_DR;
val &= ~(1<<9);
*GPIO1_DR = val;
}else {
#if 1
val = *GPIO5_DR;
val |= (1<<9);
*GPIO5_DR = val;
#endif
val = *GPIO1_DR;
val |= (1<<9);
*GPIO1_DR = val;
}
}
以上功能程序和主程序实现两个LED灯的闪烁效果。
完整程序代码参考