Microchip
直播中

刘娟

8年用户 671经验值
私信 关注
[问答]

dsPIC33EP256MU806更改时钟源和UART波特率

我尝试改变我的DSPIC33 EP256MU806设备的时钟频率时遇到了麻烦。我有一个16MHz晶体连接在我的主要引脚(OSC1和OSC2)。因此,当我使用配置寄存器来选择它作为时钟源时,我的串行端口计算正在工作:_FOSCSEL(FNOSC_PRI&IESO_OFF)_FOSC(FCKSM_CSDCMD&IOL1WAY_OFF&OSCIOFNC_ON&POSCMD_HS),因此随着工作的进行(define CLOCK_FREQ 8000000),我想改变它的我用FRC内部时钟源供电,然后切换到从主16MHz晶体产生的所需时钟频率:_FOSCSEL(FNOSC_FRC&IESO_OFF)//用FRC时钟源启动//启用时钟切换并在HS模式_FOSC(FCKSM_CSECMD&IOL1WAY)中配置POSC因此,在配置寄存器中,我试图简单地将时钟频率设置为8MHz,因此简单地将时钟源更改为Primary而不用PLL:u builtin_write_OSCCONH(0b010);_builtin_write_OSCCONL(OSCCON|0x01);//等待时钟切换发生(OSC)康斯!(= 0B010);/ /等待PLL锁定(OSCCONbits.LOCK)!= 1),这是为了使时钟达到8MHz,串行端口再次工作。所以现在我有点冒险,去了一个60MHz的指令钟。代码与上面的代码基本相同,但是现在需要PLL来生成120MHz,所以指令时钟是60MHz://Initiate Clock Switch to Primary Oscillator with PLL(NOSC=0b011)u builtin_write_OSCCONH(0b011);/**N1=CLKDIVbits.PLLPRE+2*N2=2*(CLKDIVbits.PLLPOST+1)*M=PL=PLPLLDIV+2**CLOCK=(晶体*M)/(N1*N2)*/CLKDIVbits.PLLPRE=0x00;CLKDIVbits.PLLPOST=0x00;PLLFBDbits.PLLDIV=28;u builtin_write_OSCCONL(OSCCON|0x01);//等待时钟切换发生(OSCCONbits.COSC!(=时钟);/ /等待PLL同步(OSCCONbits.LOCK)!我用PICKIT3对这个代码进行了几次编程,但最终还是成功了,因为我的LED现在闪烁的频率要高得多,但是我对CLOCKK_FREQ的定义设置为60000000,我的串行日志UART现在工作在138KHz左右。我用数据表中的方程式17-1来设置它,它指出:波特率=Fp/(16*(UxBRG+1))其中Fp表示指令周期时钟频率FOSC/2U1BRG=((CLOCK_FREQ/SERIAL_LOGGING_BAUD)/16)-1;CLOCK_FREQ=60000000SERIAL_LOGGING_BAUD=19200我不知道为什么不是w奥林。现在有一个最小和最大波特率的指令时钟频率,但我应该在19k2的范围内。哇,这是不好的,只是重新编程几次,它开始工作。现在我关心的是可重复性。我会发布它,甚至认为它是排序。有些事怪怪的。

回帖(2)

薄坤坤

2019-10-23 08:20:17
只要你使用一个结构良好的板,所有的电源,控制和编程线正确连接/旁路/等等,那么重复性就不会成为问题。在IDE中,确保在所有编译之前代码被写入文件,并且没有错误消息。我知道这听起来很基本,但是很容易错过一些东西。苏珊
举报

王焕树

2019-10-23 08:31:55
将“u DATE_”和“u TIME_”预定义的字符串发送到串行端口,以确认当前文件何时被编译,这样做不会有问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分