• S32K144 GPIO编程


    前面的文章介绍了如何在MDK-Keil下面进行S32K144的开发,下面就使用该工程模板进行GPIO LED的编程试验。

    1. 开发环境

    • S32K144EVB-Q100开发板
    • MDK-Keil + Jlink

    2. 硬件连接

    S32K144EVB-Q100开发板关于LED的原理图如下:

    在这里插入图片描述

    也就是具体连接关系如下:

    LEDPIN
    BLUEPTD0
    REDPTD15
    GREENPTD16

    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引脚宏定义

    /* 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    S32K144的GPIO引脚,它涉及两个模块,PORT模块和GPIO模块。

    2、LED引脚初始化代码

    /* 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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    首先是使能LED引脚端口PORTD的时钟。然后配置的GPIO复用模式,失能中断和DMA。然后配置输出方向是输出模式。

    3、main函数如下:

    /* 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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    编译下载上面的代码之后,就可以看到LED闪烁。

  • 相关阅读:
    ROS1学习笔记:创建工作环境与功能包(ubuntu20.04)
    ORACLE的utl_raw函数在不同字符集的数据库中的用法
    FISCO BCOS(二十五)———多机部署
    K8s - 安装部署Kafka、Zookeeper集群教程(支持从K8s外部访问)
    设计模式(十三)----结构型模式之桥接模式
    Unity UGUI的CanvasScaler(画布缩放器)组件的介绍及使用
    【ubuntu】chmod命令
    记一次使用流排序遇到的问题
    代码随想录算法训练营第56天 | ● 583. 两个字符串的删除操作 ● 72. 编辑距离 ● 动态规划之编辑距离总结篇
    csp 202109-2 非零段划分
  • 原文地址:https://blog.csdn.net/luobeihai/article/details/133468281