zoukankan      html  css  js  c++  java
  • 合泰单片机使用总结

    之前一直用ARM 系列的单片机,现在因为产品需要,用了一款合泰单片机(HT67F2360),整个开发过程中发现还是有很多差异。

    一、开发环境中的一些差异#

    arm 系列单片机,直接用keil 接 选用的芯片就可以编译,调试,烧录。而这款合泰单片机,ht-ide 是不能直接烧录芯片的,ht-ide 只能将程序烧录到专门的仿真开发板中,仿真开发板有两个板子,母板加子板,不同系列的单片机,选用不同的子板仿真。悲剧>的是,我没有开发仿真板。程序调通了,要通过官方的提供的烧录工具hope3000 for e-link,将mtp文件烧录到具体的芯片中。找了好久没找到hope3000的命令行工具,每次烧录,都要点击好几次鼠标:选择文件,选择电压,下载,效率不太高。

    二、编译器,连接器的一些差异

    • HIT-IDE 的编译器有三个版本分别是V1,V2,V3。这三个版本的区别,不仅仅是性能上的差异,还有很多语言支持上的差异。
    • 三个版本的编译器,C语言的基本数据类型的Size(bit)互相之间会有不一致。并且无论哪个版本跟ANSI C都不完全一致。
    • 对中断函数的支持的差异。V1 不支持中断处理函数调用函数。V2,V3支持中断处理函数调用函数,但是被调用的函数必须定义为#pragma nolocal ,并且中断调用的函数不能和main 中调用同一个函数,中断之间也不能调用同一个函数(包括间接调用),否则会造成RAM 空间重叠使用。
    • V1 V2不支持静态变量,V3支持。
    • 默认情况下,未初始化的全局变量不初始化为0。如果需要,要在工程编译选项中勾选。
    • 默认情况下,enum 类型的不是byte。

    三、存储器和间接寻址

    • 这款单片机,没有一个统一的虚拟地址空间用来表示所有的存储器地址。
    • 存储器包括:Flash 程序存储器,数据存储器,特殊功能寄存器,EEPROM 数据存储器。
    • 数据存储器被分为若干个Sector,操作不同的数据存储器,要切换到不同的Sector。
      1. 例如LCD 存储器地址位于Sector 4中,要操作LCD 存储器,要先切换Sector,然后通过间接寻址方式操作存储单元。
    • EEPROM 数据存储器独立于程序存储器和数据存储器,不能像其他类型的存储器一样寻址。
      1. 地址寄存器EEA , 数据寄存器EED,控制寄存器EEC 三个寄存器用来控制内部EEPROM 数据存储器的操作。
      2. EEA 和EED 位于Sector 中,可以直接访问。而EEC位于Sector1中,要通过间接的方式访问。

    四、示例代码#

    LCD 存储器写操作 example

    void lcd_write_mem(uint8_t addr,uint8_t val)
    {
    	_mp1h = 0x04;    //sector
    	_mp1l = addr;
    	_iar1 = val;
    	_mp1h = 0x00;
    }
    

    EEPROM 存储器操作接口 example:

    uint8_t eeprom_read_byte(uint8_t addr)
    {
        uint16_t i = 0;
        //间接访问_eec
        _mp1l = 0x40;
        _mp1h = 0x01;
     
        _eea = addr;
     
        _iar1 |= 0x02;  // _rden = 1;
        _iar1 |= 0x01; //  _rd = 1
        _emi = 1;
     
     
        while ( (_iar1 & 0x01) && (i++ < 1000))
        GCC_DELAY(100);
        _iar1 &= 0xFD;
     
        _mp1l = 0x00;
        _mp1h = 0;
        return _eed;
    }
    
    void eeprom_write_byte(uint8_t addr,uint8_t data)
    {
       uint16_t i = 0;
     
        _emi = 0;
     
        //间接访问_eec
        _mp1l = 0x40;
        _mp1h = 0x01;
     
        _eea = addr;
     
     
        //_eea = addr;
        _eed = data;
        _iar1 |= 0x08;  // _wren = 1;
        _iar1 |= 0x04; //  _wr = 1
        _emi = 1;
     
        // wait _wr
        while ( (_iar1 & 0x04) && (i++ < 1000))
        GCC_DELAY(100);
     
        _mp1l = 0x00;
        _mp1h = 0;
        _iar1 &= 0x7; //_wren = 0
        _emi = 1;
    }
  • 相关阅读:
    隐藏NGINX服务器名称 和版本号
    salt-grains
    格式化输出文本的方法
    递归例子
    yield 生成器例子
    Python基础之函数
    Python基础之面向对象
    Python基础之模块2
    Python基础之字符编码
    Python基础之文件操作
  • 原文地址:https://www.cnblogs.com/liujiangyi/p/9076900.html
Copyright © 2011-2022 走看看