S32K144 EVB之GPIO

开发环境
  • IAR7.8 + FreeRTOS V8.2.1 + S32K144-EVB

以下是startup_S32K144.s中的汇编启动代码:

Reset_Handler
        CPSID   I               ; Mask interrupts
        ;; Init the rest of the registers
        LDR     R1,=0
        LDR     R2,=0
        LDR     R3,=0
        LDR     R4,=0
        LDR     R5,=0
        LDR     R6,=0
        LDR     R7,=0
        MOV     R8,R7
        MOV     R9,R7
        MOV     R10,R7
        MOV     R11,R7
        MOV     R12,R7

        ;; Initialize the stack pointer
        LDR     R0, =sfe(CSTACK)
        MOV     R13,R0

#ifndef __NO_SYSTEM_INIT
        ;; Call the CMSIS system init routine
        LDR     R0, =SystemInit
        BLX     R0
#endif

        ;; Init .data and .bss sections
        LDR     R0, =init_data_bss
        BLX     R0
        CPSIE   I               ; Unmask interrupts

        BL      main

经过SystemInit的初始化之后,会跳转到main函数去执行

这里做了一个七彩灯闪烁的Demo:
硬件原理图如下:
这里写图片描述
这里写图片描述
PTD15-> RGB_RED
PTD16-> RGB_GREEN
PTD0 -> RGB_BLUE
这里写图片描述
这里写图片描述
BTN0 -> PTC12
BTN1 -> PTC13

GPIO的配置时序如下:
这里写图片描述

暂且先不管如何去配置相应的外设时钟,只看如何配置GPIO:

#define RED     15
#define GREEN   16
#define BLUE    0

#define BTN0    12
#define BTN1    13

#define BIT(n)  (1 << n)

static void gpio_config(void)
{
        //config clock source

        /*
         * ISF  Interrupt Status Flag
         * IRQC Interrupt Configuration
         * LK   Lock Register
         * MUX  Pin Mux Control
         * DSE  Drive Strength Enable
         * PFE  Passive Filter Enable
         * PE   Pull Enable
         * PS   Pull Select
         */
         /*
         * ISF  0
         * IRQC 0
         * LK   0
         * MUX  001
         * DSE  0
         * PFE  0
         * PE   0
         * PS   0
         */
        //配置相应的Pin Mux Control为001 Alternative 1 (GPIO)
        PORTD->PCR[RED] = 0x00000100;
        PORTD->PCR[GREEN] = 0x00000100;
        PORTD->PCR[BLUE] = 0x00000100;

        //配置相应的Port Data Direction Register为output
        PTD->PDDR |= BIT(RED) | BIT(GREEN) | BIT(BLUE);

        //配置相应的Port Data Output Register为1,LED初始为熄灭
        PTD->PDOR |= BIT(RED) | BIT(GREEN) | BIT(BLUE);

        //配置相应的Pin Mux Control为001 Alternative 1 (GPIO)
        PORTC->PCR[BTN0] = 0x00000100;
        PORTC->PCR[BTN1] = 0x00000100;

        //配置相应的Port Data Direction Register为input
        PTC->PDDR &=~(BIT(BTN0) | BIT(BTN1));
}

static void LED_light(unsigned char color)
{
        PTD->PDOR |= BIT(RED) | BIT(GREEN) | BIT(BLUE);

        if (color & 0x01)
                PTD->PDOR &=~BIT(RED);
        if (color & 0x02)
                PTD->PDOR &=~BIT(GREEN);
        if (color & 0x04)
                PTD->PDOR &=~BIT(BLUE);
}

int main(void)
{
        unsigned char color = 0;

        gpio_config();

        while (1) {
                if (PTC->PDIR & (BIT(BTN0) | BIT(BTN1))) {
                        LED_light(color ++ % 8);
                } else {
                        LED_light(0);
                }
        }
}

编译运行,按下SW2或SW3,即可见LED灯以灭、红、绿、黄、蓝、紫、青、白交替闪烁,抬起LED灯熄灭

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值