【分享】K60(Cortex-M4)开源开发探索——转载

2020-02-21 21:13发布

本帖最后由 cn_x 于 2014-8-28 23:07 编辑

一、Cortex-M4内核
简介
                        ARM Cortex-M4 处理器是由 ARM 专门开发的最新嵌入式处理器,用以满足需要有效且易于使用的控制和信号处理功能混合的数字信号控制市场。
         高效的信号处理功能与 Cortex-M 处理器系列的低功耗、低成本和易于使用的优点的组合,旨在满足专门面向电动机控制、汽车、电源管理、嵌入式音频和工业自动化市场的新兴类别的灵活解决方案。               Cortex‐M4是一个32位处理器内核。内部的数据路径是32位的,寄存器是32位的,存储器接口也是32位的。CM4 采用了哈佛结构,拥有独立的指令总线和数据总线,可以让取指与数据访问并行不悖。这样一来数据访问不再占用指令总线,从而提升了性能。为实现这个特性, CM3内部含有好几条总线接口,每条都为自己的应用场合优化过,并且它们可以并行工作。但是另一方面,指令总线和数据总线共享同一个存储器空间(一个统一的存储器系统)。换句话说,不是因为有两条总线,可寻址空间就变成8GB 了。
        比较复杂的应用可能需要更多的存储系统功能,为此CM4提供一个可选的MPU,而且在需要的情况下也可以使用外部的cache 。另外在CM4中,Both小端模式和大端模式都是支持的。
        CM4内部还附赠了好多调试组件,用于在硬件水平上支持调试操作,如指令断点,数据观察点等。另外,为支持更高级的调试,还有其它可选组件,包括指令跟踪和多种类型的调试接口。
        复位状态后,CM4的第一件事就是读取下列两个 32位整数的值:
       (1)从地址0x0000,0000处取出 MSP 的初始值。
       (2)从地址0x0000,0004处取出 PC的初始值——这个值是复位向量,LSB 必须是1 。
        然后从这个值所对应的地址处取指。
                 注意,这与传统的ARM 架构不同——其实也和绝大多数的其它单片机不同。传统的RM 架构总是从 0 地址开始执行第一条指令。它们的 0 地址处总是一条跳转指令。在 CM3中,0 地址处提供 MSP 的初始值,然后就是向量表(向量表在以后还可以被移至其它位置)。
        向量表中的数值是32位的地址,而不是跳转指令。向量表的第一个条目指向复位后应执行的第一条指令。
        参考文献:《Cortex-M3权威指南》
二、K60简介   
        Kinetis是基于ARM Cortex-M4具有超强可扩展性的低功耗、混合信号微控制器。第一阶段产品由五个微控制器系列组成,包含超过两百种器件,在引脚、外设和软件上可兼容。每个系列提供了不同的性能,存储器和外设特性。通过通用外设、存储器映射和封装的一致性来实现系列内和各系列间的便捷移植。
       Kinetis 微控制器基于飞思卡尔创新的90纳米薄膜存储器(TFS)闪存技术,具有独特的Flex存储器(可配置的内嵌EEPROM)。Kinetis微控制器系列融合了最新的低功耗革新技术,具有高性能、高精度的混合信号能力,宽广的互连性,人机接口和安全外设。飞思卡尔公司以及其他大量的ARM第三方应用商提供对Kinetis 微控制器的应用支持。

        
转自古-月http://blog.csdn.net/hcx25909






友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
20条回答
cn_x
1楼-- · 2020-02-22 00:43
本帖最后由 cn_x 于 2014-8-28 23:04 编辑

K60(Cortex-M4)开源开发探索(二)—— 嵌入式软件开发需求分析
一、嵌入式软硬件开发现状          
        随着电子技术的不断发展,各类硬件的性能不断提升,而成本和使用难度却在不断下降。硬件的日益成熟和稳定,让嵌入式软件成为了,嵌入式开发中的关键问题。但是纵观现在的嵌入式开发现状,虽然占据了系统开发的大部分时间,可还是显得有点力不从心,很难满足用户的需求,主要表现在以下几个方面:


        (1)开发复杂:传感器、驱动器等硬件功能越来越多,用户的需求越来越复杂,造成软件规模不断增加,开发成本和复杂度提升。
        (2)移植困难:软件质量层次不齐,移植性差,很难在不同硬件设备之间移植,无法应付日益丰富的硬件市场。
        (3)缺少工具:使用商业化的软件开发工具有很多限制,商业化的调试器不适功能不够就是价格太贵。


二、软件开发需求      

         根据上面的软件开发现状,结合我主要研究的移动机器人领域,我总结了以下的软件开发需求:
         (1)代码复用性强,消除重复劳动;
          代码在编写的过程中要增强模块化,提高在不同硬件之间的可移植性。
         (2)软件耦合性小,便于分工合作;

           软件开发设计到的领域比较多,需要分工开发,所以需要降低软件的耦合性,否则联调会十分困难。
         (3)系统安全性高,人机交互友好;

           在代码编写的过程中需要注重错误处理,通过人机交互的方式实时跟踪系统状态,提高安全性。
         (4)开发工具合适,利用技术支持。

       寻找合适可靠的开发工具链,虽然针对K60飞思卡尔公司推出了CodeWarrior开发工具,但是使用免费版的限制重重,运行又龟速一样,而且必须要使用BDM,所以还是要寻找更好的开发工具。此外利用各种官方及第三方的库(比如CMSIS、官方驱动库),可以打大提高开发过程中的效率。
  
转自古-月
http://blog.csdn.net/hcx25909



cn_x
2楼-- · 2020-02-22 01:37
本帖最后由 cn_x 于 2014-8-28 23:05 编辑

K60(Cortex-M4)开源开发探索(三)—— 软件开发平台设计
        我是从参加飞思卡尔全国大学生智能汽车竞赛开始接触单片机的,现在的主要研究方向是移动机器人的嵌入式软件开发。飞思卡尔的智能汽车其实就是移动机器人的典型代表,在这个行业当中,软件开发面临着很大的挑战,我在上一篇博客中也进行了详细的分析。为了能满足比赛以及科研的需求,我们准备开发一套完整的K60软件开发平台,建立移动机器人软件开发库,减少今后重复劳动以及不科学调试所浪费的时间。
         以下是我们设计的软件平台整体结构,主要包括三大部分:

       (1)开源交叉编译环境
         windows作为现在比赛开发的主流,存在很多限制,而且不利于程序员了解底层的知识。所以为了今后的可扩展性、通用性以及对人才得培养,我们选用linux作为开发平台。
       (2)嵌入式软件系统
        这一部分主要是针对下载到移动机器人控制器中的软件系统。
       (3)数据分析与仿真环境
        因为没有很好的调试工具以及仿真软件,移动机器人的调试以及仿真工作是现在研究中比较欠缺的部分。所以我们也希望在开源环境下建立一套带有人机交互界面的调试软件。另外仿真软件的使用,可以大大减少调试过程中的体力劳动,能起到事半功倍的效果,尤其是加入物理学的仿真。这也是我们今后研究的重点。


转自古-月
http://blog.csdn.net/hcx25909



qinshiysb
3楼-- · 2020-02-22 05:58
资源好多啊。。。
cn_x
4楼-- · 2020-02-22 07:22
本帖最后由 cn_x 于 2014-8-28 23:06 编辑

K60(Cortex-M4)开源开发探索(四)—— 交叉编译环境设计

一、开源开发简介      
         windows作为现在桌面系统的主流,在开源开发领域中却存在配置困难、软件支持少等缺点,而本身就是开源系统的linux在这一领域就显示了强大的性能。近几年来,开源软件依靠灵活的特性,已经主宰了嵌入式软件开发,成为了当今嵌入式市场竞争的主要推动因素。为了适应发展,具有更好的可扩展性,我也选用linux作为研究平台。基于linux 的操作系统有很多,现在应用比较广泛的应该是ubuntu,我使用的版本是ubuntu12.04。


二、交叉编译环境结构      

        在Linux下进行嵌入式开发已经非常成熟,网上的资料非常多,一般都是使用gcc+eclipse的结构。结合移动机器人的应用,我设计的交叉编译环境的总体结构如下:


        (1)核心:arm交叉编译工具链。
         嵌入式产品的资源往往十分有限,一般采用Host/Target的模式进行开发,既在PC上开发,然后在嵌入式系统中运行的方式。所以在PC上编译出ARM架构可执行文件的交叉编译器就是十分重要了。交叉编译器主要完成的工作如下:


          (2)人机交互:Eclipse


          Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。Eclipse的插件功能十分强大,可以把我们使用到的所有软件工具结合在GUI界面下。CodeWarrior也是基于Eclipse设计的。
          (3)守护进程:OpenOCD


          openocd是一个开源的JTAG上位机,可以将gdb命令转换成jtag使用的电平信号,并且实时监控连接状态。openocd也可以独立访问硬件设备,所以可以在烧写程序之前,通过openocd初始化好硬件。详细资料可以参见官网:http://openocd.sourceforge.net/
           (4)调试器:OpenJTAG
           与BDM和jtag相比,openjtag可以实现前者的所有功能,并且可以多系统通用。而且在官网上(http://www.openjtag.org/)可以下载到PCB等技术资料。


转自古-月
http://blog.csdn.net/hcx25909



cn_x
5楼-- · 2020-02-22 11:43
 精彩回答 2  元偷偷看……
cn_x
6楼-- · 2020-02-22 15:04
本帖最后由 cn_x 于 2014-8-28 23:12 编辑

K60(Cortex-M4)开源开发探索(六)—— OpenOCD的配置

      OpenOCD需要针对不同的JTAG工具和不同的目标芯片,配置一个配置文档。一般而言,配置文档分为4个部分。
        1、Daemon         
        主要是配置openocd对外的通讯所使用的本地TCP/IP端口,如gdb、telnet所使用的端口。 接口Port的定义一般如下(非特殊情况,无需修改,定义了一些端口号)
[plain] view plaincopy


  • telnet_port 4444  
  • tcl_port 6666  


         在用telnet或gdb进行调试时,将会根据定义的端口号连接到服务程序openocd上。     
         2、Interface          

        就是openocd所操作的连接开发板的调试器。
[plain] view plaincopy


  • # type of debug adapter  
  • interface ft2232   
  • # Provides the USB device description (the iProduct string) of the FTDI FT2232 device. If not specified, the FTDI default value is used.  
  • ft2232_device_desc "USB<=>JTAG&RS232"   
  • # Each vendor’s FT2232 device can use different GPIO signals to control output-enables, reset signals, and LEDs  
  • ft2232_layout jtagkey   
  • # The vendor ID and product ID of the FTDI FT2232 device  
  • ft2232_vid_pid 0x1457 0x5118   


         注: 查看ID的方法:
           lsusb //查看设备的相关简要信息

           获取如下:
[plain] view plaincopy


  • Bus 006 Device 030: ID 1457:5118 First International Computer, Inc. OpenMoko Neo1973 Debug board (V2+)  


           获取更详细的信息:
[plain] view plaincopy


  • sudo lsusb -v -D /dev/bus/usb/006/030  

           详细信息如下:
[plain] view plaincopy


  •    Device: ID 1457:5118 First International Computer, Inc. OpenMoko Neo1973 Debug board (V2+)  
  •    Device Descriptor:  
  •    bLength                18  
  •    bDescriptorType         1  
  •    bcdUSB               2.00  
  •    bDeviceClass            0 (Defined at Interface level)  
  •    bDeviceSubClass         0   
  •    bDeviceProtocol         0   
  •    bMaxPacketSize0         8  
  •    idVendor           0x1457 First International Computer, Inc.  
  •    idProduct          0x5118 OpenMoko Neo1973 Debug board (V2+)  
  •    bcdDevice            5.00  
  •    iManufacturer           1 www.100ask.net  
  •    iProduct                2 USB<=>JTAG&RS232  
  •    iSerial                 0   
  •    bNumConfigurations      1  
  •    Configuration Descriptor:  
  •    bLength                 9  
  •    bDescriptorType         2  
  •    wTotalLength           55  
  •    bNumInterfaces          2  
  •    bConfigurationValue     1  
  •    iConfiguration          0   
  •    bmAttributes         0x80  
  •    (Bus Powered)  
  •    MaxPower              100mA  
  •    Interface Descriptor:  
  •    bLength                 9  
  •    bDescriptorType         4  
  • bInterfaceNumber        0  
  •    bAlternateSetting       0  
  •    bNumEndpoints           2  
  •    bInterfaceClass       255 Vendor Specific Class  
  •    bInterfaceSubClass    255 Vendor Specific Subclass  
  •    bInterfaceProtocol    255 Vendor Specific Protocol  
  •    iInterface              2 USB<=>JTAG&RS232  
  •    Endpoint Descriptor:  
  •    bLength                 7  
  • bDescriptorType         5  
  • bEndpointAddress     0x81  EP 1 IN  
  •    bmAttributes            2  
  •    Transfer Type            Bulk  
  •    Synch Type               None  
  •    Usage Type               Data  
  • wMaxPacketSize     0x0040  1x 64 bytes  
  • bInterval               0  
  •    Endpoint Descriptor:  
  •    bLength                 7  
  • bDescriptorType         5  
  • bEndpointAddress     0x02  EP 2 OUT  
  • bmAttributes            2  
  • Transfer Type            Bulk  
  • Synch Type               None  
  • Usage Type               Data  
  • wMaxPacketSize     0x0040  1x 64 bytes  
  • bInterval               0  
  •    Interface Descriptor:  
  • bLength                 9  
  •    bDescriptorType         4  
  •    bInterfaceNumber        1  
  •    bAlternateSetting       0  
  •    bNumEndpoints           2  
  •    bInterfaceClass       255 Vendor Specific Class  
  •    bInterfaceSubClass    255 Vendor Specific Subclass  
  •    bInterfaceProtocol    255 Vendor Specific Protocol  
  •    iInterface              2 USB<=>JTAG&RS232  
  •    Endpoint Descriptor:  
  •    bLength                 7  
  •    bDescriptorType         5  
  •    bEndpointAddress     0x83  EP 3 IN  
  •    bmAttributes            2  
  •    Transfer Type            Bulk  
  •    Synch Type               None  
  •    Usage Type               Data  
  •    wMaxPacketSize     0x0040  1x 64 bytes  
  •    bInterval               0  
  •    Endpoint Descriptor:  
  •    bLength                 7  
  •    bDescriptorType         5  
  •    bEndpointAddress     0x04  EP 4 OUT  
  •    bmAttributes            2  
  •    Transfer Type            Bulk  
  •    Synch Type               None  
  •    Usage Type               Data  
  •    wMaxPacketSize     0x0040  1x 64 bytes  
  •    bInterval               0  
  •    Device Status:     0x0000  
  • Bus Powered)  

        3、board       (1)jtag速率
        对于常见的arm、arm9,jtag配置的最大速率不能高于于cpu时钟的六分之一。如果所用的cpu时钟为60Mhz,因此jtag最大速率可设置为:
[plain] view plaincopy


  • jtag_khz 10000  

         如果使用
[plain] view plaincopy


  • jtag_rclk 3000  

        即使用自适应时钟,它将会用rclk自己搜索jtag工作频率,速度会很慢。
        (2)芯片复位

        这里配置的为jtag和target cpu可用的复位信号。其中复位jtag中的tap控制器的为trst信号,srst信号用于target cpu复位,它是都是可选的。最好的情况是这两个信号都有,这样openocd就可分别控制tap控制器和cpu的复位。
[plain] view plaincopy


  • reset_config trst_and_srst  

        4、Target        在/usr/local/share/openocd/scripts/target目录下可以找到很多芯片的配置例程,因此参照样本添加配置。
        配置TAP是一个通用的端口,通过TAP可以访问芯片提供的所有数据寄存器(DR)和指令寄存器(IR),配置语法为:

[plain] view plaincopy


  • jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0×1 -irmask 0xf -expected-id $_CPUTAPID  


       配置cpu 此处设置cpu名称以及大小端排列顺序即可。配置如下:
[plain] view plaincopy


  • target create $_TARGETNAME cortex_m3 -endian $_ENDIAN -chain-position $_TARGETNAME  

       在使用openocd下载映像到ram时,为了提高速度,在ram中设置一块工作区域,配置如下:
[plain] view plaincopy


  • $_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0  


       由于K60是Cortex-M4的内核,相比之前的arm系列有很大的不同,openocd针对cortex系列也有很多的特殊配置,所以上面的配置还只是初级的配置文档,更加详细的配置还要待今后对这一内核进入深入研究之后再添加了。
       参考链接:http://a.chinaunix.com/space.php?uid=23947686&do=blog&id=172600



转自古-月
http://blog.csdn.net/hcx25909



一周热门 更多>