历史上的今天
今天是:2024年10月19日(星期六)
2019年10月19日 | TI MSP430 如何使用 DCO 倍频
2019-10-19 来源:eefocus
1、背景:
许久未更新博客,最近由于项目需求,简单使用430做接口,但由于内部默认可使用1MHz的频率无法满足需求;
2、功能:
经查阅手册发现片子支持DCO倍频,频率可以高达16M,经验证满足需求;
3、前提:
需要外接32K晶振作为校正频率;
4、参阅代码如下:
#include // 32KHz/8=4096Hz,由此计算倍频 #define DELTA_1MHZ 244 // 244 x 4096Hz = 999.4Hz #define DELTA_8MHZ 1953 // 1953 x 4096Hz = 7.99MHz #define DELTA_12MHZ 2930 // 2930 x 4096Hz = 12.00MHz #define DELTA_16MHZ 3906 // 3906 x 4096Hz = 15.99MHz unsigned char CAL_DATA[8]; // Temp. storage for constants volatile unsigned int i; int j; char *Flash_ptrA; // Segment A pointer void Set_DCO(unsigned int Delta); int main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT for (i = 0; i < 0xfffe; i++); // Delay for XTAL stabilization P1OUT = 0x00; // Clear P1 output latches P1SEL = 0x10; // P1.4 SMCLK output P1DIR = 0x11; // P1.0,4 output j = 0; // Reset pointer Set_DCO(DELTA_16MHZ); // Set DCO and obtain constants CAL_DATA[j++] = DCOCTL; CAL_DATA[j++] = BCSCTL1; Set_DCO(DELTA_12MHZ); // Set DCO and obtain constants CAL_DATA[j++] = DCOCTL; CAL_DATA[j++] = BCSCTL1; Set_DCO(DELTA_8MHZ); // Set DCO and obtain constants CAL_DATA[j++] = DCOCTL; CAL_DATA[j++] = BCSCTL1; Set_DCO(DELTA_1MHZ); // Set DCO and obtain constants CAL_DATA[j++] = DCOCTL; CAL_DATA[j++] = BCSCTL1; Flash_ptrA = (char *)0x10C0; // Point to beginning of seg A FCTL2 = FWKEY + FSSEL0 + FN1; // MCLK/3 for Flash Timing Generator FCTL1 = FWKEY + ERASE; // Set Erase bit FCTL3 = FWKEY + LOCKA; // Clear LOCK & LOCKA bits *Flash_ptrA = 0x00; // Dummy write to erase Flash seg A FCTL1 = FWKEY + WRT; // Set WRT bit for write operation Flash_ptrA = (char *)0x10F8; // Point to beginning of cal consts for (j = 0; j < 8; j++) *Flash_ptrA++ = CAL_DATA[j]; // re-flash DCO calibration data FCTL1 = FWKEY; // Clear WRT bit FCTL3 = FWKEY + LOCKA + LOCK; // Set LOCK & LOCKA bit while (1) { P1OUT ^= 0x01; // Toggle LED for (i = 0; i < 0x4000; i++); // SW Delay } } // 计算倍频 void Set_DCO(unsigned int Delta) // Set DCO to selected frequency { unsigned int Compare, Oldcapture = 0; BCSCTL1 |= DIVA_3; // ACLK = LFXT1CLK/8 TACCTL0 = CM_1 + CCIS_1 + CAP; // CAP, ACLK TACTL = TASSEL_2 + MC_2 + TACLR; // SMCLK, cont-mode, clear while (1) { while (!(CCIFG & TACCTL0)); // Wait until capture occured TACCTL0 &= ~CCIFG; // Capture occured, clear flag Compare = TACCR0; // Get current captured SMCLK Compare = Compare - Oldcapture; // SMCLK difference Oldcapture = TACCR0; // Save current captured SMCLK if (Delta == Compare) break; // If equal, leave "while(1)" else if (Delta < Compare) { DCOCTL--; // DCO is too fast, slow it down if (DCOCTL == 0xFF) // Did DCO roll under? if (BCSCTL1 & 0x0f) BCSCTL1--; // Select lower RSEL } else { DCOCTL++; // DCO is too slow, speed it up if (DCOCTL == 0x00) // Did DCO roll over? if ((BCSCTL1 & 0x0f) != 0x0f) BCSCTL1++; // Sel higher RSEL } } TACCTL0 = 0; // Stop TACCR0 TACTL = 0; // Stop Timer_A BCSCTL1 &= ~DIVA_3; // ACLK = LFXT1CLK }
史海拾趣
|
请问大家,为什么跳转指令像JC、JZ、JMP的微程序相同,计算机却可以判断出执行哪一个指令呢? 我查过,说是微程序是入口地址,指令的判断是通过硬件实现~~ 但是还是不明白,是怎么判断的? 难道对指令寄存器中IR有要求吗?… 查看全部问答> |
|
心电图机串口传输到电脑的文件怎样才能转换为可读文件???急!!! 心电图机串口传输到电脑的文件怎样才能转换为可读文件(可读文件包括ECG格式\\DICOM格式\\BMP格式都可以)???急!!!… 查看全部问答> |
|
本人初学嵌入式系统 对于ucos尚留几个关于任务调度的问题,急需解惑, (1)当前运行的任务是不是还在就绪表中: 1.假设是,那么调度到新任务不都是当前任务么,也就是说实际上不会有任务切换了?(假设不会 ...… 查看全部问答> |
|
我想用vs2005做一个wince下的自动拨号程序,不知该调用哪个dll文件。XP系统下应该用rasapi32.dll,可是wince下该调用哪个dll呢? … 查看全部问答> |
|
大家好,我现在用smbus(I2C)总线进行两个C8051F系列单片机的通讯。单片机中有控制逻辑模块,不需要自己写驱动程序。 我设置的模式是主器件发送,从器件接受。 我现在的问题是,发送数据只能对0确认,其他的数,字符一概不确认,不知是什么原因啊 ...… 查看全部问答> |
|
在CE5.0下使用VB2005模拟按键时: keybd_event 、sendinput、sendkeys 等函数均不可以 RegisterHotKey 没有使用成功 请求帮助!… 查看全部问答> |
|
cisco 华为 juniper 阿尔卡特的操作系统是什么啊?他们还有没有后台架构,例如VxWorks。有哪些路由器是用linux unix uclinux VxWorks或psos作为操作系统的啊?… 查看全部问答> |




