⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lowlevel.c

📁 freescale crc模块驱动 经调试
💻 C
📖 第 1 页 / 共 3 页
字号:
/******************************************************************************
 * 源程序文件名: lowlevel.c                                                   *
 * 功能: Motorola单片机底层操作模块                                           *
 * 说明: 本文件包含的子模块有:时标,端口,中断,串口0,串口1,模拟串口,ADC0,ADC1,  *
 *       EEPROM                                                               *
 ******************************************************************************/

/* 加载头文件 */
# include "lowlevel.h"
# include "ctrlout.h"

/* 定义时间触发全局变量 */
unsigned char cgwrkTic0, cgwrkTic1, cgwrkTic2, cgwrkTic3;
unsigned char cgwrkSec,  cgwrkMin,  cgwrkHour;
unsigned char cgflgTic0, cgflgTic1, cgflgTic2, cgflgTic3;
unsigned char cgflgSec,  cgflgMin,  cgflgHour;
unsigned char cgflgHSec;

/* 定义串口通信全局变量:UART0 */
unsigned char cUART0TxBuf[CMUART0TxBufLenMax];
unsigned char cUART0RxBuf[CMUART0RxBufLenMax];
unsigned char cUART0TxHead, cUART0TxEnd;
unsigned char cUART0RxHead, cUART0RxEnd;

/* 定义串口通信全局变量:UART1 */
unsigned char cUART1TxBuf[CMUART1TxBufLenMax];
unsigned char cUART1RxBuf[CMUART1RxBufLenMax];
unsigned char cUART1TxHead, cUART1TxEnd;
unsigned char cUART1RxHead, cUART1RxEnd;

/* 定义串口通信全局变量:UART2(模拟串口) */
unsigned char cUART2TxBuf[CMUART2TxBufLenMax];
unsigned char cUART2RxBuf[CMUART2RxBufLenMax];
unsigned char cUART2TxHead, cUART2TxEnd;
unsigned char cUART2RxHead, cUART2RxEnd;

/* 定义A/D转换全局变量 */
unsigned short sATDDat[16];
unsigned short *sATD0Dat;
unsigned short *sATD1Dat;
unsigned char  cATDDatAvail;

/* 位权定义 */
const unsigned char cBitInd[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};

/* 模拟串口相关定义 */
# define  UART2BitCycM  8

# define  p_uart2IRx  PORTB_BIT0
# define  p_uart2OTx  PORTB_BIT1

typedef union {
	unsigned char Flag;
	struct {
		unsigned char Work :1;                             // bit 0
		unsigned char Done :1;                             // bit 1
		unsigned char      :1;                             // bit 2
		unsigned char      :1;                             // bit 3: 定义空位
		unsigned char Err4 :1;                             // bit 4
		unsigned char Err5 :1;                             // bit 5
		unsigned char Err6 :1;                             // bit 6
		unsigned char      :1;                             // bit 7
	} Bits;
} SoftUARTFlag;

SoftUARTFlag sUART2IFlag;
# define  c_uart2IFlag   sUART2IFlag.Flag
# define  b_uart2IWork   sUART2IFlag.Bits.Work
# define  b_uart2IFull   sUART2IFlag.Bits.Done
# define  b_uart2IErrOV  sUART2IFlag.Bits.Err4
# define  b_uart2IErrFr  sUART2IFlag.Bits.Err5
# define  b_uart2IError  sUART2IFlag.Bits.Err6

SoftUARTFlag sUART2OFlag;
# define  c_uart2OFlag   sUART2OFlag.Flag
# define  b_uart2OWork   sUART2OFlag.Bits.Work
# define  b_uart2OEmpt   sUART2OFlag.Bits.Done
# define  b_uart2OError  sUART2OFlag.Bits.Err6

typedef union {
	unsigned char BufReg;
	struct {
		unsigned char LBit :1;                             // bit 0
		unsigned char      :1;                             // bit 1
		unsigned char      :1;                             // bit 2
		unsigned char      :1;                             // bit 3
		unsigned char      :1;                             // bit 4
		unsigned char      :1;                             // bit 5
		unsigned char      :1;                             // bit 6
		unsigned char HBit :1;                             // bit 7
	} Bits;
} SoftUARTShiftReg;

unsigned char c_uart2IDatCyc, c_uart2IDatBuf;
unsigned char c_uart2IBitCyc, c_uart2IBitBuf;

SoftUARTShiftReg sUART2IShtReg;
# define  c_uart2IShtBuf  sUART2IShtReg.BufReg
# define  b_uart2IHBit    sUART2IShtReg.Bits.HBit

unsigned char c_uart2ODatCyc;
unsigned char c_uart2OBitCyc;

SoftUARTShiftReg sUART2OShtReg;
# define  c_uart2OShtBuf  sUART2OShtReg.BufReg
# define  b_uart2OLBit    sUART2OShtReg.Bits.LBit

/* 子函数声明 */
void uart2recvchrontick(void);
void uart2sendchrontick(void);
void uart2OnTick       (void);

/******************************************************************************
 * 函数原型: void InitTim(void);                                              *
 * 功能: 时间触发全局变量的初始化                                             *
 * 说明: 无                                                                   *
 ******************************************************************************/
void InitTim (void)
{
	cgwrkTic0 = 0;
	cgwrkTic1 = 0;
	cgwrkTic2 = 0;
	cgwrkTic3 = 0;
	cgwrkSec  = 0;
	cgwrkMin  = 0;
	cgwrkHour = 0;
	cgflgTic0 = 0;
	cgflgTic1 = 0;
	cgflgTic2 = 0;
	cgflgTic3 = 0;
	cgflgSec  = 0;
	cgflgMin  = 0;
	cgflgHour = 0;
	cgflgHSec = 0;
}

/******************************************************************************
 * 函数原型: void InitPortInOut(void);                                        *
 * 功能: 单片机端口设置                                                       *
 * 说明: I,输入;O,输出;-,未使用;.,无该管脚                                    *
 ******************************************************************************/
void InitPortInOut (void)
{
	DisableInterrupts;

	/* Port B */
    DDRB  = 0xFE;                                          // OOOOOOOI
    PUCR_PUPBE = 1;                                        // 内部上拉有效
	// PORTB_BIT1是模拟串口的Tx脚,初始状态必须为1!
    PORTB = 0x02;                                          // 端口初始化

	/* Port M */
	DDRM = 0xF0;                                           // OOOO----
	PTM  = 0xFF;                                           // D4-D7初始状态全灭

	/* Port H */
	DDRH = 0xF0;                                           // OOOO----
	PTH  = 0xFF;                                           // D8-D11初始状态全灭

	EnableInterrupts;
}

/******************************************************************************
 * 函数原型: void InitRealTime(void);                                         *
 * 功能: 实时中断初始化                                                       *
 * 说明: Motorola单片机的实时中断相当于51单片机的自动重装功能                 *
 ******************************************************************************/
void InitRealTime (void)
{
	CRGINT = 0x00;                                         // CRG中断使能寄存器
	CRGINT_RTIE = 1;                                       // 实时中断使能
	RTICTL = 0x10|0x00;                                    // 实时中断发生的频率为16000000/1024Hz
	CRGFLG_RTIF = 0;                                       // 无效指令
}

/* 实时中断服务子程序 */
interrupt 7 void RealTime_ISF (void)
{
	// 19200Hz,约52us
	cgflgTic0 = 1;
	cgwrkTic0 ++;
	uart2OnTick();
	uart2recvchrontick();
	uart2sendchrontick();
	if(cgwrkTic0 < CMModTic0)
		goto RTI_ret;
	cgwrkTic0 = 0;
	// 1200Hz
	cgflgTic1 = 1;
	cgwrkTic1 ++;
	if(cgwrkTic1 < CMModTic1)
		goto RTI_ret;
	cgwrkTic1 = 0;
	// 10ms
	cgflgTic2 = 1;
	cgwrkTic2 ++;
	if(cgwrkTic2 < CMModTic2)
		goto RTI_ret;
	cgwrkTic2 = 0;
	// 100ms
	if(cgwrkTic3 == 0 || cgwrkTic3 == CMModTic3/2)
	{
		cgflgHSec = 1;
		if(cgflgD4Flash)
			LED_D4 = ~LED_D4;
		if(cgflgD5Flash)
			LED_D5 = ~LED_D5;
		if(cgflgD6Flash)
			LED_D6 = ~LED_D6;
		if(cgflgD7Flash)
			LED_D7 = ~LED_D7;
		if(cgflgD10Flash)
			LED_D10 = ~LED_D10;
		if(cgflgD11Flash)
			LED_D11 = ~LED_D11;
		portOUT_D4();
		portOUT_D5();
		portOUT_D6();
		portOUT_D7();
		portOUT_D10();
		portOUT_D11();
	}
	cgflgTic3 = 1;
	cgwrkTic3 ++;
	if(cgwrkTic3 < CMModTic3)
		goto RTI_ret;
	cgwrkTic3 = 0;
	// 1s
	cgflgSec = 1;
	cgwrkSec ++;
	if(cgwrkSec < CMModSec)
		goto RTI_ret;
	cgwrkSec = 0;
	// 1min
	cgflgMin = 1;
	cgwrkMin ++;
	if(cgwrkMin < CMModMin)
		goto RTI_ret;
	cgwrkMin = 0;
	// 1hour
	cgflgHour = 1;
	cgwrkHour ++;
	if(cgwrkHour < CMModHour)
		goto RTI_ret;
	cgwrkHour = 0;
RTI_ret:
	CRGFLG_RTIF = 1;                                       // 清除中断标志!
}

/******************************************************************************
 * 函数原型: void InitUART0(void);                                            *
 * 功能: SCI0初始化                                                           *
 * 说明: SCI module clock = bus clock = osc clock / 2                         *
 ******************************************************************************/
void InitUART0 (void)
{
	SCI0BD = (unsigned short)(CMSysClock/2L/16L/BPSUART0L);
	                                                       // 设置SCI0的通信波特率
	SCI0CR1 = 0x00;                                        // SCI0控制寄存器1
	SCI0CR2 = 0x00;                                        // SCI0控制寄存器2
	SCI0CR2_SCTIE = 0;                                     // 禁止发送数据寄存器空标志(TDRE)发出中
	                                                       // 断请求
	SCI0CR2_RIE = 1;                                       // 允许接收数据寄存器满标志(RDRF)或溢出
	                                                       // 标志(OR)发出中断请求
	SCI0CR2_RE = 1;                                        // SCI0接收使能
	SCI0CR2_TE = 1;                                        // SCI0发送使能
	cUART0TxHead = 0;
	cUART0TxEnd  = 0;
	cUART0RxHead = 0;
	cUART0RxEnd  = 0;
}

/* SCI0中断服务子程序 */
interrupt 20 void UART0_ISF (void)
{
	char stat;
	stat = SCI0SR1;                                        // SCI0状态寄存器1

	/* 接收数据寄存器满处理模块 */
	// if(RDRF == 1)
	if(stat & SCI0SR1_RDRF_MASK)                           // 如果接收数据寄存器满
	{
		cUART0RxBuf[cUART0RxEnd] = SCI0DRL;                // SCI0低位数据寄存器
		cUART0RxEnd ++;
		if(cUART0RxEnd >= CMUART0RxBufLenMax)
			cUART0RxEnd = 0;
		if(cUART0RxEnd == cUART0RxHead)
			cUART0RxHead ++;
		if(cUART0RxHead >= CMUART0RxBufLenMax)
			cUART0RxHead = 0;
	}

	/* 发送数据寄存器空处理模块 */
	// if(TDRE == 1)
	if(stat & SCI0SR1_TDRE_MASK)                           // 如果发送数据寄存器空
	{
		if(cUART0TxHead == cUART0TxEnd)                    // 如果发送缓冲区中的数据发送完毕
		{
			SCI0CR2_SCTIE = 0;                             // 禁止发送数据寄存器空中断
			goto tx0_ret;
		}
		SCI0DRL = cUART0TxBuf[cUART0TxHead];
		cUART0TxHead ++;
		if(cUART0TxHead >= CMUART0TxBufLenMax)
			cUART0TxHead = 0;
tx0_ret:
		;
	}
}

/******************************************************************************
 * 函数原型: void InitUART1(void);                                            *
 * 功能: SCI1初始化                                                           *
 * 说明: SCI module clock = bus clock = osc clock / 2                         *
 ******************************************************************************/
void InitUART1 (void)
{
	SCI1BD = (unsigned short)(CMSysClock/2L/16L/BPSUART1L);
	                                                       // 设置SCI1的通信波特率
	SCI1CR1 = 0x00;                                        // SCI1控制寄存器1
	SCI1CR2 = 0x00;                                        // SCI1控制寄存器2
	SCI1CR2_SCTIE = 0;                                     // 禁止发送数据寄存器空标志(TDRE)发出中
	                                                       // 断请求
	SCI1CR2_RIE = 1;                                       // 允许接收数据寄存器满标志(RDRF)或溢出
	                                                       // 标志(OR)发出中断请求
	SCI1CR2_RE = 1;                                        // SCI1接收使能
	SCI1CR2_TE = 1;                                        // SCI1发送使能
	cUART1TxHead = 0;
	cUART1TxEnd  = 0;
	cUART1RxHead = 0;
	cUART1RxEnd  = 0;
}

/* SCI1中断服务子程序 */
interrupt 21 void UART1_ISF (void)
{
	char stat;
	stat = SCI1SR1;                                        // SCI1状态寄存器1

	/* 接收数据寄存器满处理模块 */
	// if(RDRF == 1)
	if(stat & SCI1SR1_RDRF_MASK)                           // 如果接收数据寄存器满
	{
		cUART1RxBuf[cUART1RxEnd] = SCI1DRL;                // SCI1低位数据寄存器
		cUART1RxEnd ++;
		if(cUART1RxEnd >= CMUART1RxBufLenMax)
			cUART1RxEnd = 0;
		if(cUART1RxEnd == cUART1RxHead)
			cUART1RxHead ++;
		if(cUART1RxHead >= CMUART1RxBufLenMax)
			cUART1RxHead = 0;
	}

	/* 发送数据寄存器空处理模块 */
	// if(TDRE == 1)
	if(stat & SCI1SR1_TDRE_MASK)                           // 如果发送数据寄存器空
	{
		if(cUART1TxHead == cUART1TxEnd)                    // 如果发送缓冲区中的数据发送完毕
		{
			SCI1CR2_SCTIE = 0;                             // 禁止发送数据寄存器空中断
			goto tx1_ret;
		}
		SCI1DRL = cUART1TxBuf[cUART1TxHead];
		cUART1TxHead ++;
		if(cUART1TxHead >= CMUART1TxBufLenMax)
			cUART1TxHead = 0;
tx1_ret:
		;
	}
}

/******************************************************************************
 * 函数原型: void InitATD(void);                                              *
 * 功能: ATD模块初始化                                                        *
 * 说明: 无                                                                   *
 ******************************************************************************/
void InitATD (void)
{
	sATD0Dat = sATDDat+0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -