NXP

恩智浦MKL26Z128VFT4单片机官方提供keil版SDK配置使用

2019-07-12 11:32发布

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正常闪烁。