三、 代码配置与实现过程
在Keil C51或其他开发环境中,需通过特殊函数或内联汇编操作Flash控制寄存器。以下是基于盛群官方库或寄存器操作的典型实现流程:
1. 头文件与宏定义
- #include "sh79f9476.h"
- // 定义Flash控制寄存器地址(示例,需参照具体Datasheet)
- #define FLASH_CON (*(volatile unsigned char *)0xC0)
- #define FLASH_DATA (*(volatile unsigned char *)0xC1)
- // 保护模式宏
- #define MODE_NO_PROTECT 0x00
- #define MODE_READ_PROTECT 0x01
- #define MODE_WRITE_PROTECT 0x02
- #define MODE_FULL_PROTECT 0x03 // 对应模式3
2. 设置保护模式函数
- void ProtectMode_Set(unsigned char mode) {
- // 1. 解锁Flash写操作(如需)
- FLASH_CON |= 0x80; // 假设高位为写使能
- // 2. 写入保护模式配置到Option Byte区域
- // 注意:实际地址需参考SH79F9476内存映射,通常在0x1FF0-0x1FFF区间
- *(volatile unsigned char *)0x1FF0 = mode;
- // 3. 触发Flash编程时序
- FLASH_CON |= 0x01; // 启动编程
- while(FLASH_CON & 0x01); // 等待编程完成
- // 4. 关闭写使能
- FLASH_CON &= ~0x80;
- }
3. 写入6字节客户密码
- void Password_Write(const unsigned char *pwd) {
- unsigned char i;
- // 假设密码存储地址为0x1FF1 - 0x1FF6
- for(i=0; i<6; i++) {
- FLASH_CON |= 0x80; // 写使能
- *(volatile unsigned char *)(0x1FF1 + i) = pwd[i];
- FLASH_CON |= 0x01; // 启动编程
- while(FLASH_CON & 0x01); // 等待完成
- FLASH_CON &= ~0x80; // 关闭写使能
- }
- }
4. 主函数调用示例
- void main() {
- unsigned char myPassword = {'M','Y','6','P','W','D'}; // 6字节密码
- // ⚠️ 警告:以下操作不可逆,请确保调试完成后再执行
- ProtectMode_Set(MODE_FULL_PROTECT); // 设置模式3
- Password_Write(myPassword); // 写入密码
- while(1) {
- // 用户应用代码
- }
- }
|