本帖最后由 em78447 于 2015-2-6 13:41 编辑
int main(void)
{
...略
sys_init(); //获得总线时钟(参考第13章)
...略
//7、UART2(PTE22、PTE23)DGUS屏
uart_init(UART_0,MCGPLL,9600); //(参考第6章)
uart_init(UART_1,BUSCLK,9600);
uart_init(UART_2,BUSCLK,9600);
//开中断
irq_enable(12); //UART0
irq_enable(13); //UART1
irq_enable(14); //UART2
irq_on(); //开总中断
while(1)
{
...略
UART0_D=0x55;
UART1_D=0x55;
UART2_D=0xaa;
}
return 0;
}
void uart_init(uint8 uartNo,uint32 sel_clk,uint32 baud_rate)
{
...略
if(uartNo==0)
{
...略
}
else
{
SIM_SOPT2 |= SIM_SOPT2_CLKOUTSEL(0x02); //选择总线时钟(这是我添加的一句)
switch (uartNo)
{
case UART_1:
SIM_SCGC5 |= SIM_SCGC5_PORTE_MASK; //系统集成模块,PTE时钟打开
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:
SIM_SCGC5 |= SIM_SCGC5_PORTE_MASK; //系统集成模块,PTE时钟打开
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:
break; //传参错误,返回
}
//暂时关闭串口1、2发送与接收功能
uartch2->C2 &= ~(UART_C2_TE_MASK | UART_C2_RE_MASK);
//配置波特率,KL25串口1、2时钟频率只能使用 Bus clock = 24M 总线时钟
//配置串口工作模式,8位无校验模式
uartch2->C1 = 0;
// sbr = (uint16)((BUS_CLK_KHZ*1000)/(baud_rate * 16));
sbr = (uint16)((24000*1000)/(9600 * 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) = (uint8)(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);
}
}
|