迪文科技论坛

 找回密码
 立即注册
搜索
查看: 1986|回复: 6

读写用户数据库失败

[复制链接]

2

主题

5

回帖

39

积分

新手上路

Rank: 1

积分
39
发表于 2019-12-5 14:13:22 | 显示全部楼层 |阅读模式
本帖最后由 gongyuan073 于 2019-12-5 16:28 编辑

为了做掉电存储,使用了用户数据库的读写.

编写的读写函数如下:
  1. void delayms(char cnt)
  2. {
  3.         int i = 0, j = 0;
  4.        
  5.         for(i = 0; i < cnt; i++)
  6.                 for (j = 0; j < 1000; j++);
  7. }

  8. // 读写FLASH操作
  9. void flash(int mod,long addr_flash,int addr, int len)
  10. {
  11.         char rw_flash_cmd[8] = {0}; //数据库读操作
  12.         char RW_Flash_Flag[2]={0};

  13.         /*
  14.         0x08 NOR_FLASH_RW_CMD 4
  15.         D7:操作模式 0x5A=读 0xA5=写,CPU 操作完清零。
  16.         D6:4:片内 Nor Flash 数据库首地址,必须是偶数,0x000000-0x02:7FFE,160KWords。
  17.         D3:2:数据变量空间首地址,必须是偶数。
  18.         D1:0:读写字长度,必须是偶数。
  19.         */
  20.         rw_flash_cmd[0] = mod;
  21.         rw_flash_cmd[1] = (unsigned char)(addr_flash >> 16);
  22.         rw_flash_cmd[2] = (unsigned char)(addr_flash >> 8);
  23.         rw_flash_cmd[3] = (unsigned char)(addr_flash & 0xFE);
  24.         rw_flash_cmd[4] = (unsigned char)(addr >> 8);
  25.         rw_flash_cmd[5] = (unsigned char)(addr & 0xFE);
  26.         rw_flash_cmd[6] = (unsigned char)(len >> 8);
  27.         rw_flash_cmd[7] = (unsigned char)(len & 0xFE);
  28.        
  29.         //send_data_com(COM_PORT,rw_flash_cmd,8);        // debug
  30.         write_dgus_vp(0x0008, rw_flash_cmd, 4); //启动读Flash
  31.         //等待数据读取OK   
  32. //    do
  33. //        {
  34. //                delayms(20);
  35. //                read_dgus_vp(0x0008,RW_Flash_Flag,1);
  36. //        }
  37. //        while(RW_Flash_Flag[1] == rw_flash_cmd[0]); //判断falsh操作是否完成 如果是5A说明没有操作完成,就等完成之后再进行后面的
  38.         while(1)
  39.     {
  40.                 delayms(20);
  41.                 read_dgus_vp(0x0008, RW_Flash_Flag, 1);
  42.                 if(RW_Flash_Flag[0] == 0x00)
  43.                         break;
  44.     }
  45.     delayms(20);
  46. }
复制代码


在main.c的while(1)中添加写和读的代码
  1. ......//更改0xAAA0的值
  2. flash(0xA5, 0x1008, 0xAAA0, 2);        //将数据写入用户数据库0x1008处        
  3. ......        
  4. flash(0x5A, 0x1008, 0xBBB0, 2);        //使用串口助手发送指令读取BBB0的值,发现始终为0
复制代码
请问是哪里的问题呢?




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

1

主题

151

回帖

2841

积分

金牌会员

Rank: 6Rank: 6

积分
2841
发表于 2019-12-5 22:13:20 | 显示全部楼层
楼主,检查一下指令是否写对了,或者直接套用已有的OS历程,修改一下。
0x08 T5屏数据库读写:先写数据100、101       5A A5 07 82 1010 0064 0065
                                  再写到数据库中           5A A5 0B 82 0008 A5 02 00 00 1010 0002
                                  再读取数据到变量地址 5A A5 0B 82 0008 5A 02 00 00 1010 0002

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

1

主题

151

回帖

2841

积分

金牌会员

Rank: 6Rank: 6

积分
2841
发表于 2019-12-5 22:25:07 | 显示全部楼层
// 读写FLASH操作
void flash(int mod,long addr_flash,int addr, int len)
{
        /*
        0x08 NOR_FLASH_RW_CMD 4
        D7:操作模式 0x5A=读 0xA5=写,CPU 操作完清零。
        D6:4:片内 Nor Flash 数据库首地址,必须是偶数,0x000000-0x02:7FFE,160KWords。
        D3:2:数据变量空间首地址,必须是偶数。
        D1:0:读写字长度,必须是偶数。
        */
    char rw_flash_cmd[8]={0};    //数据库读操作
        rw_flash_cmd[0] = mod;
        rw_flash_cmd[1] = (unsigned char)(addr_flash >> 16);
        rw_flash_cmd[2] = (unsigned char)(addr_flash >> 8);
        rw_flash_cmd[3] = (unsigned char)(addr_flash & 0xFE);
        rw_flash_cmd[4] = (unsigned char)(addr >> 8);
        rw_flash_cmd[5] = (unsigned char)(addr & 0xFE);
        rw_flash_cmd[6] = (unsigned char)(len >> 8);
        rw_flash_cmd[7] = (unsigned char)(len & 0xFE);
        //send_data_com(COM_PORT,rw_flash_cmd,8);        // debug
        write_dgus_vp(0x08,rw_flash_cmd,4);        //启动读Flash
        //等待数据读取OK
        while(1)
    {
                delayms(20);
                read_dgus_vp(0x0008,rw_flash_cmd,1);
                if(rw_flash_cmd[0]==0x00)
                        break;
    }
}
回复

使用道具 举报

2

主题

5

回帖

39

积分

新手上路

Rank: 1

积分
39
 楼主| 发表于 2019-12-6 13:11:36 | 显示全部楼层
我想换个ID 发表于 2019-12-5 22:25
// 读写FLASH操作
void flash(int mod,long addr_flash,int addr, int len)
{

还是不行 我的是T5UID3的  是不是迪文的编译器有问题呀 现在用os的c语言读写用户数据库就完全不起作用
回复

使用道具 举报

2

主题

5

回帖

39

积分

新手上路

Rank: 1

积分
39
 楼主| 发表于 2019-12-9 16:44:46 | 显示全部楼层
我的问题已经解决,实时调节屏幕亮度和音量并掉电保存,代码如下:
  1. //用户数据库要保存数据的位置
  2. //[0x2000]        亮度   
  3. //[0x4000]        音量

  4. //工程中设置的数据变量
  5. //[0x3300]  亮度   
  6. //[0x3400]  音量

  7. void delayms(char cnt);
  8. void page(unsigned char page);
  9. void flash(int mod,long addr_flash,int addr, int len);
  10. void Backlight_brightness(unsigned char normal);
  11. void volume_Set(int volume);


  12. int main()
  13. {
  14.         char cur_brightness[4]         = {0, 0, 0, 0};
  15.         char last_brightness[4]        = {0, 0, 0, 0};
  16.         char cur_volume[4]          = {0, 0, 0, 0};
  17.         char last_volume[4]          = {0, 0, 0, 0};

  18.         page(3);
  19.                
  20.         flash(0x5A, 0x2000, 0x3300, 2);        //亮度
  21.         flash(0x5A, 0x4000, 0x3400, 2);
  22.        
  23. //        read_dgus_vp(0x3300, last_brightness, 2);
  24. //        if ((last_brightness[1] != 1) && (last_brightness[1] != 2) && (last_brightness[1] != 3) && (last_brightness[1] == 4) && (last_brightness[1] == 5))        //判断flash内是不是0
  25. //        {
  26. //                last_brightness[1] = 4;//首次烧录程序,nor flash内还没有数据,直接写入默认值(5档[亮度])
  27. //                wirte_dgus_vp(0x3300, last_brightness, 1);
  28. //                flash(0xA5, 0x2000, 0x3300, 2);                                //将0xAAAA处的数据写入flash
  29. //                Backlight_brightness(0x64);                                        //默认最大亮度
  30. //        }
  31. //        else
  32. //        {
  33. //                write_dgus_vp(0x3300, last_brightness, 1);        //如果不是首次烧录程序,就将[亮度]写入档位处[0x3300]
  34. //                Backlight_brightness(0x10 * last_brightness[1] + 0x16);//根据档位换算亮度
  35. //        }

  36.         while (1)
  37.         {
  38.                 /****************亮度**************/
  39.                 read_dgus_vp(0x3300, cur_brightness, 1);        //读取实时亮度
  40.                 if (cur_brightness[1] != last_brightness[1])
  41.                 {
  42.                         flash(0xA5, 0x2000, 0x3300, 2);        //将数据写入用户数据库
  43.                         last_brightness[1] = cur_brightness[1];       
  44.                         cur_brightness[1] = 0x10 * cur_brightness[1] + 0x16;
  45.                         Backlight_brightness(cur_brightness[1]);//更新亮度值
  46.                         write_dgus_vp(0xBB00, last_brightness, 1);
  47.                 }
  48.                
  49.                 /***************音量***************/
  50.                 read_dgus_vp(0x3400, cur_volume, 1);        //读取实时音量
  51.                 if (cur_volume[1] != last_volume[1])
  52.                 {
  53.                         flash(0xA5, 0x4000, 0x3400, 2);        //将数据写入用户数据库
  54.                         last_volume[1] = cur_volume[1];       
  55.                         cur_volume[1] = 0x30 * cur_volume[1] + 0xF;
  56.                         volume_Set(cur_volume[1]);//更新亮度值
  57.                         write_dgus_vp(0xCC00, last_volume, 1);
  58.                 }
  59.         }
  60.        
  61.         return 0;
  62. }

  63. void delayms(char cnt)
  64. {
  65.         int i = 0, j = 0;
  66.        
  67.         for(i = 0; i < cnt; i++)
  68.                 for (j = 0; j < 1000; j++);
  69. }

  70. //改变音量 [1~256]
  71. void volume_Set(int volume)
  72. {
  73.         /*
  74.         D3:本次播放的起始段,0x00-0xFF 。
  75.         D2:本次播放段数,0x01-0xFF,DGUS 处理后清零。
  76.         D1:播放音量,单位为 1/256。
  77.         D0:实时返回的播放进度(剩余播放段数目 0x00-0xFF)。
  78.         D3、D2 同时写 0x00 停止音乐播放。
  79.         */
  80.         char cmd[4]={0x0,0x0,0x00,0x00};
  81.         cmd[2] = volume;
  82.         write_dgus_vp(0xA0,cmd,2);       
  83. }


  84. // 读写FLASH操作
  85. void flash(int mod,long addr_flash,int addr, int len)
  86. {
  87.         /*
  88.         0x08 NOR_FLASH_RW_CMD 4
  89.         D7:操作模式 0x5A=读 0xA5=写,CPU 操作完清零。
  90.         D6:4:片内 Nor Flash 数据库首地址,必须是偶数,0x000000-0x02:7FFE,160KWords。
  91.         D3:2:数据变量空间首地址,必须是偶数。
  92.         D1:0:读写字长度,必须是偶数。
  93.         */
  94.         unsigned char rw_flash_cmd[8] = {0};
  95.         unsigned char RW_Flash_Flag[2] = {0};
  96.        
  97.         rw_flash_cmd[0] = mod;
  98.         rw_flash_cmd[1] = (unsigned char)(addr_flash >> 16);
  99.         rw_flash_cmd[2] = (unsigned char)(addr_flash >> 8);
  100.         rw_flash_cmd[3] = (unsigned char)(addr_flash & 0xFE);
  101.         rw_flash_cmd[4] = (unsigned char)(addr >> 8);
  102.         rw_flash_cmd[5] = (unsigned char)(addr & 0xFE);
  103.         rw_flash_cmd[6] = (unsigned char)(len >> 8);
  104.         rw_flash_cmd[7] = (unsigned char)(len & 0xFE);
  105.        
  106.         //send_data_com(COM_PORT,rw_flash_cmd,8);        // debug
  107.         write_dgus_vp(0x0008, rw_flash_cmd, 4); //启动读Flash
  108.         //等待数据读取OK   
  109. //    do
  110. //        {
  111. //                delayms(20);
  112. //                read_dgus_vp(0x0008,RW_Flash_Flag,1);
  113. //        }
  114. //        while(RW_Flash_Flag[0] == rw_flash_cmd[0]); //判断falsh操作是否完成 如果是5A说明没有操作完成,就等完成之后再进行后面的
  115.         while(1)
  116.     {
  117.                 //delayms(20);
  118.                 read_dgus_vp(0x0008, rw_flash_cmd, 1);
  119.                 if(rw_flash_cmd[0] == 0x00)
  120.                         break;
  121.     }
  122. }

  123. // 切换页面
  124. void page(unsigned char page)
  125. {
  126.         /*
  127.         0x84 PIC_Set 2
  128.         D3:0x5A 表示启动一次页面处理,CPU 处理完清零。
  129.         D2:处理模式。
  130.                         0x01=页面切换(把图片存储区指定的图片显示到当前背景页面)。
  131.                         0x02=不支持。
  132.         D1:D0:图片 ID。
  133.         */
  134.         char cmd[4]={0x5a,0x01,0x00,0x00};
  135.         cmd[3] = page;        // 页面编号
  136.         write_dgus_vp(0x84,cmd,2);
  137. }

  138. // 调节背光亮度
  139. void Backlight_brightness(unsigned char normal)
  140. {
  141.         /*
  142.                 LED_Config 2
  143.                 触摸屏背光待机设置:
  144.                 D3=开启亮度,0x00-0x64;背光待机控制关闭时,D3 为软件亮度调节接口。
  145.                 D2=关闭亮度 0x00-0x64; D1:0=开启时间/5mS 。
  146.         */
  147.         char cmd[4]={0x64,0x64,0x00,0x00};
  148.         cmd[0] = normal;        // 非待机时亮度
  149.         //cmd[1] = Standby;
  150.         write_dgus_vp(0x82,cmd,2);
  151. }

  152. void Time0_IRQHandler(void)
  153. {
  154. }
  155. void Time1_IRQHandler(void)
  156. {
  157. }
  158. void Time2_IRQHandler(void)
  159. {
  160. }
复制代码
回复

使用道具 举报

1

主题

151

回帖

2841

积分

金牌会员

Rank: 6Rank: 6

积分
2841
发表于 2019-12-9 17:43:42 | 显示全部楼层
gongyuan073 发表于 2019-12-9 16:44
我的问题已经解决,实时调节屏幕亮度和音量并掉电保存,代码如下:

优秀!顶一下,能给后来者照亮道路!
回复

使用道具 举报

2

主题

7

回帖

85

积分

注册会员

Rank: 2

积分
85
发表于 2020-2-6 10:37:44 | 显示全部楼层
谢谢分享,研究下。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2026-4-15 02:53 , Processed in 0.056541 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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