//========================================================================= //函数名称:tpm_enable_int //功能概要:使能tpm模块中断。
//参数说明:tpmModule:模块号:0、1、2 //函数返回:无
//========================================================================= void tpm_enable_int(uint_8 tpmModule) { }
//========================================================================= //函数名称:tpm_disable_int //功能概要:禁止tpm模块初始化。 //参数说明:tpmModule:模块号:0、1、2 //函数返回:无
//========================================================================= void tpm_disable_int(uint_8 tpmModule) { }
//========================================================================= //函数名称:tpm_stop
//功能概要:禁止tpm模块。 //参数说明:tpmModule:模块号:0、1、2 //函数返回:无
//========================================================================= void tpm_stop(uint_8 tpmModule) { }
TPM_ARR[tpmModule]->SC&=~TPM_SC_CMOD(3); disable_irq(tpm0_irq_no + tpmModule); enable_irq(tpm0_irq_no + tpmModule);
4.6 串口通信子程序(uart.c)
//============================================================================ //文件名称:uart.c
//功能概要:uart底层驱动构件源文件
//版权所有:苏州大学飞思卡尔嵌入式中心(sumcu.suda.edu.cn)
18
//更新记录:2012-11-12 V1.0
//============================================================================ #include \
//串口1、2号地址映射
const UART_MemMapPtr UART_ARR[] = {UART1_BASE_PTR, UART2_BASE_PTR};
//打开MCGIRCLK时钟
static void MCGIRCLK_OutEnable(void);
//============================================================================ //函数名称:uart_init
//功能概要:初始化uart模块 //参数说明:uartNo:串口号:UART_0、UART_1、UART_2 // sel_clk:选择串口0时钟源:MCGIRCLK (4000Khz) // MCGPLL (48000Khz) //
BUSCLK (24000khz)
// baud:波特率:300、600、1200、2400、4800、9600、19200、115200... //函数返回:无
//说明: 当参数为UART_0时,sel_clk只能选择MCGIRCLK或MCGPLL,若选择内部时钟MCGIRCLK,
//波特率需小于19200; 当参数为UART_1或是UART_2时,sel_clk只能选择BUSCLK
//============================================================================ void uart_init (uint_8 uartNo,uint_32 sel_clk,uint_32 baud_rate) {
//局部变量声明 register uint_16 sbr; uint_8 temp; uint_32 clk_Khz;
UARTLP_MemMapPtr uartch1=UART0_BASE_PTR;//声明uartch1为UARTLP_MemMapPtr结构
体类型指针
UART_MemMapPtr uartch2; //声明uartch2为UART_MemMapPtr结构体类型指针 uartch2 = UART_ARR[uartNo-1]; //获得UART1、2模块相应口基地址
//根据带入参数uartNo,给局部变量uartch1赋值
19
时钟源
if(uartNo==0) {
switch(sel_clk) {
case MCGIRCLK:
//启用并选择UART0时钟源MCGIRCLK
MCGIRCLK_OutEnable(); //启用内部快速时钟
SIM_SOPT2 |= SIM_SOPT2_UART0SRC(0x3); //UART0选择MCGIRCLK=4000Khz
break;
case MCGPLL:
SIM_SOPT2 |= SIM_SOPT2_UART0SRC(1); //UART0选择
MCGFLLCLK_khz=48000Khz时钟源
//配置串口工作模式:8位无校验模式
sbr = (uint_16)((clk_Khz*1000)/(baud_rate * 16));
20
SIM_SOPT2 |= SIM_SOPT2_PLLFLLSEL_MASK; break;
default: }
//引脚复用为串口功能并启用串口模块时钟
PORTA_PCR14 = PORT_PCR_MUX(0x3); //使能UART0_TXD PORTA_PCR15 = PORT_PCR_MUX(0x3); //使能UART0_RXD SIM_SCGC4 |= SIM_SCGC4_UART0_MASK; //启动串口0时钟
//暂时关闭串口0发送与接收功能
uartch1->C2 &= ~(UART_C2_TE_MASK | UART_C2_RE_MASK); //根据时钟源选择时钟频率 if(MCGIRCLK == sel_clk)
clk_Khz = MCGFLL_CLK_KHZ; clk_Khz = MCGPLL_CLK_KHZ; else if (MCGPLL == sel_clk)
break;
} else {
temp = UART_BDH_REG(uartch1) & ~(UART_BDH_SBR(0x1F));
UART_BDH_REG(uartch1) = temp | UART_BDH_SBR(((sbr & 0x1F00) >> 8)); UART_BDL_REG(uartch1) = (uint_8)(sbr & UART_BDL_SBR_MASK); //初始化控制寄存器、清标志位 UART0_C4 = 0x0F; UART0_C1 = 0x00; UART0_C3 = 0x00; UART0_MA1 = 0x00; UART0_MA2 = 0x00; UART0_S1 |= 0x1F; UART0_S2 |= 0xC0; //启动发送接收
uartch1->C2 |= (UART_C2_TE_MASK | UART_C2_RE_MASK);
switch (uartNo) {
case UART_1:
PORTE_PCR0 = PORT_PCR_MUX(0x3); //使能UART1_TXD PORTE_PCR1 = PORT_PCR_MUX(0x3); //使能UART1_RXD SIM_SCGC4 |= SIM_SCGC4_UART1_MASK; //启动串口1时钟 break; case UART_2:
PORTE_PCR22 = PORT_PCR_MUX(0x4); //使能UART2_TXD PORTE_PCR23 = PORT_PCR_MUX(0x4); //使能UART2_RXD SIM_SCGC4 |= SIM_SCGC4_UART2_MASK;//启动串口2时钟 break; default:
//暂时关闭串口1、2发送与接收功能
uartch2->C2 &= ~(UART_C2_TE_MASK | UART_C2_RE_MASK);
21
break; //传参错误,返回
}
}
}
//配置波特率,KL25串口1、2时钟频率只能使用 Bus clock = 24M 总线时钟 //配置串口工作模式,8位无校验模式 uartch2->C1 = 0;
sbr = (uint_16)((BUS_CLK_KHZ*1000)/(baud_rate * 16)); temp = UART_BDH_REG(uartch2) & ~(UART_BDH_SBR(0x1F));
UART_BDH_REG(uartch2) = temp | UART_BDH_SBR(((sbr & 0x1F00) >> 8)); UART_BDL_REG(uartch2) = (uint_8)(sbr & UART_BDL_SBR_MASK);
//初始化控制寄存器、清标志位 uartch2->C1 = 0x00; uartch2->C3 = 0x00; uartch2->S1 = 0x1F;
uartch2->S2 = 0x00; //启动发送接收
uartch2->C2 |= (UART_C2_TE_MASK | UART_C2_RE_MASK);
//============================================================================
//函数名称:uart_send1
//参数说明:uartNo: 串口号:UART_0、UART_1、UART_2 // ch:要发送的字节
//函数返回:函数执行状态:0=正常;非0=异常。 //功能概要:串行发送1个字节
//============================================================================
uint_8 uart_send1(uint_8 uartNo, uint_8 ch) {
uint_32 t;
UARTLP_MemMapPtr uartch1=UART0_BASE_PTR; UART_MemMapPtr uartch2 = UART_ARR[uartNo-1];
for (t = 0; t < 0xFBBB; t++) {
//判断发送缓冲区是否为空
if(0==uartNo)
22