CS库为clock system即系统时钟配置
此函数库需要系统时钟的基础,可参看我之前的博客MSP432-系统时钟简介
目录
时钟初始化设置
void CS_setExternalClockSourceFrequency(uint32_t lfxt_XT_CLK_frequency,
uint32_t hfxt_XT_CLK_frequency);
//设置外部晶振LFXT和HFXT的频率值
如果不使用外部时钟来源则不管这个,时钟故障机制会选择其他时钟来源
void CS_initClockSignal(uint32_t selectedClockSignal,uint32_t clockSource,
uint32_t clockSourceDivider);
//初始化时钟信号
//! \param selectedClockSignal Clock signal to initialize.
//! 选择一个时钟信号初始化
//! - \b CS_ACLK,
//! - \b CS_MCLK,
//! - \b CS_HSMCLK
//! - \b CS_SMCLK
//! - \b CS_BCLK [clockSourceDivider is ignored for this parameter]
//! \param clockSource Clock source for the selectedClockSignal signal.
//! 选择时钟信号的时钟源
//! - \b CS_LFXTCLK_SELECT,
//! - \b CS_HFXTCLK_SELECT,
//! - \b CS_VLOCLK_SELECT, [Not available for BCLK]
//! - \b CS_DCOCLK_SELECT, [Not available for ACLK, BCLK]
//! - \b CS_REFOCLK_SELECT,
//! - \b CS_MODOSC_SELECT [Not available for ACLK, BCLK]
//! \param clockSourceDivider - selected the clock divider to calculate
//! clock signal from clock source. This parameter is ignored when
//! setting BLCK. Valid values are:
//! 选择分频器,时钟信号频率=时钟源频率/x
//! - \b CS_CLOCK_DIVIDER_1,
//! - \b CS_CLOCK_DIVIDER_2,
//! - \b CS_CLOCK_DIVIDER_4,
//! - \b CS_CLOCK_DIVIDER_8,
//! - \b CS_CLOCK_DIVIDER_16,
//! - \b CS_CLOCK_DIVIDER_32,
//! - \b CS_CLOCK_DIVIDER_64,
//! - \b CS_CLOCK_DIVIDER_128
要注意这个函数可能导致阻塞,因为此函数会等待CSSTAT寄存器(时钟状态寄存器)被设置为正确的值。
还要注意如果HSMCLK和SMCLK共享相同的时钟源时,当改变HSMCLK的时钟信号,那么SMCLK的时钟信号也会被改变。
bool CS_startHFXT(bool bypassMode);
//检测HFXT外接晶振状态,不带超时
bool CS_startHFXTWithTimeout(bool bypassMode, uint32_t timeout);
//检测HFXT外接晶振状态,带有超时
HFXT的外接晶振支持0~48MHz的频率,具体取决于选择的驱动强度。
在调用此函数前需要设置外部晶振频率
有关合适的驱动器设置可参阅特定的元件datasheet
不带超时函数会一直循环直到所有晶振故障标志被清除,可能造成阻塞,带超时则不会阻塞
如果bypassMode被设置为True,则此函数若在短时间内无法排除故障时会绕过故障检测机制,直接从旁路模式打开晶振,直接使用,但一般建议设置为false
正确启动则返回true,未能正确启动则返回false
bool CS_startLFXT(uint32_t xtDrive);
//检测LFXT启动状态
bool CS_startLFXTWithTimeout(uint32_t xtDrive, uint32_t timeout);
//带超时的LFXT启动状态
//! \param xtDrive is the target drive strength for the LFXT crystal
//! oscillator.
//! Valid values are:
//! - \b CS_LFXT_DRIVE0,
//! - \b CS_LFXT_DRIVE1,
//! - \b CS_LFXT_DRIVE2,
//! - \b CS_LFXT_DRIVE3, [Default Value]
//! - \b CS_LFXT_BYPASS
HFXT的外接晶振支持0~500KHz的频率,具体取决于选择的驱动强度。
在调用此函数前需要设置外部晶振频率
有关合适的驱动器设置可参阅特定的元件datasheet
xtDriver是LFXT晶震的目标驱动强度。
不带超时函数会一直循环直到所有晶振故障标志被清除,可能造成阻塞,带超时则不会阻塞
如果bypassMode被设置为True,则此函数若在短时间内无法排除故障时会绕过故障检测机制,直接从旁路模式打开晶振,直接使用,但一般建议设置为false
正确启动则返回true,未能正确启动则返回false
void CS_setReferenceOscillatorFrequency(uint8_t referenceFrequency);
//选择REFO时钟源频率
//! \param referenceFrequency selects between the valid frequencies:
//! - \b CS_REFO_32KHZ,
//! - \b CS_REFO_128KHZ,
可选频率为32768Hz和128KHz。
时钟请求模块
void CS_enableClockRequest(uint32_t selectClock);
//使能时钟请求模块
void CS_disableClockRequest(uint32_t selectClock);
//禁用时钟请求模块
//! \param selectClock selects specific request disables. Valid values are
//! are a logical OR of the following values:
//! - \b CS_ACLK,
//! - \b CS_HSMCLK,
//! - \b CS_SMCLK,
//! - \b CS_MCLK
时钟请求模块可减小不需要特定时钟系统模块的动态功率
获取各时钟源频率
uint32_t CS_getACLK(void);
uint32_t CS_getSMCLK(void);
uint32_t CS_getMCLK(void);
uint32_t CS_getBCLK(void);
uint32_t CS_getHSMCLK(void);
uint32_t CS_getDCOFrequency(void);
//获取各时钟源频率
//单位为Hz
如果时钟来源为HFXT或LFXT则需要先调用CS_setExternalClockSourceFrequency函数
DCO数控时钟源频率设置
void CS_setDCOCenteredFrequency(uint32_t dcoFreq);
//设置DCO的中心频率
//! \param dcoFreq selects between the valid frequencies:
//! - \b CS_DCO_FREQUENCY_1_5, [1MHz to 2MHz]
//! - \b CS_DCO_FREQUENCY_3, [2MHz to 4MHz]
//! - \b CS_DCO_FREQUENCY_6, [4MHz to 8MHz]
//! - \b CS_DCO_FREQUENCY_12, [8MHz to 16MHz]
//! - \b CS_DCO_FREQUENCY_24, [16MHz to 32MHz]
//! - \b CS_DCO_FREQUENCY_48 [32MHz to 64MHz]
void CS_tuneDCOFrequency(int16_t tuneParameter);
//精调DCO频率
每个频率代表一个频率范围的中间值,可通过CS_tuneDCOFrequency函数精调。
void CS_setDCOFrequency(uint32_t dcoFrequency);
//自动将DCO调谐到给定的频率
最大可设置为64MHz
void CS_enableDCOExternalResistor(void);
//使用外部电阻
void CS_disableDCOExternalResistor(void);
//不使用外部电阻
void CS_setDCOExternalResistorCalibration(uint_fast8_t uiCalData,
uint_fast8_t freqRange);
//设置DCO校准值
一般使用校准填充建议的外部电阻器的数据(见设备数据表)。
CS故障模块
void CS_enableFaultCounter(uint_fast8_t counterSelect);
//使能CS模块故障计数器
void CS_disableFaultCounter(uint_fast8_t counterSelect);
//禁用CS模块故障计数器
void CS_resetFaultCounter(uint_fast8_t counterSelect);
//复位CS模块故障计数器
//! \param counterSelect selects the fault counter to enable
//! - \b CS_HFXT_FAULT_COUNTER
//! - \b CS_LFXT_FAULT_COUNTER
void CS_startFaultCounter(uint_fast8_t counterSelect,uint_fast8_t countValue);
//设置故障计数器的起始值
//! \param counterSelect selects the fault counter to reset
//! - \b CS_HFXT_FAULT_COUNTER
//! - \b CS_LFXT_FAULT_COUNTER
//! \param countValue selects the cycles to set the fault counter to
//! - \b CS_FAULT_COUNTER_4096_CYCLES
//! - \b CS_FAULT_COUNTER_8192_CYCLES
//! - \b CS_FAULT_COUNTER_16384_CYCLES
//! - \b CS_FAULT_COUNTER_32768_CYCLES
CS中断模块
void CS_enableInterrupt(uint32_t flags);
//使能单个时钟控制中断源
void CS_disableInterrupt(uint32_t flags);
//禁用单个时钟控制中断源
uint32_t CS_getEnabledInterruptStatus(void);
//获取启动的中断的状态
uint32_t CS_getInterruptStatus(void);
//获取中断状态
//! \param flags is a bit mask of the interrupt sources to be enabled. Must
//! be a logical OR of:
//! - \b CS_LFXT_FAULT,
//! - \b CS_HFXT_FAULT,
//! - \b CS_DCOMIN_FAULT,
//! - \b CS_DCOMAX_FAULT,
//! - \b CS_DCO_OPEN_FAULT,
//! - \b CS_STARTCOUNT_LFXT_FAULT,
//! - \b CS_STARTCOUNT_HFXT_FAULT,
void CS_clearInterruptFlag(uint32_t flags);
//清除中断标志
//! \param flags is a bit mask of the interrupt sources to be cleared. Must
//! be a logical OR of:
//! - \b CS_LFXT_FAULT,
//! - \b CS_HFXT_FAULT,
//! - \b CS_DCO_OPEN_FAULT,
//! - \b CS_STARTCOUNT_LFXT_FAULT,
//! - \b CS_STARTCOUNT_HFXT_FAULT,
中断源根据使用的模块不同而变化,可以参考数据表查看可用中断源
void CS_registerInterrupt(void (*intHandler)(void));
//注册中断处理函数
void CS_unregisterInterrupt(void);
//注销中断处理函数