主题中讨论的其他器件: MSP430F5438A
工具/软件:Code Composer Studio
您好!
我正在尝试移植函数、以将 音频 PWM 的 UCS/FLL 从 msp430f5438a 初始化为 msp430f5359、这是随附的代码。 音频代码适用于 msp430f5438a、但不适用于 msp430f5359。 我需要对附加代码进行哪些更改、以便它适用于 msp430f5359。
#include "msp430.h" #include "hal_uCS.h" void LFXT_Start (uint16_t xtdrive) { //如果驱动器设置尚未设置为最大值 //将其设置为 LFXT 启动的最大值 if ((UCSCTL6 & XT1DRIVE_3)!= XT1DRIVE_3){ UCSCTL6_L |= XT1DRIVE1_L + XT1DRIVE0_L; //的最高驱动器设置 // XT1startup } while (UCSCTL7 & XT1LFOFFG){ //检查 LFXT1故障标志 UCSCTL7 &=~(XT1LFOFFG); //清除 LFXT1故障标志 //清除全局故障标志。 在 LFXT1导致全局故障标志出现的情况下 //将其设置为清除全局错误条件。 如果任何错误条件仍然存在、 //全局标志将再次出现。 SFRIFG1 &=~OFIFG; } UCSCTL6 =(UCSCTL6 &~(XT1DRIVE_3))|(xtdrive); //设置请求的驱动器模式 } void Init_FLL_settle (uint16_t fsystem、uint16_t 比率) { volatile uint16_t x =比率* 32; init_FLL (fsystem、比率); while (x--){ _DELAY_CYCLES (30); } } void Init_FLL (uint16_t fsystem、uint16_t 比率) { uint16_t d、DCO_div_bits; uint16_t MODE = 0; //保存 FLL 循环控制的实际状态,然后将其禁用。 需要这样做 //防止 FLL 在我们进行基本修改时起作用 //时钟设置。 uint16_t srRegisterState =__get_SR_register ()& SCG0; D =比率; DCO_div_bits = FLLD__2; //至少有一个2的分频器 if (fsystem > 16000){ D >>= 1; 模式= 1; } 否则{ fsystem <<= 1; // fsystem = fsystem * 2 } while (d > 512){ DCO_div_bits = DCO_div_bits + FLLD0; //设置下一个更高的 div 级别 D >=1; } _bis_SR_register (SCG0); //禁用 FLL UCSCTL0 = 0x0000; //将 DCO 设置为最低抽头 UCSCTL2 &=~(0x03FF); //复位 FN 位 UCSCTL2 = DCO_div_bits |(d - 1); IF (fsystem <= 630) // fsystem < 0.63MHz UCSCTL1 = DCORSEL_0; 否则(fsystem < 1250) // 0.63MHz < fsystem < 1.25Mhz UCSCTL1 = DCORSEL_1; 否则(fsystem < 2500) // 1.25Mhz < fsystem < 2.5MHz UCSCTL1 = DCORSEL_2; 否则(fsystem < 5000) // 2.5MHz < fsystem < 5MHz UCSCTL1 = DCORSEL_3; 否则(fsystem < 10000) // 5MHz < fsystem < 10MHz UCSCTL1 = DCORSEL_4; 否则(fsystem < 20000) // 10MHz < fsystem < 20MHz UCSCTL1 = DCORSEL_5; 否则、如果(fsystem < 40000) // 20MHz < fsystem < 40MHz UCSCTL1 = DCORSEL_6; 其他 UCSCTL1 = DCORSEL_7; _BIC_SR_register (SCG0); //重新启用 FLL while (UCSCTL7 & DCOFFG){ //检查 DCO 故障标志 UCSCTL7 &=~DCOFFG; //清除 DCO 故障标志 //清除全局故障标志。 如果 DCO 导致全局故障标志出现 //将其设置为清除全局错误条件。 如果任何错误条件仍然存在、 //全局标志将再次出现。 SFRIFG1 &=~OFIFG; } _bis_SR_register (srRegisterState); //恢复以前的 SCG0 如果(MODE = 1){ // fsystem >16000 SELECT_MCLK_SMCLK (SELM__DCOCLK + SELESS_DCOCLK); //选择 DCOCLK } 否则{ SELECT_MCLK_SMCLK (SELM__DCOCLKDIV + SELESS_DCOCLKDIV);//选择 DCODIVCLK } }