MKL26Z128VFT4单片机KEIL工程创建验证
最近在用一款恩智浦core-m0核的单片机,由于供应商提供的开发sdk不适用,所以决定自己研究单片机底层创建基于MKL26Z128VFT4单片机的KEIL工程实现底层驱动的开发,在NXP官网下载SKD及keil工程配置工程中遇到的一些问题和解决方案进行记录。
1、SDK创建下载
(1)选择芯片适用的SDK模板,进行下载,下载地址:
https://mcuxpresso.nxp.com/en/select
(2)创建好SDK后就可以进行下载,下载前进行如下图选择自己适用的配置,我选择的是keil版SDK.
(3)下载SDK及描述SDK的支持文档
下载完成就可以进行SDK的探索了。
2、SDK简介
(1)SDK内容简述
在SDK_2.4.1_MKL26Z128xxx4_docdocs文件夹下,有SKD使用的介绍文档和API使用示例文档,可以简单了解一下,后面实际用到时再去详细看,这里注意了,SDK默认是MKL46Z的demo版,所以SDK里面也包含了MKL46Z的工程资料,在配置自己的工程时需要特别注意。
(2)keil工程位置
解压下载的SDK压缩包,在SDK解压后的路径SDK_2.4.1_MKL26Z128xxx4oardsfrdmkl46z下,我们能找到SDK已经有的例程工程
我们可以选取最简单的demo_apps里面的hello_world例程工程进行配置,验证在自己的MKL26板子上运行编译好的程序。但是在能运行之前,这个过程还是比较辛苦的,因为有比较多的问题会出现,因为工程默认是为MKL46Z芯片制定的,所以需要将工程进行一些搬移配置,下面我们就来配置我们需要的MKL26Z芯片适用的keil工程。
3、基础工程搭建验证
(1)hello_word工程基础配置
用Keil5.21打开工程,keil工程缺乏ARM keil对于MKL26Z系列单片机的器件支持包,所以需要在keil官网去下载专门的器件支持包,下载地址:
http://www.keil.com/dd2/nxp/mkl26z128xxx4/
下载安装后,再重新打开hello_world的keil工程就会有可选器件包:
打开工程后,查看工程的结构和文件,你会发现,其是MKL46Z的工程模板,所以需要对其进行重新添加配置。
配置过程如下:
步骤1:更换工程中MKL46Z文件(启动文件(startup)和驱动文件(driver)和通用文件(utilities))成MKL26Z适用的
MKL26Z芯片适用的源文件及启文件在SDK_2.4.1_MKL26Z128xxx4devicesMKL26Z4路径下,把上述的三个文件夹内的相应文件替换掉,点击ok,再进行下一步操作。
步骤2:配置工程options target
上图中步骤3位置需改成图中样子,那个是个芯片型号宏定义,图中步骤4需要将之前我们替换文件时的文件路径重新包含一下:
这样还没完,比较重要的一步,需要照下图提示进行配置,
不然程序运行系统初始化时直接进入HardFault_Handler,我遇到这个问题的时候找了一下,收到这篇博文启发,感兴趣的可以参考一下:https://blog.csdn.net/u013184273/article/details/83860802
正确配置如下:
配置正确后,配置OutPut项勾选生产HEX文件,下载到板子上,单步调试可以看到程序能正常运行到main函数里面了。
中间省略了一下比较简单的配置,像j-link调试器配置,和生产hex的配置,这里不再赘述。
(2)工程源码更改,实现LED灯闪烁
参照SDK_2.4.1_MKL26Z128xxx4oardsfrdmkl46zdemo_appsled_blinkymdk路径下的led闪烁工程的main函数,拷贝到上面配置好的工程的main函数中,如下是main.c的内容
/*
* The Clear BSD License
* Copyright (c) 2013 - 2015, Freescale Semiconductor, Inc.
* Copyright 2016-2017 NXP
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted (subject to the limitations in the disclaimer below) provided
* that the following conditions are met:
*
* o Redistributions of source code must retain the above copyright notice, this list
* of conditions and the following disclaimer.
*
* o Redistributions in binary form must reproduce the above copyright notice, this
* list of conditions and the following disclaimer in the documentation and/or
* other materials provided with the distribution.
*
* o Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS LICENSE.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "fsl_device_registers.h"
#include "fsl_debug_console.h"
#include "fsl_uart.h"
#include "board.h"
#include "pin_mux.h"
/*******************************************************************************
* Definitions
******************************************************************************/
#define BOARD_LED_GPIO BOARD_LED_RED_GPIO
#define BOARD_LED_GPIO_PIN BOARD_LED_RED_GPIO_PIN
/*******************************************************************************
* Prototypes
******************************************************************************/
volatile uint32_t g_systickCounter;
/*******************************************************************************
* Code
******************************************************************************/
void SysTick_Handler(void)
{
if (g_systickCounter != 0U)
{
g_systickCounter--;
}
}
void SysTick_DelayTicks(uint32_t n)
{
g_systickCounter = n;
while(g_systickCounter != 0U)
{
}
}
/*!
* @brief Main function
*/
int main(void)
{
/* Define the init structure for the output LED pin*/
gpio_pin_config_t led_config = {
kGPIO_DigitalOutput, 0,
};
/* Board pin init */
BOARD_InitPins();
/* Init output LED GPIO. */
GPIO_PinInit(BOARD_LED_GPIO, BOARD_LED_GPIO_PIN, &led_config);
/* Set systick reload value to generate 1ms interrupt */
if(SysTick_Config(SystemCoreClock / 1000U))
{
while(1)
{
}
}
while (1)
{
/* Delay 1000 ms */
SysTick_DelayTicks(1000U);
GPIO_PortToggle(BOARD_LED_GPIO, 1u << BOARD_LED_GPIO_PIN);
}
}
在如下两个宏修改自己用来控制led的GPIO
#define BOARD_LED_GPIO BOARD_LED_RED_GPIO
#define BOARD_LED_GPIO_PIN BOARD_LED_RED_GPIO_PIN
再就是在BOARD_InitPins()函数中配置控制led的GPIO时钟使能
#define PIN24_IDX 24u /*!< Pin number for pin 24 in a port */
void BOARD_InitPins(void)
{
/* Port A Clock Gate Control: Clock enabled */
CLOCK_EnableClock(kCLOCK_PortE);
/* PORTE24 is configured as PTE24 */
PORT_SetPinMux(PORTE, PIN24_IDX, kPORT_MuxAsGpio);
}
我使用的是PTE24控制的led灯,所以如上配置使能PTE24的时钟和指定引脚复用功能。
编译通过后,下载到demo板上验证,可以看到LED正常闪烁。