利用例子中自带的 FDL 库 实现 内部Flash Data的读写
首先是库的配置问题 可参考 fdl_info.txt 文件 
除了想相关文件添加到工程中,还有设置文件包含路径

其次,编译的时候如果出现link错误 是因为配置文件的问题
参考
adapt the *.xcl file due to your requirements
   --> at least segments FAL_CODE and FAL_CNST should be defined
我是直接用例子中的 lnkr5f100le.xcl 直接替换了默认的文件

还有就是如果在IAR中调试的话 我不是很明白为啥我设置中断的时候 读取到的数字不对 而如果把中断全部取消 全速运行的话 就没有问题
主要函数
void  main(void)
{
 /* Start user code. Do not edit comment generated here */
 
 // 使用fdl库的时候 一次性写入4个字节 
 // 写入几个字符试试
 g_Data_W8[0] = 0x31;
 g_Data_W8[1] = 0x32;
 g_Data_W8[2] = 0x33;
 g_Data_W8[3] = 0x34;
 g_Data_W32 = (g_Data_W8[0]<<8) | g_Data_W8[1];
 g_Data_W32 <<= 16;
 g_Data_W32 |= (g_Data_W8[2]<<8) | g_Data_W8[3];
 // 注意参数是索引,而不是实际地址
 // 首先擦除block 1 的 1024个字节  
 EraseDataFlash(0x0001);  // 注意参数是索引 不是实际地址
 // 写入数据
 g_Data_Flash_indexW = 0x0100; // data flash block 1 // 0x0100 = 0d256 * 4byte = 1024 byte as a block
 WriteDataFlash(g_Data_W32, g_Data_Flash_indexW);
 g_Data_Flash_indexW = 0x0101; 
 WriteDataFlash(0x36373839, g_Data_Flash_indexW);
 // 先填充串口的必要数据
 // 中间有空格 末尾有回车换行 一次共发送 4+1+4+2 = 11 个数据
 TxBuff[4] = ' ';
 TxBuff[9] = '\r';
 TxBuff[10] = '\n';
 UART2_Start();
 TAU0_Channel0_Start();
 while (1U)
 {
  // 每隔一段时间读取flash 并串口发送出去;
    if(timerFlag)
  {
     // 读取flash内容
     g_Data_Flash_indexR = 0x0100;
   g_Data_R32 = ReadDataFlash(g_Data_Flash_indexR);
//   g_Data_R8[0] = (g_Data_R32 & 0xFF000000) >> 24;
//   g_Data_R8[1] = (g_Data_R32 & 0x00FF0000) >> 16;
//   g_Data_R8[2] = (g_Data_R32 & 0x0000FF00) >> 8;
//   g_Data_R8[3] = g_Data_R32 & 0x000000FF;
   
   // 填充串口数据
   TxBuff[0] = (g_Data_R32 & 0xFF000000) >> 24;
   TxBuff[1] = (g_Data_R32 & 0x00FF0000) >> 16;
   TxBuff[2] = (g_Data_R32 & 0x0000FF00) >> 8;
   TxBuff[3] = g_Data_R32 & 0x000000FF;
   
   g_Data_Flash_indexR = 0x0101;
   g_Data_R32 = ReadDataFlash(g_Data_Flash_indexR);
   TxBuff[5] = (g_Data_R32 & 0xFF000000) >> 24;
   TxBuff[6] = (g_Data_R32 & 0x00FF0000) >> 16;
   TxBuff[7] = (g_Data_R32 & 0x0000FF00) >> 8;
   TxBuff[8] = g_Data_R32 & 0x000000FF;
   
   // 发送串口数据
   UART2_SendData(TxBuff, 11);
   
   timerFlag = 0;
  }
  else
  {
     NOP();
  }
 }
 /* End user code. Do not edit comment generated here */
}
代码:myComFlash.rar
给一个在IAR中截图

最后说一下我对库函数的理解和困惑 
说的不对的欢迎指正
1 库函数每次读写是按一个双字(4个字节)的方式,有没有办法一次读取2个或者1个字节呢
2 库函数提供的参数不是实际的地址,而是地址索引。 在读写数据的时候,自动将0x0000映射到数据的实际地址0xF1000,将0x0001映射到0xF1004 ,而在擦除block的时候,参数直接是block的索引,将0x0000映射到block 0开始位置0xF1000,将0x0001映射到bolck 1开始位置0xF1400
3 我们的片子内部数据Flash大小为4K字节,共有4个block
4 谁有关于瑞萨的内部数据flash自编程的资料啊 共享下 我只在 RL78G14中文说明书.pdf 中看到 “有关自编程功能和 RL78/G14  自编程库的更多信息,请参阅  RL78  微控制器自编程库 01  类用户手册(R01AN0350E)  ”我连这个文件都找不到
使用按键中断控制蜂鸣器 利用Buzzer 的 PCLBUZ0
参考 andery  的帖子
Applilet3 的设置


主要代码
void  main(void)
{
 /* Start user code. Do not edit comment generated here */
 KEY_Enable();
 while (1U)
 {
  if(flag == 1)
  {
     
   PORT_ChangeP77Output(0);
   PCLBUZ0_Start();
  }
  else
  {
     PORT_ChangeP77Output(1);
      PCLBUZ0_Stop();
  }
  
 }
 /* End user code. Do not edit comment generated here */
}
运行图像 (注意由于没有合适的蜂鸣器 我是用示波器测试PCLBUZ0 引脚)
代码: myKeyBuzzer.rar
使用RTOS 控制LED D2 P7.7
首先是移植 uCOS-II 
先到 官网上下载配合瑞萨的代码 
http://micrium.com/page/downloads/ports/renesas/renesas_rl78_family
而且这个代码使用的板子的芯片和我们的芯片正好是一样的 
但是附带的pdf文档和代码的版本不太一样
由于例子使用的开发板和我们的不一样,它是控制P6.2 P6.3 的LED灯 
下载完之后需要修改几个函数 
在 bsp.c 文件中 修改
void  BSP_LED_Off (CPU_INT08U led)
void  BSP_LED_On (CPU_INT08U led)
void  BSP_LED_Toggle (CPU_INT08U led)
在app.c的 main 函数 和 static  void  App_TaskStart (void *p_arg) 函数做针对LED的适当修改
最终要的 在  bsp.c 文件中 的 
void  BSP_PostInit (void)函数中 要添加
 // 设置P7.7 输出高电平
 P7 = 0x80U;
 // 设置P7.7 为输出口
 PM7 = 0x7F ;
否则无法点亮D2 估计是没有设置P7.7 口为输出的缘故


其次是移植embOS
这个在IAR的安装目录中其实已经有了 
C:\Program Files\IAR Systems\Embedded Workbench 6.0 Kickstart\rl78\examples\Segger\embOS\YRPBRL78G13
只需要做很小的修改
同样的 在 BSP.c 文件中 修改于LED灯端口相关的变量即可
/****** Assign LEDs to Ports ****************************************/
#define LEDPORT_DATA  (P7)
#define LEDPORT_MODE  (PM7)
#define LED0_BIT      (7)
代码 : RTOS.rar
最后是移植FreeRTOS 还没接触 
在官网上下载文件 http://sourceforge.net/projects/freertos/files/
并且有说明 http://www.freertos.org/FreeRTOS-port-and-demo-for-Renesas-RL78-YRPBRL78G13-Promo-Board.html 
可能稍微需要修改下代码的路径
在使用E1 调试的时候 如果找不到板子 需要修改下ID
编译代码后下载到板子上
When executing correctly, the demo application will toggle the user LED every three seconds.  
如果没有错误的话 每隔3s LED 闪一次
代码: FreeRTOS.rar
其实我这次也是第一次尝试移植RTOS 以前都没试过 
我现在也只是知道如何控制LED灯 别的啥都不懂
欢迎指点
实现RTC实时时钟并串口发送显示
参考了 andery88 的对 RTC 的设置
http://forum.eepw.com.cn/thread/220121/1
http://forum.eepw.com.cn/thread/218945/6#54


主要代码 main函数
void  main(void)
{
 /* Start user code. Do not edit comment generated here */
   UART2_Start();
 txBuf[2] = txBuf[5] ='-';
 txBuf[8] =' ';
 txBuf[11] = txBuf[14] = ':';
 txBuf[17] = '\r';
 txBuf[18] = '\n';
 // 设置时间 这个大家可以随便改哈 
 SEC = _53_RTC_COUNTER_SEC;
 MIN = _06_RTC_COUNTER_MIN;
 HOUR = _11_RTC_COUNTER_HOUR;
 WEEK = _03_RTC_COUNTER_WEEK;
 DAY = _29_RTC_COUNTER_DAY;
 MONTH = _08_RTC_COUNTER_MONTH;
 YEAR = _12_RTC_COUNTER_YEAR;
 // 启动
 RTC_CounterEnable();
 // 启动中断
 RTC_ConstPeriodInterruptEnable(ONESEC);
 while (1U)
 {
  if(RTCFlag == 1)
  {
     RTCFlag = 0;
   // 闪烁一下LED灯
   P7 = P7PORT;
   P7PORT = (~P7PORT) & 0x80; 
   // 得到一次数据
   RTC_CounterGet(&counterValue);
   // 转换到串口中 发送出去 参考例子demo
   BCD_COM(counterValue.Year, 0);
            BCD_COM(counterValue.Month, 1);
            BCD_COM(counterValue.Day, 2);
            BCD_COM(counterValue.Hour, 3);
            BCD_COM(counterValue.Min, 4);
            BCD_COM(counterValue.Sec, 5);
   
   UART2_SendData(txBuf, 19);
  }
  else
  {
     NOP();
  }
 }
 /* End user code. Do not edit comment generated here */
}
// 将值转换为串口发送的数据
void BCD_COM(UCHAR x, UCHAR index)
{
 UCHAR y;
 y = x >> 4;
 // 高位
    txBuf[index*3] = y + '0' ;
 // 低位
    txBuf[index*3 + 1 ] = (x & 0x0F) + '0';
}
运行截图

代码: myComRTC.rar
回复
| 有奖活动 | |
|---|---|
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
| 【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
| 送您一块开发板,2025年“我要开发板活动”又开始了! | |
			
			
			
						
			
 我要赚赏金
