一个NXP代理商的建议:尽量选择官方S32DS来开发KEA和S32K系列,不建议使用第三方的IDE,包括Keil
硬件准备
- 开发板:S9KEAZN16AMLH(其它的MCU也是类似)
- 仿真器: J-Link
也有许多同学问到如何使用J-Link与MCU的连接,我是使用SWD方式,请看图了:
其中J-Link的SWD相关接口的定义是:
- 第1脚:Vref,这个必须连接MCU的供电电源
- 第7脚:SWIO
- 第9脚:SWCLK
- 第15脚:RESET
- 第20脚:GND
Keil MDK for ARM的安装
这个看之前的文章: 在Windows安装MDK-ARM V5.30
LED闪烁的例程
LED原理图
使用PTD2来控制一个LED, 高电平就亮,低电平就不亮。
使用Keil新建工程
这里主要记录一些关键点,其中的我工程名称是 S9KEAZN16_TEST8:
(1)选择MCU型号
注: 如果这里没有显示你要开发的MCU的型号,那就先要安装相应的packs
(2)选择相应的组件
(3)初始化工程目录如下:
移植Keil的LED闪烁的例程到自己的工程目录中
(1)将下面文档复制一份放到自己的工程目录下面:
- Blinky.c :
D:\Keil_v5\ARM\Packs\Keil\Kinetis_KEAxx_DFP\1.3.0\Boards\NXP\TRK-KEA64\Blinky - Board_LED.h :
D:\Keil_v5\ARM\Packs\Keil\MDK-Middleware\7.11.1\Board - LED_TRK-KEA64.c : D:\Keil_v5\ARM\Packs\Keil\Kinetis_KEAxx_DFP\1.3.0\Boards\NXP\TRK-KEA64\Common
(2)移植后的工程目录如下:
(4)把这三个文件添加到工程中:
(5)修改 Blinky.c和LED_TRK-KEA64.c:
// Name: Blinky.c
#include "SKEAZN642.h" // Device header
#include "cmsis_os.h" // ARM::CMSIS:RTOS:Keil RTX
#include "Board_Buttons.h" // ::Board Support:Buttons
#include "Board_LED.h" // ::Board Support:LED
/*----------------------------------------------------------------------------
Main function
*----------------------------------------------------------------------------*/
int main (void) {
SystemCoreClockUpdate();
LED_Initialize(); /* LED Initialization */
Buttons_Initialize(); /* Buttons Initialization */
while (1) {
LED_On(0); /* Turn specified LED on */
osDelay(500); /* Wait 500ms */
LED_Off(0); /* Turn specified LED off */
osDelay(500); /* Wait 500ms */
}
}
// Name: LED_TRK-KEA64.c
#include "SKEAZN642.h" // Device header
#include "Board_LED.h" // ::Board Support:LED
#define NUM_LEDS (1) /* Number of available LEDs */
/* LED pins are PTC0..PTC3 (GPIOA.16..19) */
const uint32_t led_mask[] = { 1U << 26};
/**
\fn int32_t LED_Initialize (void)
\brief Initialize LEDs
\returns
- \b 0: function succeeded
- \b -1: function failed
*/
int32_t LED_Initialize (void) {
GPIOA->PDDR |= (led_mask[0]); /* enable PTD2 as Output */
LED_SetOut (0); /* switch LEDs off */
return 0;
}
/**
\fn int32_t LED_On (uint32_t num)
\brief Turn on requested LED
\param[in] num LED number
\returns
- \b 0: function succeeded
- \b -1: function failed
*/
int32_t LED_On (uint32_t num) {
if (num < NUM_LEDS) {
GPIOA->PSOR = led_mask[num];
}
return 0;
}
/**
\fn int32_t LED_Off (uint32_t num)
\brief Turn off requested LED
\param[in] num LED number
\returns
- \b 0: function succeeded
- \b -1: function failed
*/
int32_t LED_Off (uint32_t num) {
if (num < NUM_LEDS) {
GPIOA->PCOR = led_mask[num];
}
return 0;
}
/**
\fn int32_t LED_SetOut (uint32_t val)
\brief Write value to LEDs
\param[in] val value to be displayed on LEDs
\returns
- \b 0: function succeeded
- \b -1: function failed
*/
int32_t LED_SetOut(uint32_t value) {
int i;
for (i = 0; i < NUM_LEDS; i++) {
if (value & (1<<i)) {
LED_On (i);
} else {
LED_Off(i);
}
}
return 0;
}
/**
\fn uint32_t LED_GetCount (void)
\brief Get number of LEDs
\return Number of available LEDs
*/
uint32_t LED_GetCount (void) {
return NUM_LEDS;
}
注意的是,要看手册,PTD2对应是GPIOA的第26位:
编译工程
这里没什么好说的
配置J-Link
调试程序
如果顺利的话,你将会看到LED不停地一闪一闪,其中周期是500ms。
OVER~~