参考:IMX+RT开发实战指南
1、配置时钟。
RT1052 的所有外设的时钟由一个专门的外设来管理,叫 CCM(Clock ControlerModule), CCM 在《IMXRT1050RM》 (参考手册)的第 18 章有详细的讲解。
这 2 个位包含 3 个有效选择, 0b00 表示该时钟关闭, 0b01 和 0b11 表示在 RT1052 芯片的 RUN 模式下都开启该时钟。其中 RUN、 WAIT、 STOP 是 RT1052 芯片的运行模式,关注 RUN 模式即可,它指芯片的正常运行状态。
/* 开启 GPIO1 端口的时钟 */
/* 清空控制 GPIO1 端口时钟的 bit26、 bit27 */
CCM_CCGR1 &= ~(unsigned int)(3<<26);
/* 把 bit26、 bit27 设置为 0b01,即开启 GPIO1 时钟 */
CCM_CCGR1 |= (unsigned int)(1<<26);
main.c
#include "MIMXRT1052.h"
/**
* 主函数
*/
int main(void)
{
/* 清空控制 GPIO1 端口时钟的 bit26、 bit27 */
CCM_CCGR1 &= ~(unsigned int)(3<<26);
/* 把 bit26、 bit27 设置为 0b01,即开启 GPIO1 时钟 */
CCM_CCGR1 |= (unsigned int)(1<<26);
/* 设置 MUX 寄存器为 0x05,表示把引脚用于普通 GPIO */
IOMUXC_MUX_GPIO_AD_B0_09 = (unsigned int)0x05;
/* 设置 PAD 寄存器控制引脚的属性 */
IOMUXC_PAD_GPIO_AD_B0_09 = (unsigned int)0x070B0;
/* 属性配置说明:
十六进制数 0x070B0 = 二进制数 0b0000 0111 0000 1011 0000
*/
/* bit0: SRE: 0b0 压摆率: 慢压摆率
bit1~bit2: -: 0b00 寄存器保留项
bit3~bit5: DSE: 0b110 驱动强度: R0/6 (仅作为输出时有效 )
bit6~bit7: SPEED:0b10 带宽 : medium(100MHz)
bit8~bit10: -: 0b000 寄存器保留项
bit11: ODE: 0b0 开漏配置: 关闭
(开漏高阻态常用于总线配置,如 I2C )
bit12: PKE: 0b1 拉/保持器配置: 使能
bit13: PUE: 0b1 拉/保持器选择: 上下拉
bit14~bit15: PUS: 0b01 上拉/下拉选择: 47K 欧上拉
bit16: HYS: 0b0 滞回器配置: 关闭
(仅输入时有效,施密特触发器,使能后可以过滤输入噪声)
bit17~bit31: -: 0b0 寄存器保留项
*/
/* 设置 GPIO1_09 引脚的方向,使用输出模式 */
GPIO1_GDIR |= (unsigned int)(1<<9);
/* 控制引脚为低电平,点亮 LED 灯 */
GPIO1_DR &= ~(unsigned int)(1<<9);
while(1);
}
// 函数为空,目的是为了骗过编译器不报错
void SystemInit(void)
{
}
#include "MIMXRT1052.h"
/* 地址可查阅 参考手册-GPIO 章节-GPIO Memory Map */
/* GPIO1 外设基地址 */
#define GPIO1_BASE (unsigned int)(0x401B8000u)
/* GPIO1 寄存器地址,强制转换成指针 */
#define GPIO1_DR *(unsigned int*)(GPIO1_BASE+0x00)
#define GPIO1_GDIR *(unsigned int*)(GPIO1_BASE+0x04)
#define GPIO1_PSR *(unsigned int*)(GPIO1_BASE+0x08)
#define GPIO1_ICR1 *(unsigned int*)(GPIO1_BASE+0x0C)
#define GPIO1_ICR2 *(unsigned int*)(GPIO1_BASE+0x10)
#define GPIO1_IMR *(unsigned int*)(GPIO1_BASE+0x14)
#define GPIO1_ISR *(unsigned int*)(GPIO1_BASE+0x18)
#define GPIO1_EDGE_SEL *(unsigned int*)(GPIO1_BASE+0x1C)
/* 地址可查阅 IOMUXC Memory Map/Register Definition */
/* IOMUXC 基地址 */
#define IOMUXC_BASE (unsigned int)(0x401F8000u)
/* MUX 模式选择寄存器 IOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B0_09 ,强制转换成指针*/
#define IOMUXC_MUX_GPIO_AD_B0_09 *(unsigned int*)(IOMUXC_BASE + 0xE0 )
/* PAD 属性设置寄存器 IOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B0_09 ,强制转换成指针*/
#define IOMUXC_PAD_GPIO_AD_B0_09 *(unsigned int*)(IOMUXC_BASE + 0x2D0 )
/* 地址可查阅 参考手册-CCM 章节-CCM Memory Map/Register Definition */
/* 时钟控制外设基地址 */
#define CCM_BASE (unsigned int)(0x400FC000u)
/* 时钟配置寄存器 CCM_CCGR1 地址 */
#define CCM_CCGR1 *(unsigned int*)(CCM_BASE + 0x6C)