前面的文章介绍了如何在MDK-Keil下面进行S32K144的开发,下面就使用该工程模板进行GPIO LED的编程试验。
1. 开发环境
- S32K144EVB-Q100开发板
- MDK-Keil + Jlink
2. 硬件连接
S32K144EVB-Q100开发板关于LED的原理图如下:
也就是具体连接关系如下:
LED | PIN |
---|---|
BLUE | PTD0 |
RED | PTD15 |
GREEN | PTD16 |
3. GPIO LED实验
S32K144的开发,NXP官方提供了driver库和pal库,我们使用这些封装好的API函数就可以很容易实现我们想要的功能。
但是我为了进一步了解S32K144的芯片特性,计划是想着使用寄存器操作的方式编写代码。
当然,我不会使用那些地址值啊什么的去操作寄存器。前面的文章就介绍过,对于S32K144的SDK,就有提供寄存器操作的封装函数,xxx_hw_access.c/.h 这些文件。
Driver层那些封装函数,就是调用 xxx_hw_access.c/.h 这些文件的寄存器操作函数进一步封装得。我想着不调用 driver 层封装的那些函数了,直接调用寄存器操作的函数进行编写代码。
3.1 编写思路
- 1、使能对应GPIO端口的时钟
- 2、配置 PORT 模块寄存器,设置上拉/开漏/下拉模式、引脚复用模式、引脚是否使能中断等配置
- 3、配置 GPIO 模块寄存器,设置数据输入输出方向、GPIO引脚电平控制
3.2 代码编写
代码编写实现LED闪烁。
1、LED引脚宏定义
c
/* LED GPIO_Type */
#define LED_GPIO PTD
/* LED PORT_Type */
#define LED_PORT PORTD
/* LED PIN */
#define LED_BLUE_PIN 0U
#define LED_RED_PIN 15U
#define LED_GREEN_PIN 16U
S32K144的GPIO引脚,它涉及两个模块,PORT模块和GPIO模块。
2、LED引脚初始化代码
c
/* Enable PORT_D clock */
PCC_SetClockMode(PCC, PORTD_CLK, 1);
/* Configurate PORT register, MUX = GPIO */
PINS_SetMuxModeSel(LED_PORT, LED_GREEN_PIN, PORT_MUX_AS_GPIO);
/* Configures the port pin interrupt/DMA request */
PINS_SetPinIntSel(LED_PORT, LED_GREEN_PIN, PORT_DMA_INT_DISABLED);
/* onfigurate GPIO register, set direction is output */
PINS_GPIO_SetPinDirection(LED_GPIO, LED_GREEN_PIN, 1);
首先是使能LED引脚端口PORTD的时钟。然后配置的GPIO复用模式,失能中断和DMA。然后配置输出方向是输出模式。
3、main函数如下:
c
/* Delay function */
void Delay(volatile uint32_t count)
{
while (count--);
}
int main(void)
{
/* Enable PORT_D clock */
PCC_SetClockMode(PCC, PORTD_CLK, 1);
/* Configurate PORT register, MUX = GPIO */
PINS_SetMuxModeSel(LED_PORT, LED_GREEN_PIN, PORT_MUX_AS_GPIO);
/* Configures the port pin interrupt/DMA request */
PINS_SetPinIntSel(LED_PORT, LED_GREEN_PIN, PORT_DMA_INT_DISABLED);
/* onfigurate GPIO register, set direction is output */
PINS_GPIO_SetPinDirection(LED_GPIO, LED_GREEN_PIN, 1);
while (1)
{
PINS_GPIO_TogglePins(LED_GPIO, (1 << LED_GREEN_PIN));
Delay(0xFFFFF);
}
}
编译下载上面的代码之后,就可以看到LED闪烁。