利用例子中自带的 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
视频地址:http://union.bokecc.com/flash/single/290666218ACBA694_4FF79E86EEC86A44_false_EEA982EE6B20F4D1_1/player.swf
使用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
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |