注册 登录
查看: 784|回复: 12

[智能车] 新的问题诞生了,不过应该简单

[复制链接]
发表于 2013-6-5 23:22:43 | 显示全部楼层 |阅读模式
#if defined(NO_PLL_INIT)
    core_clk_mhz = 50;                      //如果定义不初始化锁相环,则进入 FEI mode
#else
    /* 增强系统频率   可以在这里设置超频  */
    core_clk_mhz = pll_init(MCG_CLK_MHZ);
#endif

    //通过pll_init函数的返回值来计算内核时钟和外设时钟,便于其他函数可查询时钟频率
    core_clk_khz = core_clk_mhz * 1000;
    bus_clk_khz = core_clk_khz / (((SIM_CLKDIV1 & SIM_CLKDIV1_OUTDIV2_MASK) >> 24) + 1);



1, 之前core_clk_mhz = 20,我用串口测试程序无法正常接收数据,但是我改成50,就可以,这是为什么呢?

2,这段代码主要是为了干嘛的呢?芯片晶振是50,是不是和这段代码有关?

3,虽然有显示了,但是显示的不完全,我用的是UART1口,



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-6-6 07:47:43 | 显示全部楼层
我们的代码没有定义 NO_PLL_INIT 的啊

所以不会执行: core_clk_mhz = 50;                      //如果定义不初始化锁相环,则进入 FEI mode
回复 支持 反对

使用道具 举报

发表于 2013-6-6 07:48:02 | 显示全部楼层
是直接用我们的代码的吗?
回复 支持 反对

使用道具 举报

发表于 2013-6-6 08:13:06 | 显示全部楼层
尝试一下这种修改方式是否可行:
在串口初始化函数里,
当波特率为9600时, sbr = (u16)(sysclk / (baud << 4));这里为4时正常。
当波特率为19200时,sbr = (u16)(sysclk / (baud << 3));这里为3时正常。
当波特率为38400时,sbr = (u16)(sysclk / (baud << 2));这里为2时正常。


看看这样修改,是否可以解决,这个是智能车论坛一个也是用其他核心板的人 他的修改方案,另外你单步调试的时候,看看 baud 值 与你 设定的值是否相同。

由于我们手上没龙丘的核心板,所以测不出来
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-6 09:12:12 | 显示全部楼层
山外メ雲ジ 发表于 2013-6-6 07:48
是直接用我们的代码的吗?

恩,是的,是直接用你们的测试代码,我也不知道,我以为晶振原因呢

串口初始代码里面是不是
//设置的时候,应该禁止发送接受
    UART_C2_REG(UARTx[uratn]) &= ~(UART_C2_TE_MASK  | UART_C2_RE_MASK );

    //配置成8位无校验模式
    //设置 UART 数据格式、校验方式和停止位位数。通过设置 UART 模块控制寄存器 C1 实现;
    UART_C1_REG(UARTx[uratn]) = 0;        // 全部直接使用默认设置就行,所以直接清0

    //计算波特率,串口0、1使用内核时钟,其它串口使用外设时钟
    if ((uratn == UART0) | (uratn == UART1))
        sysclk = core_clk_khz * 1000;            //内核时钟
    else
        sysclk = bus_clk_khz * 1000;  //外设时钟

    //设置 UART 数据通讯波特率。通过设置 UART 模块的波特率寄存器
    sbr = (u16)(sysclk / (baud << 4));

    /* Save off the current value of the UARTx_BDH except for the SBR field */
    temp = UART_BDH_REG(UARTx[uratn]) & ~(UART_BDH_SBR(0x1F));

    UART_BDH_REG(UARTx[uratn]) = temp |  UART_BDH_SBR(((sbr & 0x1F00) >> 8));
    UART_BDL_REG(UARTx[uratn]) = (u8)(sbr & UART_BDL_SBR_MASK);

    //brfa = (((sysclk*32)/(baud * 16)) - (sbr * 32));
    brfa = (((sysclk << 5) / (baud << 4)) - (sbr << 5));

    /* Save off the current value of the UARTx_C4 register except for the BRFA field */
    temp = UART_C4_REG(UARTx[uratn]) & ~(UART_C4_BRFA(0x1F));

    UART_C4_REG(UARTx[uratn]) = temp |  UART_C4_BRFA(brfa);

    /* 允许发送和接收 */
    UART_C2_REG(UARTx[uratn]) |= (UART_C2_TE_MASK | UART_C2_RE_MASK );

    //设置是否允许接收和发送中断。通过设置 UART 模块的 C2 寄存器的
    //RIE 和 TIE 位实现。如果使能中断,必须首先实现中断服务程序;



在UART.C里面改吗?在哪里添加
当波特率为9600时, sbr = (u16)(sysclk / (baud << 4));这里为4时正常。
当波特率为19200时,sbr = (u16)(sysclk / (baud << 3));这里为3时正常。
当波特率为38400时,sbr = (u16)(sysclk / (baud << 2));这里为2时正常。

恩,就是昨天你说的那种方案吗?输出端接示波器正极,负极接地,我测的是一个方波,但是波特率不是要知道1ms传输的个数吗?这个在示波器里如何看?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-6 22:47:58 | 显示全部楼层
山外メ雲ジ 发表于 2013-6-6 08:13
尝试一下这种修改方式是否可行:
在串口初始化函数里,
当波特率为9600时, sbr = (u16)(sysclk / (baud

恩,我现在用数字示波器测波形失真,0x55,频率为50hz,峰峰值为6.5V左右,均方根值为2.3V多,周期约20MS,这个波特率改怎么算呢?

龙丘的内核频率100MHz,超频到180M,这个是不是要在程序里面改一改,这会影响到串口通信吧


山外哥必回啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-6 23:07:50 | 显示全部楼层
山外メ雲ジ 发表于 2013-6-6 08:13
尝试一下这种修改方式是否可行:
在串口初始化函数里,
当波特率为9600时, sbr = (u16)(sysclk / (baud

龙丘的内核频率100MHz,超频到180M,这个是不是要在程序里面改一改,这会影响到串口通信吧


山外哥必回啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-6 23:45:15 | 显示全部楼层
山外メ雲ジ 发表于 2013-6-6 08:13
尝试一下这种修改方式是否可行:
在串口初始化函数里,
当波特率为9600时, sbr = (u16)(sysclk / (baud

山外哥,ADC的测试程序,为什么不需要用ADC_START,和ADC_STOP?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-6 23:45:49 | 显示全部楼层
山外メ雲ジ 发表于 2013-6-6 08:13
尝试一下这种修改方式是否可行:
在串口初始化函数里,
当波特率为9600时, sbr = (u16)(sysclk / (baud

还有一个问题,就是关于AD的中断是在哪里呢?
回复 支持 反对

使用道具 举报

发表于 2013-6-7 07:45:33 | 显示全部楼层
sjl123 发表于 2013-6-6 22:47
恩,我现在用数字示波器测波形失真,0x55,频率为50hz,峰峰值为6.5V左右,均方根值为2.3V多,周期约20MS, ...

你要直接用我们的完整工程啊,我们的工程会自动计算波特率的,如果你仅仅抽取我们其中一个函数,或者使用其他人的超频函数,那么我们函数的计算就会出错的
回复 支持 反对

使用道具 举报

发表于 2013-6-7 07:46:02 | 显示全部楼层
sjl123 发表于 2013-6-6 23:45
还有一个问题,就是关于AD的中断是在哪里呢?

我们代码提供的是软件触发,不需要中断
回复 支持 反对

使用道具 举报

发表于 2013-6-7 07:46:38 | 显示全部楼层
sjl123 发表于 2013-6-6 23:45
山外哥,ADC的测试程序,为什么不需要用ADC_START,和ADC_STOP?

ADC_START 在开始采集的时候内部调用,一般我们都不会停止ADC采集
回复 支持 反对

使用道具 举报

发表于 2013-6-7 07:47:41 | 显示全部楼层
sjl123 发表于 2013-6-6 23:07
龙丘的内核频率100MHz,超频到180M,这个是不是要在程序里面改一改,这会影响到串口通信吧

超频,你按照我们的超频教程去配置就好了,不要用其他人的超频函数,否则我们的计算公式会出错
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回列表 返回顶部