发表于: 2016-1-5 15:06:31 | 显示全部楼层

FRDM-K64F开发平台采用MK64FN1M0VLL12微控制器。该控制器包含一个带有浮点单元的ARM Cortex-M4内核。其最高工作频率为120MHz,具有256KB的RAM、1MB闪存以及许多其他外设。它非常适合大多数可以采用以太网、SD卡存储以及板载模拟-数字转换器的IoT应用。但是,在开发我们自己的应用程序之前,需要将开发板使用起来,并且采用我们正在使用的开发工具运行。要做到这一点最简单的方法就是使用FRDM-K64F的GPIO模块来使LED灯闪烁。这将首先设计到一个使用mbed平台的快速原型开发的简单演示,然后使用KEIL在寄存器级别进行更深入的分析,在KEIL中我们将配置GPIO模块为输入和输出。


使用mbed下载Blinky例程到FRDM-K64F开发板

当我提到使用mbed平台下载一个简单的Blinky示例到FRM-K64F开发板,意思是使用mbed在线IDE来实现,而不是新的mbed OS。mbed在线IDE对于快速原型开发是梦幻般的,在这里,用来测试开发板上LED的功能。使用在线IDE快速开发概念验证的能力是其最吸引人的特质之一。事实上,众筹项目,至少mbed平台上他们自己的快速原型开发部分,数量在不断增长,


更新开发板的固件

在我们做任何事情之前,更新FRDM-K64F开发板自身的固件对mbed使用来说是很重要的。有关如何实现这些的详细说明,以及最新的固件更新,可以在mbed网站的FRDM-K64F固件页面上找到。

对于Windows平台,应该执行以下步骤:

1.  断开开发板的电源以及与计算机的连接。

2.  按住RESET按钮,靠近SDAUSB的地方,并且通过SDAUSB将开发板插入

3.  一个名叫BOOTLOADER的驱动器应该加载了

4.  松开RESET按钮

5.  将下载的最新固件更新拖放到驱动器

6. 一旦完成下载,板载的绿色状态指示灯应该会快速闪烁

7.  断开并重新连接USB线缆,开发板现在应该枚举为MBED。


定位和下载Hello World示例到开发板

位于mbed网站的FRDM-K64F信息页面的是mbed_blinky示例,如下图所示:

Helloloc.PNG

只需单击导入程序,并选择合适的名称来导入程序到在线IDE。通过勾选Update旁边的复选框,可以确保最新的库用于程序。

import.PNG

导入后,程序会自动打开,同时你会看到在线IDE的视图。在左栏你可以看到项目工作区。主编辑器窗口位于旁边。

overview_mbed.PNG

该编辑器串口应该显示一个类似下面所示的代码。这里mbed库已经抽象掉大部分的寄存器级别的代码,我们可以简单地通过DigitalOut接口配置引脚为输出,或者通过DigitalIn接口配置引脚为输入。

  1. #include "mbed.h"

  2. DigitalOut myled(LED1);

  3. int main() {
  4.     while(1) {
  5.         myled = 1;
  6.         wait(0.2);
  7.         myled = 0;
  8.         wait(0.2);
  9.     }
  10. }
复制代码

确保选择了正确的平台是很重要的。选择的平台位于IDE的右上角。要改变该平台,在当前选择的平台上点击,然后切换到所需要的平台或者通过浏览搭配所需的平台增加一个虚拟的平台,然后单击添加到编译器。

platform_select_mbed.PNG

只需通过编译按钮下载程序。找到下载的文件,并且拖放该二进制文件到MBED驱动器。按下RESET按钮,然后红色的LED等会每隔0.2秒闪烁。这就是想要的,现在该开发板建立起与mbed在线IDE一起工作,它已经成功下载了第一个程序。


跳转到指定楼层
发表于: 2016-1-6 10:01:02 | 显示全部楼层

使用KEIL MDK下载Blinky示例到FRDM-K64F开发板


当然,通过使用在线mbed IDE提供的简单方法也有缺点。正如您所料,在浏览器中运行的IDE的调试功能并不广泛。如果你打算尝试使用mbed在线IDE进行调试,只能打印一些内容到终端。但是,有时对于更复杂的应用,有必要使用带有一套更完整调试资源的工具。代码单步运行、添加断点以及检查内存中的寄存器和变量是调试代码的很好的方式。ARM KEIL MDK提供了这种功能。

设置FRDM-K64F用来与KEIL MDK使用

为了设置开发板用于与KEIL使用,我们必须先下载相应的驱动程序用于与KEIL使用。OpenSDA V2驱动兼容J-Link并且将在这里使用。安装驱动的过程与上述描述的安装mbed驱动是完全一样的。一旦驱动安装正确,开发板应该枚举为JLINK。


用于KEIL MDK的示例代码

为了使用KEIL MDK创建一个blinky示例,我们需要来看看与GPIO模块相关的寄存器。这些信息可以在K64子系列参考手册1757页的第55章找到。

可以在GPIO模块中访问的寄存器如下表所示:


简单介绍一些重要的位运算操作

在配置寄存器过程中最重要的两个操作符可能是按位AND赋值运算符和按位OR赋值运算符。这些可以用作设置或者清除寄存器内的特定位而不改变寄存器的其余部分。

  1. uint8_t myVar =00101100;
  2. myVar |= 00000001;
  3. myVar &=~ 00000001;
复制代码

在上面的代码中,我们将原始值与其他值进行相或,并且将结果赋值给原始值,与下面所示的结果等效:

00101100 |   00000001 = 00101101

然后我们将原始值与另一个取反的值进行相与,并且将该结果赋值给原始值,与下面所示的结果等效。

00101101 &  11111110 = 00101100


初始化GPIO模块

GPIO模块的初始化的代码如下所示。通过包含微控制器的头文件,该文件包含在KEIL的库中,我们可以使用头文件中的定义来使用适当值值寻址相应的寄存器。在这段代码中,端口需要的时钟被启用。端口控制寄存器用来将每个引脚的复用分配到“ALT 1”,即GPIO。最后,这些位根据功能设置为输入或者输出。该示例中,RGB LED配置成输出,开关2配置为输入。

  1. #include "MK64F12.H"

  2. void GPIO_init(void){
  3.         
  4.         SIM_SCGC5 |= SIM_SCGC5_PORTB_MASK;                 //Enable Port B Clock Gate Control
  5.         SIM_SCGC5 |= SIM_SCGC5_PORTC_MASK;                //Enable Port C Clock Gate Control
  6.         SIM_SCGC5 |= SIM_SCGC5_PORTE_MASK;                //Enable Port E Clock Gate Control

  7.         /*Port Multipexing*/
  8.         PORTB_PCR21 |= 1UL<<8;                          //Blue Led configured as Alt 1
  9.         PORTB_PCR22 |= 1UL<<8;                                //Red Led configured as Alt 1
  10.         PORTE_PCR26 |= 1UL<<8;                                //Green Led configured as Alt 1
  11.         PORTC_PCR6  |= 1UL<<8;                                //Switch 2 configured as Alt 1
  12.         
  13.         GPIOB_PDDR |=  (1UL << 21);                        //Set bit 21 of port B as Output
  14.         GPIOB_PDDR |=  (1UL << 22);                        //Set bit 22 of port B as Output
  15.         GPIOE_PDDR |=  (1UL << 26);                        //Set bit 26 of port E as Output
  16.         GPIOC_PDDR &=~ (1UL << 6);                        //Set bit 6 of port C as Input
  17.         
  18. }
复制代码

Main函数

main函数的代码如下所示。残留延时用来测试GPIO模块的正确配置。该代码通过检查GPIOx_PDIR中的相应位来判断开关2是否按下。如果按下,LED灯按照红绿蓝的顺序闪烁。如果没有按下,红色和蓝色的LED一直常亮。在该代码中,包含一些使用GPIOx_PDOR、GPIOx_PSOR、GPIOx_PCOR和GPIOx_PTOR寄存器打开和关断输出的不同的示例。

  1. int main(void){
  2.         uint32_t Delay = 0xFFFFF;                //Delay for blink delay
  3.         GPIO_init();                            //Intialise the pins for GPIO
  4.         
  5.         GPIOB_PDOR |= (1UL << 22);        //Turn Off Red LED
  6.         GPIOB_PDOR |= (1UL << 21);        //Turn Off Blue LED
  7.         GPIOE_PDOR |= (1UL << 26);        //Turn Off Green LED

  8.         while(1)
  9.         {
  10.                 if(!(GPIOC_PDIR & (1UL<< 6)))                //Blink LEDs when switch is pressed
  11.                 {
  12.                         GPIOB_PDOR |= (1UL << 22);        //Turn Off Red LED
  13.                         GPIOB_PDOR |= (1UL << 21);        //Turn Off Blue LED
  14.                         GPIOE_PDOR |= (1UL << 26);        //Turn Off Green LED
  15.                         
  16.                         Delay = 0xFFFFF;                //Reset Delay
  17.                         GPIOB_PDOR &=~ (1UL << 22);        //Turn On Red LED
  18.                         while(Delay != 0)                //Wait Delay Value
  19.                         {
  20.                                 Delay--;
  21.                         }
  22.                         Delay = 0xFFFFF;                //Reset Delay
  23.                         GPIOB_PDOR |= (1UL << 22) ;     //Turn Off Red LED
  24.                         while(Delay != 0)                //Wait Delay Value
  25.                         {
  26.                                 Delay--;
  27.                         }
  28.                         Delay = 0xFFFFF;                //Reset Delay
  29.                         GPIOE_PCOR |= (1UL << 26);        //Turn On Green LED
  30.                         while(Delay != 0)                //Wait Delay Value
  31.                         {
  32.                                 Delay--;
  33.                         }
  34.                         Delay = 0xFFFFF;                //Reset Delay
  35.                         GPIOE_PSOR |= (1UL << 26);      //Turn Off Green LED
  36.                         while(Delay != 0)                //Wait Delay Value
  37.                         {
  38.                                 Delay--;
  39.                         }
  40.                         Delay = 0xFFFFF;                //Reset Delay
  41.                         GPIOB_PTOR |= (1UL << 21);        //Turn On Blue LED
  42.                         while(Delay != 0)                //Wait Delay Value
  43.                         {
  44.                                 Delay--;
  45.                         }
  46.                         Delay = 0xFFFFF;                //Reset Delay
  47.                         GPIOB_PTOR |=  (1UL << 21);     //Turn Off Blue LED
  48.                         while(Delay != 0)                //Wait Delay Value
  49.                         {
  50.                                 Delay--;
  51.                         }
  52.                         
  53.                 }
  54.         else {
  55.                         GPIOB_PDOR &=~ (1UL << 22);        //Turn On Red LED
  56.                         GPIOB_PDOR &=~ (1UL << 21);        //Turn On Blue LED
  57.                 }
  58.         }
  59.         return 0;
  60. }
复制代码

在KEIL MDK创建项目并下载到开发板

要在KEIL MDK V5中创建一个新的项目,转到project >> new project。在创建新项目时,必须选择目标器件。浏览到Freescale >> K60 series并且选择MK64FN1M0xxx12。请注意,你可能需要从Keil网站的MDK软件包页面下载并安装相应的包。

keil_select_device.PNG

下一步,必须选择项目的正确的驱动程序。在“CMSIS下”选择“CORE”,以及在“Device”下选择“Startup”。

keil_libraries.PNG

完成这些步骤后,工程成功打开。需要使用上述的代码保存一个新的main文件,并且通过双击项目导航窗口的“Source Group 1”将该文件包含到工程中。

一旦完成后,点击工具栏的“compile all”图标编译该项目。现在是时候将程序下载到开发板中了。要做到这一点,通过单击工具栏上的小魔棒图标打卡options for target窗口。转到“Debug”选项卡,确保在使用设置中选择“J-LINK/ J-Trace Cortex”。

keil_Target.PNG

除此之外,单击“Setting”按钮来查看更多选项。然后在调试选项卡的“Port”选择“SW”选项。

keil_sw.PNG

现在该程序终于可以下载到开发板了。按下调试工具栏的load按钮。一旦你按下该按钮,该程序会下载到开发板,并且LED和开关的功能和预想的一样。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 47 | 回复: 68



手机版|

GMT+8, 2024-6-19 15:02 , Processed in 0.042505 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表