[KungFu8位 MCU] KF8F4156 汇编和c混合编程示意

[复制链接]
 楼主| l科科1987 发表于 2017-7-31 15:58 | 显示全部楼层 |阅读模式
1.读取一个地址的flash数据
  1. /***********************************************************************************
  2. * 函数名     :FLASH_READ_ONE
  3. * 函数功能:以设定地址开始,读取一个数的FLASH数据并返回结果
  4. * 入口参数:起始地址
  5. * 返回          :无
  6. **********************************************************************************/
  7. unsigned int FLASH_READ_ONE(unsigned int address)
  8. {
  9. #if  1          // 1 选用C语言表达  0 选用嵌汇编表达,嵌汇编效率更高,但提示传递参数未使用和函数无返回,可以忽略

  10.         // FLASH_READ_BUF;  需要定义全局的该变量,获取值用于返回,或直接使用
  11.         //; 参数的使用
  12.         NVMADDRH=(unsigned char)(address>>8);
  13.         NVMADDRL=(unsigned char)address;
  14.         __asm
  15.                 ;//备份中断使能寄存器
  16.                         BANKSEL _INTCTL
  17.                         MOV                R1,_INTCTL
  18.                 ;//关闭中断,操作不可打断
  19.                         CLR                _INTCTL,_AIE
  20.                         JNB                _INTCTL,_AIE
  21.                         JMP                $-2
  22.                 ;//时钟频率备份及降频操作,建议降频到1M,此时中断已被关
  23.                         MOV                R0,#0x30
  24.                         MOV                R2,_OSCCTL
  25.                         MOV                _OSCCTL,R0
  26.                 ;//硬件使能读操作
  27.                         BANKSEL _NVMCTL0
  28.                         MOV         R5,#0x81
  29.                         MOV         _NVMCTL0,R5
  30.                         NOPZ
  31.                         NOPZ
  32.                         NOPZ
  33.                         NOPZ
  34.                 ;//时钟与中断使能的还原
  35.                         MOV                _OSCCTL,R2
  36.                         AND         R1,#0xC0        ;//中断使能仅关系高2位
  37.                         ORL         INTCTL,R1
  38.                 ;//操作结果赋值到变量,用于返回
  39.                         BANKSEL        _NVMDATAL
  40.                         MOV        R6,_NVMDATAL
  41.                         MOV        R7,_NVMDATAH
  42.                         BANKSEL _FLASH_READ_BUF
  43.                         MOV (_FLASH_READ_BUF),R6
  44.                         MOV (_FLASH_READ_BUF+1),R7
  45.         __endasm;
  46.         return         FLASH_READ_BUF;
  47. #else
  48.         // 参数的传递使用  编译器自动变量 STK00  和 R0 ,其中R0为高位,返回使用STK00  和 R0 ,其中R0为高位
  49.         __asm
  50.         ;//传递操作地址
  51.                 BANKSEL _NVMADDRH
  52.                 MOV                _NVMADDRH,R0
  53.                 BANKSEL STK00
  54.                 MOV                R0,STK00
  55.                 BANKSEL _NVMADDRL
  56.                 MOV                _NVMADDRL,R0
  57.         ;//备份中断使能寄存器
  58.                 BANKSEL _INTCTL
  59.                 MOV                R1,_INTCTL
  60.         ;//关闭中断,操作不可打断
  61.                 CLR                _INTCTL,_AIE
  62.                 JNB                _INTCTL,_AIE
  63.                 JMP                $-2
  64.         ;//时钟频率备份及降频操作,建议降频到1M,此时中断已被关
  65.                 MOV                R0,#0x30
  66.                 MOV                R2,_OSCCTL
  67.                 MOV                _OSCCTL,R0
  68.         ;//硬件使能读操作
  69.                 BANKSEL _NVMCTL0
  70.                 MOV         R5,#0x81
  71.                 MOV         _NVMCTL0,R5
  72.                 NOPZ
  73.                 NOPZ
  74.                 NOPZ
  75.                 NOPZ
  76.         ;//时钟与中断使能的还原
  77.                 MOV                _OSCCTL,R2
  78.                 AND         R1,#0xC0        ;//中断使能仅关系高2位
  79.                 ORL         _INTCTL,R1
  80.         ;//操作结果提供形式 整型数据返回结果使用  编译器自动变量 STK00  和 R0 ,其中R0为高位
  81.                 BANKSEL        _NVMDATAL
  82.                 MOV                R0,NVMDATAL
  83.                 BANKSEL STK00
  84.                 MOV                STK00,R0

  85.                 BANKSEL        _NVMDATAH
  86.                 MOV                R0,NVMDATAH
  87.         __endasm;
  88. #endif

  89. }


 楼主| l科科1987 发表于 2017-7-31 15:59 | 显示全部楼层
2.写数据的flash
  1. /***********************************************************************************
  2. * 函数名     :FLASH_WRITE_FUN
  3. * 函数功能:按块或按页写入数据到FLASH,个数参数只能为16,32 ,地址必须为块的首地址 如十六进制下结尾00 20 40 60 80 A0 C0 E0
  4. *                         如果地址不是页的首地址,必须确定后续块结果为0xFFFF,或前面操作过块首写,使后续块值被0xFFFF,否则写结果异常。
  5. * 入口参数:待写地址,待写地址的数据
  6. * 返回          :无
  7. * 写时间说明:除去代码,以整页FLASH为例,操作完第一块需要6ms,另外3块需要3ms。即第一块执行整页的擦除后写自身块,其他块直接写。
  8. **********************************************************************************/
  9. void FLASH_WRITE_FUN(unsigned int address,unsigned char length)
  10. {
  11. #if 1             //  1时效率比0小   1 使用传递参数   0 按编译器全嵌汇编实现,但编译提示参数未使用,可以忽略
  12.         //; 参数的使用
  13.         NVMADDRH=(unsigned char) (address>>8);
  14.         NVMADDRL=address;

  15.         __asm
  16.         ;//备份中断使能寄存器
  17.                 BANKSEL _INTCTL
  18.                 MOV                R1,_INTCTL
  19.         ;//关闭中断,操作不可打断
  20.                 CLR                _INTCTL,_PUIE
  21.                 CLR                _INTCTL,_AIE
  22.                 JNB                _INTCTL,_AIE
  23.                 JMP                $-2
  24.         ;//时钟频率备份及降频操作,建议降频到1M,此时中断已被关
  25.                 MOV                R0,#0x30
  26.                 MOV                R2,_OSCCTL
  27.                 MOV                _OSCCTL,R0
  28.         ;//读取结果的存放起始RAM地址,即数组缓存区  FLASH_BUFFER[x]
  29.                 MOV                R3,#_FLASH_BUFFER
  30.         __endasm;

  31.         while(length--)                // 仅使用R0,不改变R1
  32.         {
  33.                 __asm

  34.                 ;//加载待写数据
  35.                 BANKSEL _FLASH_BUFFER
  36.                 LD                R6,[R3]
  37.                 INC                R3
  38.                 LD                R7,[R3]
  39.                 INC                R3
  40.                 BANKSEL _NVMDATAH
  41.                 MOV _NVMDATAH,R7
  42.                 MOV _NVMDATAL,R6
  43.                 ;//硬件写
  44.                 MOV         R5 ,#0x84
  45.                 MOV         _NVMCTL0,R5
  46.                 MOV         R5,#0x69
  47.                 MOV         _NVMCTL1,R5
  48.                 MOV         R5,#0x96
  49.                 MOV         _NVMCTL1,R5
  50.                 SET         _NVMCTL0 , 1        ;// 写存在高压,高压还原添加空指令确保后续运行正常
  51.                 NOPZ
  52.                 NOPZ
  53.                 NOPZ
  54.                 NOPZ
  55.                 NOPZ
  56.                 NOPZ                                                ;// 建议10条,至少2条
  57.                 NOPZ
  58.                 NOPZ
  59.                 NOPZ
  60.                 NOPZ
  61.                 MOV         R5,#0X80
  62.                 MOV         _NVMCTL0,R5
  63.                 ;//指向下一操作地址,这里不考虑高位,特性要求只能操作一页内的数据,不能跨页
  64.                 BANKSEL _NVMADDRL
  65.                 INC                _NVMADDRL
  66.                 __endasm;
  67.         }

  68.         __asm
  69.                 ;//时钟与中断使能的还原
  70.                 BANKSEL _OSCCTL
  71.                 MOV                _OSCCTL,R2
  72.                 AND         R1,#0xC0        ;//中断使能仅关系高2位
  73.                 ORL         _INTCTL,R1
  74.         __endasm;
  75. #else
  76.         // 参数1的传递使用  编译器自动变量 STK00  和 R0 ,其中R0为高位
  77.         // 参数2的传递使用  编译器自动变量 STK01
  78.         // 整体实现的嵌汇编会提示参数未被使用,可以忽略
  79. __asm
  80.         ;//传递操作的地址(块首)
  81.         BANKSEL _NVMADDRH
  82.         MOV                _NVMADDRH,R0
  83.         BANKSEL STK00
  84.         MOV                R0,STK00
  85.         BANKSEL _NVMADDRL
  86.         MOV                _NVMADDRL,R0
  87.         ;//备份中断使能寄存器
  88.         BANKSEL        _INTCTL
  89.         MOV                R1,_INTCTL
  90.         ;//关闭中断,操作不可打断
  91.         CLR                _INTCTL,_PUIE
  92.         CLR                _INTCTL,_AIE
  93.         JNB                _INTCTL,_AIE
  94.         JMP                $-2
  95.         ;//时钟频率备份及降频操作,建议降频到1M,此时中断已被关
  96.         MOV                R0,#0x30
  97.         MOV                R2,_OSCCTL
  98.         MOV                _OSCCTL,R0
  99.         ;//待写数据的存放起始RAM地址,即数组缓存区  FLASH_BUFFER[x]
  100.         MOV                R0,#_FLASH_BUFFER

  101. FALSH_WRITE_PAGE_LOOP:
  102.         ;//加载待写数据
  103.         BANKSEL _FLASH_BUFFER
  104.         LD                R6,[R0]
  105.         INC                R0
  106.         LD                R7,[R0]
  107.         INC                R0

  108.         BANKSEL _NVMDATAH
  109.         MOV _NVMDATAH,R7
  110.         MOV _NVMDATAL,R6

  111.         ;//硬件写
  112.         MOV         R5 ,#0x84
  113.         MOV         _NVMCTL0,R5
  114.         MOV         R5,#0x69
  115.         MOV         _NVMCTL1,R5
  116.         MOV         R5,#0x96
  117.         MOV         _NVMCTL1,R5
  118.         SET         _NVMCTL0 , 1        ;// 写存在高压,高压还原添加空指令确保后续运行正常
  119.         NOPZ
  120.         NOPZ
  121.         NOPZ
  122.         NOPZ
  123.         NOPZ
  124.         NOPZ                                                ;// 建议10条,至少2条
  125.         NOPZ
  126.         NOPZ
  127.         NOPZ
  128.         NOPZ
  129.         MOV         R5,#0X80
  130.         MOV         _NVMCTL0,R5
  131.         ;//指向下一操作地址,这里不考虑高位,特性要求只能操作一页内的数据,不能跨页
  132.         BANKSEL _NVMADDRL
  133.         INC                _NVMADDRL

  134.         BANKSEL STK01
  135.         DECJZ        STK01
  136.         JMP                FALSH_WRITE_PAGE_LOOP

  137.         ;//时钟与中断使能的还原
  138.         BANKSEL _OSCCTL
  139.         MOV                _OSCCTL,R2
  140.         AND         R1,#0xC0        ;//中断使能仅关系高2位
  141.         ORL         _INTCTL,R1
  142. __endasm;
  143. #endif
  144. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

214

帖子

1

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