📄 sample2.c
字号:
/****************************************************************/
/* 项目名称 : R8C/23 CAN/LIN Demo Board */
/* : 样例程序2 */
/* : CAN收发 */
/* 硬件环境 : R0K521237C000BB */
/* MCU型号 : R5F21237JFP */
/* C编译器 : NC30WA,版本5.30.r02及以上 */
/* 文件名 : Sample2.c */
/* 版本 : 1.0 */
/* 作者 : wangsy */
/* 修订历史 : */
/* 修订者 时间 版本 说明 */
/* wangsy 2006/9/11 1.0 初版发行 */
/* */
/****************************************************************/
/* Copyright, 2006 RENESAS TECHNOLOGY CORPORATION & */
/* RENESAS SOLUTIONS CORPORATION */
/****************************************************************/
/*------------包含的头文件--------------*/
#include "..\Inc\Comdef_r823.h"
#include "..\Inc\CAN.h"
#define OSC_STABLE_TIME 255 // 时钟稳定延时:1指令周期 * 255
/*-------------变量定义-----------------*/
uchar8 ucCounter_1s_trigger;
uchar8 ucCounter_300ms_trigger;
/*-------------函数声明-----------------*/
void main(void);
void vISR_TRB( void );
/*------------函数定义------------------*/
/*------------------------------------------------------
名称 : main
功能 : 主函数
入口 : 无
出口 : 无
调用 : 无
寄存器 : all
------------------------------------------------------*/
void main(void)
{
uchar8 ucI;
uchar8 lp_dlc;
asm("FCLR I");
/*--------------------------------------------------
时钟初始化
--------------------------------------------------*/
/* 切换主时钟:外接晶体 */
prc0 = HOFF; // 寄存器写保护:禁用
cm02 = LEN; // 等待模式下时钟 : On
cm05 = LON; // XIN 振荡器输入: On
cm06 = LON; // cm16/17: 使能
cm10 = LON; // 所有时钟: On
cm13 = HON; // Xin-Xout引脚功能:外接晶体
cm14 = HON; // 片内低速时钟:运行
cm15 = HON; // Xin-Xout驱动能力:高
cm16 = 0; // 主时钟分频比:1
cm17 = 0;
ocd0 = HON; // 时钟停止检测功能:开启
ocd1 = HON;
ocd2 = LON; // CPU时钟源:XIN
fra01 = LOFF; // 内部时钟使能位: 关闭
fra00 = LOFF; // 片内高速时钟:禁用
prc0 = 0; // 寄存器写保护:启用
/* 等待时钟稳定 */
ucI = 0;
while ( ucI < OSC_STABLE_TIME )
{
ucI++;
}
/*--------------------------------------------------
设置Timer RB,作为监控程序定时器
10ms 中断一次,自动重载
--------------------------------------------------*/
tstop_trbcr = HOFF; // 设置前, 确认定时器停止
while ( tcstf_trbcr == HON )
{
}
tmod0_trbmr = 0; // 模式: 定时器模式
tmod1_trbmr = 0;
tck0_trbmr = 1; // 计数源: f8
tck1_trbmr = 0;
tckcut_trbmr = 0;
trbpre = 249; // 计数源分频因子: 1/(TRBPRE+1)*(TRBPR+1)
trbpr = 99;
ilvl0_trbic = 1; // 中断: 允许, 优先级1
ilvl1_trbic = 0;
ilvl2_trbic = 0;
ir_trbic = 0;
tstart_trbcr = HON; // 启动计时器
while ( tcstf_trbcr == LOFF )
{
}
ucCounter_1s_trigger = 0; // 初始化周期性触发信号
/*---------------------------------------------------
设置 beeper
---------------------------------------------------*/
pd2_7 = PPORT_OUTPUT; // 输出
p2_7 = PPORT_HIGH; // 高电平,不响
ucCounter_300ms_trigger = 0; // 初始化周期性触发信号
asm("FSET I");
config_can0(); // CAN0 初始化
/*---------------------------------------------------
发送的数据帧初始化
---------------------------------------------------*/
TransmitData.id = SND_FRM_ID;
TransmitData.dlc = 8;
for ( lp_dlc = 0; lp_dlc < TransmitData.dlc; lp_dlc ++ )
{
TransmitData.data[lp_dlc] = 0;
}
can0_receive(); //CAN0接收启动
while(1)
{
//1秒钟发送一次数据帧
if(ucCounter_1s_trigger >= 100)
{
ucCounter_1s_trigger = 0; //清零触发标志
can0_transmit(); //调用CAN0发送
}
else
{
}
// 接收到CAN0数据帧,打开蜂鸣器,响300ms
if(ucFlag_CAN0_RE == YES)
{
ucFlag_CAN0_RE = NO;
// 蜂鸣器处理
p2_7 = PPORT_LOW; // 打开蜂鸣器
}
else
{
}
if( (p2_7 == PPORT_LOW) && (ucCounter_300ms_trigger < 30) )
{
}
else
{
ucCounter_300ms_trigger = 0; // 300ms结束,清空计数器
p2_7 = PPORT_HIGH; // 关闭蜂鸣器
}
}
}
/*------------------------------------------------------
名称 : vISR_TRB
功能 : 中断处理函数:TimerRB中断处理
入口 : 无
出口 : 无
调用 : 无
寄存器 : 无
------------------------------------------------------*/
#pragma interrupt vISR_TRB
// 注册成为中断服务程序
void vISR_TRB( void )
{
// 计数器累加
ucCounter_1s_trigger++;
ucCounter_300ms_trigger++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -