由图可知当LED发光二极管可在低电平时点亮。LED0对应的是GPIO3,而GPIO3即为GPIO1_IO03。所以,在GPIO1_IO03输出0点亮,输出1熄灭。
需要对GPIO1_IO03进行以下配置:
1.使能GPIO1时钟。
GPIO1 的时钟由 CCM_CCGR1 的 bit27 和 bit26 控制这两个位置,设置这两个位置 11 即
具体的开关方法是CCM_CCGR介绍如下:
这可能意味着每个人都有这四种设置模式:
2.设置GPIO1_IO功能复用03。
找到GPIO1_IO03复用配置寄存器IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03”的地址为
3.配置GPIO1_IO03
对应图 8.1.4.2 中 HYS,当用于使能迟滞比较器时 IO 有时作为输入功能 效,用于设置输入接收器的施密特触发器是否使能。如果需要对输入波形进行整形的话可以使 这个位置。这个位置是 0 为了 1 使能迟滞比较器。对应图 8.1.4.2 中的 PUS,设置上下拉电阻有四种选择 择,如表 所示:
图 8.1.4.2 没给,当 IO 这个位置用作输入设置 IO 使用上下 拉还是状态保持器。 0 使用状态保持器作为状态保持器 1 使用上下拉。状态保持器在 IO 作为输入是有用的,顾名思义,当外部电路断电时 IO 可以保持以前的状态 态。对应图 8.1.4.2 中的 PKE,用于使能或禁止上下拉/状态保持器功能 0 禁止上下拉/状态保持器 1 使能上下拉和状态保持器。对应图 8.1.4.2 中的 ODE,当 IO 作为输出,此位用于禁止或使能打开 此位为道路输出 0 当此位置为时,禁止开路输出 1 使开路输出功能。对应图中的 SPEED,当 IO 当用作输出时,此位用于设置 IO 速 设置如表 所示
:对应图 8.1.4.2 中的 DSE,当 IO 用于输出时设置 IO 驱动能力, 总共有 8 可选选项,如表 8.1.4.3 所示:
对应图 8.1.4.2 中的 SRE,设置压摆率,当此位置为 0 以低压摆率为例 1 是高压摆率。这里的压摆率是 IO 从 0 到 1 需要多少时 时间越小,波形越陡,压摆率越高;相反,波形越慢,压摆率越低。 如果你的产品要通过 EMC 如果你现在使用它,你可以使用小的压摆率,因为波形缓解。 IO 高压摆率可用于高速通信。
2.编程:
创建工程文件:
C 语言部分有两个文件 main.c 和 main.h,main.h 主要定义寄存器地址 main.h
输入代码:
#ifndef __MAIN_H #define __MAIN_H #define CCM_CCGR0 *((volatile unsigned int *)0x020c4068) #define CCM_CCGR1 *((volatil 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_IRC1 *((volatile unsigned int *)0x0209c00c)
#define GPIO1_IRC2 *((volatile unsigned int *)0x0209c010)
#define GPIO1_IMR *((volatile unsigned int *)0x0209c014)
#define GPIO1_ISR *((volatile unsigned int *)0x0209c018)
#define GPIO1_EDGE_SELECT *((volatile unsigned int *)0x0209c01c)
#endif
#include "main.h"
/*使能外设时钟*/
void clk_enable(void){
CCM_CCGR1 = 0xffffffff;
CCM_CCGR2 = 0xffffffff;
CCM_CCGR3 = 0xffffffff;
CCM_CCGR4 = 0xffffffff;
CCM_CCGR5 = 0xffffffff;
CCM_CCGR6 = 0xffffffff;
}
/*初始化LED*/
void led_init(void){
SW_MUX_GPIO1_IO03 = 0x5; /*复用为GPIO1_IO03 */
SW_PAD_GPIO1_IO03 = 0x10b0; /*设置GPIO1_IO03电器属性*/
/*GPIO初始化*/
GPIO1_GDIR = 0x8; /*设置为输出*/
GPIO1_DR = 0x0; /*打开LED灯*/
}
/*短延时*/
void delay_short(volatile unsigned int n){
while(n--) {}
}
/*延时,一次循环大概是1ms,主频396MHz
* n : 延时ms数
*/
void delay(volatile unsigned int n){
while (n--)
{
delay_short(0x7ff);
}
}
/*打开LED灯*/
void led_on(){
GPIO1_DR &= ~(1<<3); /*bit3清零*/
}
/*关闭LED灯*/
void led_off(){
GPIO1_DR |= (1<<3); /*bit3值置1*/
}
int main(void) {
clk_enable(); /*使能外设时钟*/
led_init(); /*初始化LED*/
/*初始化LED */
/*设置LED*/
while(1){
led_on();
delay(500);
led_off();
delay(500);
};
return 0;
}
objs = start.o main.o
ledc.bin : $(objs)
arm-linux-gnueabihf-ld -Timx6u.lds $^ -o ledc.elf
arm-linux-gnueabihf-objcopy -O binary -S ledc.elf $@
arm-linux-gnueabihf-objdump -D -m arm ledc.elf > ledc.dis
%.o : %.c
arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ $<
%.o : %.S
arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ $<
clean :
rm -rf *.o ledc.bin ledc.elf ledc.dis
设置C语言运行环境,新建文件start.S:
.global _start
_start:
/* 设置处理器进入SVC模式*/
mrs r0, cpsr /*读取cpsr到r0 */
bic r0, r0, #0x1f /*清除cpsr的bit4-0 */
orr r0, r0, #0x13 /*使用svc模式*/
msr cpsr, r0 /*将r0写入cpsr */
/*设置SP指针 */
ldr sp, =0x80200000
b main /*跳转到C语言的main函数*/