打印

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

[复制链接]
1280|48
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我程序烧录进去之后没有任何反映

使用特权

评论回复
沙发
zhenykun| | 2021-12-8 22:38 | 只看该作者
可能是外部硬件晶振没起振的原因

使用特权

评论回复
板凳
zwll| | 2021-12-8 22:40 | 只看该作者

还有什么现象?能再详细描述下吗?

使用特权

评论回复
地板
supernan|  楼主 | 2021-12-8 22:42 | 只看该作者
使用内部快速RC振荡程序是可以正常运行的。
可以请各位看看在下的时钟配置程序是否正确吗?

使用特权

评论回复
5
supernan|  楼主 | 2021-12-8 22:45 | 只看该作者

使用特权

评论回复
6
supernan|  楼主 | 2021-12-8 22:47 | 只看该作者
配置位图以及主函数的寄存器配置

使用特权

评论回复
7
heweibig| | 2021-12-8 22:48 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
8
supernan|  楼主 | 2021-12-8 22:50 | 只看该作者
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);

}

使用特权

评论回复
9
dingy| | 2021-12-8 22:54 | 只看该作者
直接对OSCCON操作应该是不成功的,要先解锁。

使用特权

评论回复
10
stly| | 2021-12-8 22:55 | 只看该作者
你这个应该是对OSCCON没有写成功

使用特权

评论回复
11
supernan|  楼主 | 2021-12-8 22:58 | 只看该作者
手册中OSCCON寄存器高位解锁序列和低位解锁序列是什么意思

使用特权

评论回复
12
supernan|  楼主 | 2021-12-8 23:00 | 只看该作者
在下没找到相关操作并且它说时序要求很高,在下用C语言进行相关操作,会有影响吗?

使用特权

评论回复
13
zhenykun| | 2021-12-8 23:02 | 只看该作者
要不介绍下具体哪个型号,大家也方便帮你瞅瞅手册。

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

使用特权

评论回复
14
jlyuan| | 2021-12-8 23:04 | 只看该作者
对于你配置120M晶振的问题,建议先使用一个低的时钟看看能跑起来吗,排除你晶振和匹配电容的问题

使用特权

评论回复
15
yszong| | 2021-12-8 23:06 | 只看该作者
上面OK的话,再尝试配置这个120M频率试试,好运哈

使用特权

评论回复
16
stly| | 2021-12-8 23:08 | 只看该作者
编译器都有操作OSCCON的内置函数,直接用内置函数写操作就可以了

使用特权

评论回复
17
supernan|  楼主 | 2021-12-8 23:09 | 只看该作者
在下又改了一下代码,是想启动时是FRC作为晶振,然后进行时钟切换。

使用特权

评论回复
18
supernan|  楼主 | 2021-12-8 23:11 | 只看该作者
下面放出代码,FRCPLL的配置是正常的,芯片是dsPIC33FJ64MC506。

使用特权

评论回复
19
supernan|  楼主 | 2021-12-8 23:15 | 只看该作者

使用特权

评论回复
20
supernan|  楼主 | 2021-12-8 23:18 | 只看该作者
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 */

}

使用特权

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

本版积分规则

730

主题

10412

帖子

6

粉丝