开发环境
- 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灯熄灭