ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
21 ноября
885604 Топик полностью
Nikolay_Po (29.11.2018 23:15, просмотров: 442) ответил m16_home на Спасибо
Для примера мой oscillator.c для внутреннего генератора, с подстройкой частоты. Обнаружение сбоя генератора не использую, так как для внутреннего вероятность сбоя не высока и мои приложения того не требовали. В main.h определена величина OSCTUN, от -32 до 31. #include <xc.h> #include "main.h" void Go40MIPS(void) { OSCTUN = ((unsigned)(OscTune)*(1<<10))>>10; //Using internal oscillator CLKDIV = 0 << _CLKDIV_ROI_POSITION //Don't clear DOZEN on interrupt | 0b000 << _CLKDIV_DOZE_POSITION //Dose mode Fcy/1 (ineffective) | 0 << _CLKDIV_DOZEN_POSITION //Dose mode is off, CPU/peripheral 1:1 | 0b000 << _CLKDIV_FRCDIV_POSITION //FRC divide by 1 (none division) | 0b00 << _CLKDIV_PLLPOST_POSITION //1:2 PLL postscaler | (3-2) << _CLKDIV_PLLPRE_POSITION; //1:3 PLL prescaler PLLFBD = 65 - 2; //PLL feedback divisor __builtin_write_OSCCONH(0b001); //Set new OSC for FRCDIVN+PLL __builtin_write_OSCCONL(OSCCON | _OSCCON_OSWEN_MASK); //Start clock witching while (OSCCONbits.COSC != 0b001); //Wait for Clock switch to occur while(OSCCONbits.LOCK!=1) {}; // Wait for PLL to lock //Fosc = 7.37/3*65/2 = 79.84MHz //Fcy = Fosc/2 = 39.9MHz }