-
#include "ioSTM8S207S8.h"
#include "Includes.h"
#include "Constants.h"
#include "Functions.h"
#include "Globals.h"
/* Author: EighthArmy @ July.2010 */
#define FIRST_SECURITY_KEY 0xAE
#define SECOND_SECURITY_KEY 0x56
#define ADD_EEPROM_S8 0x4000
/* STM8S207S8的CODE空间为64K,而EEPROM的大小为1536字节,即:3页 * 512节/页 */
/* EEPROM的KEY写入与FLASH的KEY正好相反 */
/*****************************************************
@Fn: InitialFlashReg()
@Br: 初始化闪存寄存器组
@Pa: 无
@Rt: 无
@Sp: 无
*****************************************************/
void InitialFlashReg( void ){
FLASH_CR1 = FLASH_CR1_RESET_VALUE;
FLASH_CR2 = FLASH_CR2_RESET_VALUE;
FLASH_NCR2 = FLASH_NCR2_RESET_VALUE;
FLASH_IAPSR &= ( uchar )(~( 1 << DUL )); /* 清除只读DATA区解锁 */
FLASH_IAPSR &= ( uchar )(~( 1 << PUL )); /* 清除程序区解锁 */
}
/*****************************************************
@Fn: UnlockFlash()
@Br: 解锁存储器
@Pa: 存储器类型: 不是程序区就是只读数据区
@Rt: 无
@Sp: 2个密钥的操作序列正好相反
*****************************************************/
void UnlockFlash( uchar Type ){
if( Type == UNLOCK_FLASH_TYPE ) /* 解锁程序区 */
{
FLASH_DUKR = SECOND_SECURITY_KEY;
FLASH_DUKR = FIRST_SECURITY_KEY;
}
else /* 解锁只读数据区 */
{
FLASH_DUKR = FIRST_SECURITY_KEY;
FLASH_DUKR = SECOND_SECURITY_KEY;
}
}
/*****************************************************
@Fn: LockFlash()
@Br: 锁定存储器
@Pa: 存储器类型:不是程序区就是只读数据区
@Rt: 无
@Sp: 无
*****************************************************/
void LockFlash( uchar Type ){
if( Type == UNLOCK_FLASH_TYPE )
{
FLASH_IAPSR &= ~( 1 << PUL );
}
else
{
FLASH_IAPSR &= ~( 1 << DUL );
}
}
/*****************************************************
@Fn: InitialFlashReg()
@Br: 写入一字节到指定只读数据区[EEPROM]
@Pa: 指定EEPROM地址与数据内容
@Rt: 无
@Sp: 无
*****************************************************/
void WriteByteToFLASH( ulong Address, uchar Data ){
*(( __far uchar * ) Address ) = Data;
}
/*****************************************************
@Fn: Write4BytToFlash()
@Br: 写入4字节到指定EEPROM的连续4字节空间
@Pa: EEPROM地址与LONG型数据内容
@Rt: 无
@Sp: 数据写入方式为小端模式
*****************************************************/
void Write4BytToFlash( ulong Address, ulong Data ){
/* Enable Word Write Once */
FLASH_CR2 |= ( 1 << WPRG );
FLASH_NCR2 &= ( uchar )( ~( 1 << NWPRG ));
*((( __far uchar * )Address ) + 3 ) = *(( uchar * )( &Data )); /* Write one byte - from Highest address*/
*((( __far uchar * )Address ) + 2 ) = *(( uchar * )( &Data ) + 1 ); /* Write one byte*/
*((( __far uchar * )Address ) + 1 ) = *(( uchar * )( &Data ) + 2 ); /* Write one byte*/
*(( __far uchar * )Address ) = *(( uchar * )( &Data ) + 3 ); /* Write one byte - from higher address*/
}
/*****************************************************
@Fn: ReadByteEEPROM()
@Br: 从EEPROM中读取1字节
@Pa: 指定EEPROM地址
@Rt: 读取的CHAR型内容
@Sp: 无
*****************************************************/
uchar ReadByteEEPROM( ulong Address ){
return(*(( __far uchar* ) Address )); /* Read byte */
}
/*****************************************************
@Fn: Read4BytFromFlash()
@Br: 从EEPROM中读取连续的4字节
@Pa: 指定EEPROM地址
@Rt: 读取的LONG内容
@Sp: 小端模式
*****************************************************/
ulong Read4BytFromFlash( ulong Address ){
ulong i;
ulong Temp[2];
Temp[0] = *(( __far uchar * )Address );
Temp[0] |= ( *((( __far uchar * )Address ) + 1 ) << 8 );
Temp[1] = *((( __far uchar * )Address ) + 2 );
Temp[1] |= ( *((( __far uchar * )Address ) + 3 ) << 8 );
i = Temp[0] + ( Temp[1] << 16 );
free( Temp );
return i;
}
/*****************************************************
@Fn: EraseByteFLASH()
@Br: 擦除EEPROM中内容
@Pa: 指定EEPROM地址
@Rt: 无
@Sp: 无
*****************************************************/
void EraseByteFLASH( uint Address ){
*(( __near uchar * ) Address ) = 0x00;
}
void Test( void ){
ulong i;
UnlockFlash( UNLOCK_EEPROM_TYPE );
Write4BytToFlash( ADD_EEPROM_S8, 0x12345678 );
LockFlash( UNLOCK_EEPROM_TYPE );
i = Read4BytFromFlash( ADD_EEPROM_S8 );
i = i;
}
-
我就是看到了上面的帖子才用T4代替T3的
-
波特率设置是否一样
-
有的,这个是属于C库函数,编译器会给你编译出一个malloc函数的,不过Heap还得自己设置。
MDK中这个函数就是用来设置heap大小的.;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
IF :DEF:__MICROLIB
EXPORT __initial_sp
EXPORT __heap_base
EXPORT __heap_limit
ELSE
IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__user_initial_stackheap
LDR R0, = Heap_Mem
LDR R1, =(Stack_Mem + Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size)
LDR R3, = Stack_Mem
BX LR
ALIGN复制代码
-
允许中断之前相应的中断标志已经置位,清除该标志位之后再允许中断
-
应该在platform.bib和project.bib中添加都可以吧,但是同时你要将你的应用程序copy到release目录下啊
我一般都是在platform.bib中加
-
谢谢大家这么帮忙,呵呵
-
加我一下,qq: 78617208, 应该可以帮你
-
待遇不好人家才走的吧,
如果待遇不好,你也别干了,没有前途,
重视人才的企业,会留住人才,而不是把你变成多面性的人才
-
引用 3 楼 sakura1987 的回复:
谁说不能选89C51?只要在配置文件Conf_tny.a51中修改RAMTOP? EQU? 7FH 就行了。
好
-
你要说你用的什么CPU,不然大家怎么给你回答呢
-
引用楼主 accessysq 的回复:
将usb设备口作为串口使用
2.如果安装了同步软件,同步软件能否同步上?如果能,那么在usb作为串口被使用的时候能否同步上?
这个跟板子中的USB类型设置也有些关系,如果USB类型为HOST类型的,这种情况下不可能同步上。
-
不懂,小弟初学C51哈,以前都用汇编!
大虾,多多指点!
在函数调用的时候,是怎么传递参数的呀?通过指定RAM吗?如何可以获取这个地址?
我是想通过这样的方法控制返回值,不知道可以不?
-
不懂的地方就问硬件的同事,仔细读一下usermannual,
先不要去搞bootloader,那个太底层了,从驱动层开始吧,
驱动层熟了之后再去搞bootloader等涉及汇编的dd
-
那就是说,不可能出现发送8位有效数据还能使用串口奇偶校验吧?
我现在在数据帧里加了一个字节,来记录整个数据帧里数据的位1的个数,以此来当作一个简单的校验。这样做有什么问题没有?
另外,请问有什么快速的方法查询一个字节里有多少个1?
-
纯顶,觉得3G离我们还远的很。不当第一个吃螃蟹的人
-
http://www.cnblogs.com/we-hjb/archive/2008/08/31/1280822.html
楼主看看这篇文件 或许对你有帮助
-
周立功的ads模版 LPC2136的 mem_c.scf
ROM_LOAD 0x0
{
ROM_EXEC 0x00000000
{
Startup.o (vectors, +First)
* (+RO)
}
IRAM 0x40000000
{
Startup.o (MyStacks)
* (+RW,+ZI)
}
HEAP +0 UNINIT
{
Startup.o (Heap)
}
STACKS 0x40002000 UNINIT
{
Startup.o (Stacks)
}
}
-
通了。。。
-
我做过,也有不少这方面的资料,但是不会随便给人。