在线时间26 小时
UID3092445
注册时间2015-1-15
NXP金币0
TA的每日心情 | 衰 2018-3-21 13:20 |
---|
签到天数: 1 天 连续签到: 1 天 [LV.1]初来乍到
中级会员
 
- 积分
- 249
- 最后登录
- 2023-10-24
|
本帖最后由 zico1998 于 2015-9-14 19:15 编辑
我找到原因了:UART0要用FLL、PWM要用PLL。他俩打架了。。。UART0改用别的MCGIRCLK
下面是原来求助贴
----
我的UART1、2工作正常,但0不工作。我换了块板子,也一样。
仿真调试,即不进接收中断,判断发送时S1标志位寄存器为0,发送也不成。
请问,可能是什么原因呢?
//我晶振是4M的,参考苏大的8M晶振下时钟初始化里程序,只对MCG_C1、MCG_C6分频相应的修改下分频参数。
//内核时钟设置
void clk_init(void)
{
uint32 i = 0;
uint8 t_reg = 0;
MCG_C2 = (MCG_C2_RANGE0(1) | MCG_C2_EREFS0_MASK);
MCG_C1 = (MCG_C1_CLKS(2) | MCG_C1_FRDIV(2)); //这里苏大红皮书里8M外晶振、MCG_C1_FRDIV=3,分频
for (i=0;i<20000;i++)
{
if (MCG_S & MCG_S_OSCINIT0_MASK)
{
break;
}
}
for (i=0;i<2000;i++)
{
if (!(MCG_S & MCG_S_IREFST_MASK))
{
break;
}
}
for (i=0;i<2000;i++)
{
if (0x02 == ((MCG_S & MCG_S_CLKST_MASK) >> MCG_S_CLKST_SHIFT))
{
break;
}
}
MCG_C6 |= MCG_C6_CME0_MASK; //使能时钟监视器
MCG_C5 |= MCG_C5_PRDIV0(1);
//MCG_C5 |= MCG_C5_PRDIV0(0); //PLL分频
t_reg = MCG_C6; //存储当前C6的值(因为CME0位之前被置位了)
t_reg &= ~MCG_C6_VDIV0_MASK; //将VDIV清0
t_reg |= MCG_C6_PLLS_MASK | MCG_C6_VDIV0(0x18);
MCG_C6 = t_reg;
for (i=0;i<2000;i++)
{
if (MCG_S & MCG_S_PLLST_MASK)
{
break;
}
}
for (i=0;i<4000;i++)
{
if (MCG_S & MCG_S_LOCK0_MASK)
{
break;
}
}
SIM_CLKDIV1 = (SIM_CLKDIV1_OUTDIV1(1) | SIM_CLKDIV1_OUTDIV4(1) );
MCG_C1 &= ~MCG_C1_CLKS_MASK;
for (i=0;i<2000;i++)
{
if (0x03==((MCG_S & MCG_S_CLKST_MASK) >> MCG_S_CLKST_SHIFT))
{
break;
}
}
}
//UART0初始化
uint16 u_sbr;
uint32 clk_Khz;
SIM_SOPT2 |= SIM_SOPT2_UART0SRC(0x01); //UART0选择MCGFLLCLK_khz=48MHz时钟源
SIM_SOPT2 |= SIM_SOPT2_PLLFLLSEL_MASK;
SIM_SCGC5 |= SIM_SCGC5_PORTD_MASK; //引脚复用为串口功能并启用串口模块时钟 系统集成模块,PTD时钟打开
PORTD_PCR7 |= PORT_PCR_MUX(0x3); //使能UART0_TXD (PTD7)
PORTD_PCR6 |= PORT_PCR_MUX(0x3); //使能UART0_RXD (PTD6)
SIM_SCGC4 |= SIM_SCGC4_UART0_MASK; //启动串口0时钟 SIM_SCGC4:0 0 UART2 UART1 UART0 0 I2C1 I2C0 1 0
UART0_C2 &= ~(UART_C2_TE_MASK | UART_C2_RE_MASK); //暂时关闭串口0发送与接收功能
clk_Khz = MCGPLL_CLK_KHZ; //48000
u_sbr = 313; //(uint16)((clk_Khz*125)/(baud_rate * 2)); //配置串口波特率,
temp = UART_BDH_REG(uartch1) & (~UART_BDH_SBR(0x1F));
UART_BDH_REG(uartch1) = temp | UART_BDH_SBR(((u_sbr & 0x1F00) >> 8));
UART_BDL_REG(uartch1) = (uint8)(u_sbr & UART_BDL_SBR_MASK);
UART0_C4 = 0x0F; //初始化控制寄存器,8位无校验模式,清标志位
UART0_C1 = 0x00;
UART0_C3 = 0x00;
UART0_MA1 = 0x00;
UART0_MA2 = 0x00;
UART0_S1 |= 0x1F; //低5位全1,
UART0_S2 |= 0xC0;
UART0_C2 |= (UART_C2_TE_MASK | UART_C2_RE_MASK); //启动发送与接收
UART0_C2 |= (UART_C2_RIE_MASK); //READ 中断使能,暂时没加TIE的,以后加
//串口发
if((UART0_S1 & UART_S1_TDRE_MASK) || (UART0_S1 & UART_S1_TC_MASK)) //判断发送缓冲区是否为空
{
UART0_D = 0x55;
}
|
|