打印
[PIC®/AVR®/dsPIC®产品]

PIC33FJ芯片,使用外部晶振做时钟源的配置问题

[复制链接]
1071|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
galjewf|  楼主 | 2020-7-16 15:36 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
我程序烧录进去之后没有任何反映,可能是外部硬件晶振没起振的原因。另外,使用内部快速RC振荡程序是可以正常运行的。
可以请各位看看在下的时钟配置程序是否正确吗?
以下是配置位图以及主函数的寄存器配置:

int main(int argc, char** argv)
{
        //产生Fosc = 120MHz
        CLKDIVbits.PLLPRE = 0;          //N1 = 2  
        PLLFBDbits.PLLDIV = 58;         //M = 60  
        CLKDIVbits.PLLPOST = 0;         //N2 = 2    8 * (60 / (2 + 2)) = 120M

        OSCCONbits.NOSC = 0b11;
        OSCCONbits.CLKLOCK = 0b0;
       
    // Wait for Clock switch to occur
    while(OSCCONbits.COSC != 0b011)                /* Wait for new Oscillator to become XT with PLL */  
        {

        }
    while(OSCCONbits.LOCK != 1)                /* Wait for Pll to Lock */
        {

        }
        //Tim3_Init();
    //timer1_init();
    LATF = 0x0000;  // B端口清零
    TRISF = 0x0000; // B端口设为输入, 0: out, 1: in
    PORTF = 0x0000;
    while(1)
    {
                LATF=(PORTF ^ 0xff);
            delay_ms(500);
    }
    return (EXIT_SUCCESS);
}

使用特权

评论回复
评论
galjewf 2020-7-17 10:08 回复TA
@zxq1131 :找到了内置函数进行寄存器修改,但还是没有切换成功,请再指导一下。新的代码在楼下。 
zxq1131 2020-7-17 09:01 回复TA
直接对OSCCON操作应该是不成功的,要先解锁。你这个应该是对OSCCON没有写成功 
沙发
galjewf|  楼主 | 2020-7-16 17:20 | 只看该作者
本帖最后由 galjewf 于 2020-7-16 17:24 编辑

顺便问一下,手册中OSCCON寄存器高位解锁序列和低位解锁序列是什么意思,在下没找到相关操作并且它说时序要求很高,在下用C语言进行相关操作,会有影响吗?

使用特权

评论回复
板凳
mzb2012| | 2020-7-16 21:47 | 只看该作者
要不介绍下具体哪个型号,大家也方便帮你瞅瞅手册。

首先用C语言操作时钟寄存器是没问题的

其次,对于你配置120M晶振的问题,建议先使用一个低的时钟看看能跑起来吗,排除你晶振和匹配电容的问题

再次,上面OK的话,再尝试配置这个120M频率试试,好运哈

使用特权

评论回复
评论
galjewf 2020-7-17 09:12 回复TA
dsPIC33FJ64MC506 
地板
zxq1131| | 2020-7-17 08:57 | 只看该作者
galjewf 发表于 2020-7-16 17:20
顺便问一下,手册中OSCCON寄存器高位解锁序列和低位解锁序列是什么意思,在下没找到相关操作并且它 ...

编译器都有操作OSCCON的内置函数,直接用内置函数写操作就可以了

使用特权

评论回复
5
251566208| | 2020-7-17 09:47 | 只看该作者
你加我QQ:251566208,我让工程师给你看一下

使用特权

评论回复
6
galjewf|  楼主 | 2020-7-17 09:56 | 只看该作者
本帖最后由 galjewf 于 2020-7-17 14:09 编辑

在下又改了一下代码,是想启动时是FRC作为晶振,然后进行时钟切换。
下面放出代码,FRCPLL的配置是正常的,芯片是dsPIC33FJ64MC506。

void FRC_PLL(void)
{
         PLLFBD=41;              /* M=PLLFBD+2=43 */
    CLKDIVbits.PLLPOST=0;   /* N2=PLLPOST+2=2 */
    CLKDIVbits.PLLPRE=0;    /* N1=PLLPRE+2=2 */
    __builtin_write_OSCCONH(0x01);                /* 快速RC振荡器(FRC)→带PLL的快速RC振荡器(FRC) */
    __builtin_write_OSCCONL(0x01);                  /* Enable Switch */
      
    // Wait for Clock switch to occur
    while(OSCCONbits.COSC != 0b001);                /* Wait for new Oscillator to become FRC with PLL */  
    while(OSCCONbits.LOCK != 1);                /* Wait for Pll to Lock */

}
void XT_PLL(void)
{
        PLLFBD=(30-2);              /* M=PLLFBD+2=30 */
    CLKDIVbits.PLLPOST=0;   /* N2=PLLPOST+2=2 */
    CLKDIVbits.PLLPRE=0;    /* N1=PLLPRE+2=2 */

        //FOSCbits.FCKSM = 0b00;
        __builtin_write_OSCCONH(0b11);
        __builtin_write_OSCCONL(0b01);
        while(OSCCONbits.COSC != 0b011);                /* Wait for new Oscillator to become FRC with PLL */  
    while(OSCCONbits.LOCK != 1);                /* Wait for Pll to Lock */
}

现象是卡在检测COSC那一块了,难道是我这个代码的配置有问题?

使用特权

评论回复
评论
zxq1131 2020-7-17 14:14 回复TA
@galjewf :我也才在学microchip,我是在用软件仿真 
galjewf 2020-7-17 14:09 回复TA
@zxq1131 :噢,看到了谢谢指正,稍后就编辑一下,顺便问问,如果外部振荡器XT无法起振,是否可以使用pickit3进入Debug模式? 
zxq1131 2020-7-17 14:06 回复TA
@galjewf :可是你写的是0x0b11啊,指的是16进制0b11啊,你就把0x11写进去了,是指17而不是3 
galjewf 2020-7-17 13:54 回复TA
@zxq1131 :本人这里0b01是使用二进制表示,只是为了自己看的更舒服,应该是没问题的 
ynwa 2020-7-17 13:11 回复TA
@galjewf :当然是的 
zxq1131 2020-7-17 12:53 回复TA
@zxq1131 :哈哈 0x0b11,是高8位和低7位,你这写错了 
zxq1131 2020-7-17 12:51 回复TA
对, 你这写错了,不是0b,是16进制, 我没注意 
galjewf 2020-7-17 11:33 回复TA
@zxq1131 :其实是有问题的,不过我想等结贴再总结,顺便问一句,内置函数中__builtin_write_OSCCONH(0x0b11);是指修改OSCCON的8-15位吗,同理另一个OSCCONL是修改0-7位的是吗? 
zxq1131 2020-7-17 11:15 回复TA
从配置上看应该没问题啊, 你参考下7楼提的问题 你有没有满足 
7
ynwa| | 2020-7-17 10:16 | 只看该作者
本帖最后由 ynwa 于 2020-7-17 10:25 编辑

1,外部晶振是否起振,用示波器量一下就知道了。
2,设置时钟配置位POSCMD和FNOSC。3,没看到你的配置位代码,但是从配置位窗口里看,配置位是XT带PLL模式。
4,用到PLL,设置N1、M、N2,要满足数据手册上PLL BLOCK DIAGRAM里对各级频率的要求。不是最终结果满足就可以的。(datasheet上PLL CONFIGURATION部分都会介绍)


使用特权

评论回复
8
ynwa| | 2020-7-17 10:24 | 只看该作者
galjewf 发表于 2020-7-17 09:56
在下又改了一下代码,是想启动时是FRC作为晶振,然后进行时钟切换。
下面放出代码,FRCPLL的配置是正常的, ...

你配置位的设置有没有写在代码里?
要在配置里窗口里设置再烧写,也要把configuration bits set in code的勾选去掉!
最好把配置位设置写在代码里。

使用特权

评论回复
9
galjewf|  楼主 | 2020-7-17 10:33 | 只看该作者
ynwa 发表于 2020-7-17 10:24
你配置位的设置有没有写在代码里?
要在配置里窗口里设置再烧写,也要把configuration bits set in code ...

我是在代码里面配置的,这个窗口只是用来查看编译之后代码的配置位情况

使用特权

评论回复
10
ynwa| | 2020-7-17 13:13 | 只看该作者
本帖最后由 ynwa 于 2020-7-17 13:14 编辑
galjewf 发表于 2020-7-17 10:33
我是在代码里面配置的,这个窗口只是用来查看编译之后代码的配置位情况 ...

切换使用带 PLL 的内部 FRC 振荡器的示例如下:
// Select Internal FRC at POR
_FOSCSEL(FNOSC_FRC);

// Enable Clock Switching and Configure
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF);

int main()
{
// Configure PLL prescaler, PLL postscaler, PLL divisor
PLLFBD = 41; // M = 43
CLKDIVbits.PLLPOST=0; // N2 = 2
CLKDIVbits.PLLPRE=0; // N1 = 2
// Initiate Clock Switch to Internal FRC with PLL (NOSC = 0b001)
__builtin_write_OSCCONH(0x01);
__builtin_write_OSCCONL(0x01);
// Wait for Clock switch to occur
while (OSCCONbits.COSC != 0b001);
// Wait for PLL to lock
while(OSCCONbits.LOCK!=1) {};
}

N1,N2,M的值按你要用的频率计算。

使用特权

评论回复
11
galjewf|  楼主 | 2020-7-17 13:57 | 只看该作者
ynwa 发表于 2020-7-17 13:13
切换使用带 PLL 的内部 FRC 振荡器的示例如下:
// Select Internal FRC at POR
_FOSCSEL(FNOSC_FRC);

谢谢实例代码,从FRC切换至FRC with PLL再切换回FRC是没问题,如果切换至XT 和XT with PLL也是基本一样的操作的话,证明本人的代码上的操作时没问题的,现在正在排除硬件上的错误,毕竟本人现在使用的这个核心板是手工焊的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

41

帖子

0

粉丝