1.前言
我们的核心板已经制作完成,那么首先就是点亮LED灯了,这基本等于hello world。在开发前,各位可以先烧录一下官方的程序,我的LED灯与官方开发板是一致的,如下图所示。
我这里的黄绿灯是3.3V上电灯,蓝灯是核心灯。如果各位制作的板子正常,烧录好官方程序后,应该是蓝灯闪烁。
2.GPIO输出
2.1初始化
gpio初始化程序如下
void init_led(void)
{
GPIO_PortInit(GPIO, 0);
CLOCK_EnableClock(kCLOCK_Gpio0);
gpio_pin_config_t LED_RED_config = {
.pinDirection = kGPIO_DigitalOutput,
.outputLogic = 0U,
};
/* Initialize GPIO functionality on pin PIO0_13 (pin 4) */
GPIO_PinInit(GPIO, 0, 13, &LED_RED_config);
}
首先说一下什么是port,我们看官方的参考手册的pin
可以看到完整的管脚名称叫做PIO0_xx,这个0,官方称为port。不过老实说,所有的io都是port0,所以怎么说呢,脱裤子放屁吧。下面我们对程序一句句分析。
第一二句就是初始化port0与开启时钟。
这是端口初始化信息,结构体原型如下。
还是比较简单的,第一个参数是方向(输入/输出)第二个参数是默认输出电平,单输出时有效。我们看回我们的初始化,便是逻辑输出模式,默认输出电平是低电平。
最后就是初始化,我一般理解为将参数投入到寄存器中,函数的原型如下图所示。
第一个参数一般写GPIO,port都是0,然后是哪个pin,我们现在是13,然后是gpio的结构体,就是我们上面写的结构体。
2.2输出
官方一个给我们提供了四个函数来输出,我这边来简单介绍一下,大致分为两类:以port为一组来写和以pin来写。
port为组来写的话可以一个函数操作多个IO,这里以13就是我们的LED来介绍吧。
2.2.1PortSet
portset即以组来置高电平,如果我们操作单个IO,方式如下
这就是将IO13置高
2.2.2PortClear
portclear也差不多,函数原型与使用方法如下
2.2.3PortToggle
porttoggle是翻转电平,写法没什么区别。
2.2.4GPIO_PinWrite
这是输出里唯一一个可以以pin为单位来读写的函数,原型如下
第一个参数依然是GPIO。第二个参数是0,这是port。第三个参数是pin,我们是第13个,因此这里写13,最后一位是输出高电平或是低电平(高:1;低:0)
2.3测试
2.4小结
port类函数可以方便地让我们使用多个GPIO,pin类函数在操作单个gpio的时候很简单,大家根据使用场景可以挑选合适的函数来使用。
3.GPIO输入
3.1初始化
初始化与输入是类似的,因为这里led我已经初始化过了,所以时钟,port等我就不再初始化了,不然LED的配置就没了。我这里以30脚为例,说一下如何检测。
相较而言,这个初始化更加简单了,确定方向是输入。再直接写函数就OK了。
3.2输入
输入的话只有一个PinRead函数
使用方法与PinWrite类似,这里不再赘述了。
3.3测试
我们将pin读到的数据放进一个变量key里面进行监测。
可以看到默认状态下key的值是1,即高电平
当我们通过跳线将30口与GND相连,key的值也就变为了0,没有问题。
4.程序
main.c
#include "key.h"
void init_key(void)
{
gpio_pin_config_t key_config = {
.pinDirection = kGPIO_DigitalInput
};
GPIO_PinInit(GPIO, 0, 30, &key_config);
}
unsigned char key;
int main(void)
{
// BOARD_InitBootPins();
BOARD_InitBootClocks();
BOARD_InitBootPeripherals();
BOARD_InitDebugConsole();
init_systick();
init_led();
init_key();
PRINTF("Hello World\r\n");
// GPIO_PortSet(GPIO,0,1<<13);
//
// GPIO_PortClear(GPIO,0,1<<13);
// GPIO_PinWrite(GPIO,0,13,1);
while (1)
{
key=GPIO_PinRead(GPIO,0,30);
// SysTick_DelayTicks(100U); //Delay 100 ms
// GPIO_PortToggle(GPIO, 0, 1u << 13);
}
return 0 ;
}
gpio.c
/*
* my_gpio.c
*
* Created on: 2024年1月25日
* Author: 18752
*/
#include "my_gpio.h"
void init_led(void)
{
GPIO_PortInit(GPIO, 0);
CLOCK_EnableClock(kCLOCK_Gpio0);
gpio_pin_config_t LED_RED_config = {
.pinDirection = kGPIO_DigitalOutput,
.outputLogic = 0U,
};
/* Initialize GPIO functionality on pin PIO0_13 (pin 4) */
GPIO_PinInit(GPIO, 0, 13, &LED_RED_config);
}
5.总结
总的来说因为我开发过RT1064,对于LPC系列的官方库还是比较熟悉的,开发起来我感觉还是蛮简单的,大家有什么问题也可以在评论区里提问出来。