コード例 #1
0
ファイル: bsp_timer.c プロジェクト: Roger-WY/tq
/*******************************************************************************
 * 名    称: TIM4_Config
 * 功    能: 配置TIM4,为定时中断10ms, 频率100Hz
 * 入口参数: 无
 * 出口参数: 无
 * 作  者: Roger-WY
 * 创建日期: 2014-08-20
 * 修    改:
 * 修改日期:
 * 备    注:
 *******************************************************************************/
static void TIM4_Config(void)
{
#if 1	/* 空间不足,优化代码 */
	/* TIM4是自动重载的8位定时器,计数方向为递增,当递增到0时可以产生定时器中断,并自动重装定时器初值 */
  	/* 计算期望的计数时钟个数, 由于TIM4是8位的定时器,因此如果该值大于255,则需要进行分频 */
	TIM4_DeInit();                  		/* 复位TIM4所有寄存器 */
	TIM4_ARRPreloadConfig(ENABLE);  		/* 预先装载使能 */

	TIM4_TimeBaseInit(TIM4_PRESCALER_128, (16000000u / (1000 / SYSTICK_PERIOD)) / 128);	/* 设置预分频和定时器重载 */

	/* Clear TIM4 update flag */
	TIM4_ClearFlag(TIM4_FLAG_UPDATE);

	TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);  /* 使能TIM4中断 */
	//TIM4_UpdateDisableConfig(ENABLE);		/* 使能TIM4自动溢出事件 */

	TIM4_Cmd(ENABLE);						/* 使能TIM4 */

#else	/* 下面这个分支,可以根据时钟自动计算TIM4定时器初值 */

	uint32_t uiSysClkFreq;
	uint32_t uiCount;

	uiSysClkFreq = CLK_GetClockFreq();		/* 获得当前的系统时钟频率 */

	TIM4_DeInit();                  		/* 复位TIM4所有寄存器 */
	TIM4_ARRPreloadConfig(ENABLE);  		/* 预先装载使能 */

	/* TIM4是自动重载的8位定时器,计数方向为递增,当递增到0时可以产生定时器中断,并自动重装定时器初值 */
  	/* 计算期望的计数时钟个数, 由于TIM4是8位的定时器,因此如果该值大于255,则需要进行分频 */
  	uiCount = uiSysClkFreq / (1000 / SYSTICK_PERIOD);
  	if (uiCount <= (1u << 8))
  	{
		TIM4_TimeBaseInit(TIM4_PRESCALER_1, uiCount);	/* 设置预分频和定时器重载 */
  	} else if (uiCount <= (1u << 9)) {
  		TIM4_TimeBaseInit(TIM4_PRESCALER_2, uiCount / 2);	/* 设置预分频和定时器重载 */
  	} else if (uiCount <= (1u << 10)) {
  		TIM4_TimeBaseInit(TIM4_PRESCALER_4, uiCount / 4);	/* 设置预分频和定时器重载 */
  	} else if (uiCount <= (1u << 11)) {
  		TIM4_TimeBaseInit(TIM4_PRESCALER_8, uiCount / 8);	/* 设置预分频和定时器重载 */
  	} else if (uiCount <= (1u << 12)) {
  		TIM4_TimeBaseInit(TIM4_PRESCALER_16, uiCount / 16);	/* 设置预分频和定时器重载 */
  	} else if (uiCount <= (1u << 13)) {
  		TIM4_TimeBaseInit(TIM4_PRESCALER_32, uiCount / 32);	/* 设置预分频和定时器重载 */
  	} else if (uiCount <  (1u << 14)) {
  		TIM4_TimeBaseInit(TIM4_PRESCALER_64, uiCount / 64);	/* 设置预分频和定时器重载 */
  	} else if (uiCount <  (1u << 15)) {
  		TIM4_TimeBaseInit(TIM4_PRESCALER_128, uiCount / 128);	/* 设置预分频和定时器重载 */
  	} else {
  		while (1);	/* 异常,死机等待排错 */
  	}

	/* Clear TIM4 update flag */
	TIM4_ClearFlag(TIM4_FLAG_UPDATE);
	TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);  /* 使能TIM4中断 */
	//TIM4_UpdateDisableConfig(ENABLE);		/* 使能TIM4自动溢出事件 */

	TIM4_Cmd(ENABLE);						/* 使能TIM4 */
#endif
}
コード例 #2
0
ファイル: i2c_ee.c プロジェクト: KNVRK/STM8SProjects
void I2C_EEInit(void)
{
   u8 Input_Clock = 0x0;
	 
	/* Get system clock frequency */
	Input_Clock = CLK_GetClockFreq()/1000000;
		
  /* I2C Peripheral Enable */
  I2C_Cmd(ENABLE);
  /* Apply I2C configuration after enabling it */
  I2C_Init(I2C_Speed, I2C1_SLAVE_ADDRESS7, I2C_DUTYCYCLE_2, I2C_ACK_CURR, I2C_ADDMODE_7BIT, Input_Clock);
}
コード例 #3
0
ファイル: am2320.c プロジェクト: glockwork/stm8s_project
/*
名称: void I2C_AM2320_Init(void)
功能: I2C初始化, 50Kb/s
形参: 无
返回: 无
*/
void I2C_AM2320_Init(void)
{  
  CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, ENABLE);
  uint8_t Input_Clock = 0x0;
  /* Get system clock frequency */
  Input_Clock = CLK_GetClockFreq()/1000000;	
  /* I2C Peripheral Enable */
  I2C_Cmd( ENABLE);
  /* Apply I2C configuration after enabling it */
  I2C_Init(I2C_SPEED, I2C_SLAVE_ADDRESS7, I2C_DUTYCYCLE_2, I2C_ACK_CURR, 
           I2C_ADDMODE_7BIT, Input_Clock);
}
コード例 #4
0
ファイル: l_sleep.c プロジェクト: zhanglong71/Demo
/**
  * @brief  Measure the LSI frequency using timer IC1 and update the calibration registers.
  * @note   It is recommended to use a timer clock frequency of at least 10MHz in order 
	*         to obtain a better in the LSI frequency measurement.
	* @param  None
  * @retval None
  */
uint32_t LSIMeasurment(void)
{

	uint32_t lsi_freq_hz = 0x0;
	uint32_t fmaster = 0x0;
	uint16_t ICValue1 = 0x0;
	uint16_t ICValue2 = 0x0;

	/* Get master frequency */
	fmaster = CLK_GetClockFreq();

	/* Enable the LSI measurement: LSI clock connected to timer Input Capture 1 */
	AWU->CSR |= AWU_CSR_MSR;

	/* Measure the LSI frequency with TIMER Input Capture 1 */

	/* Capture only every 8 events!!! */
	/* Enable capture of TI1 */
	TIM3_ICInit(TIM3_CHANNEL_1, TIM3_ICPOLARITY_RISING, TIM3_ICSELECTION_DIRECTTI, TIM3_ICPSC_DIV8, 0);

	/* Enable TIM3 */
	TIM3_Cmd(ENABLE);

	/* wait a capture on cc1 */
	while ((TIM3->SR1 & TIM3_FLAG_CC1) != TIM3_FLAG_CC1);
	/* Get CCR1 value*/
	ICValue1 = TIM3_GetCapture1();
	TIM3_ClearFlag(TIM3_FLAG_CC1);

	/* wait a capture on cc1 */
	while ((TIM3->SR1 & TIM3_FLAG_CC1) != TIM3_FLAG_CC1);
	/* Get CCR1 value*/
	ICValue2 = TIM3_GetCapture1();
	TIM3_ClearFlag(TIM3_FLAG_CC1);

	/* Disable IC1 input capture */
	TIM3->CCER1 &= (uint8_t)(~TIM3_CCER1_CC1E);
	/* Disable timer3 */
	TIM3_Cmd(DISABLE);

	/* Compute LSI clock frequency */
	lsi_freq_hz = (8 * fmaster) / (ICValue2 - ICValue1);

	/* Disable the LSI measurement: LSI clock disconnected from timer Input Capture 1 */
	AWU->CSR &= (uint8_t)(~AWU_CSR_MSR);

	return (lsi_freq_hz);
}
コード例 #5
0
ファイル: rtc.c プロジェクト: LonelyWolf/stm8
// Get real LSI frequency in Hz
// Input: master_freq - master frequency in Hz
uint32_t CLK_GetLSIFreq(uint32_t master_freq) {
    uint16_t IC1_val1, IC1_val2;

    master_freq = CLK_GetClockFreq(); // Master frequency in Hz

    CLK_PCKENR1 |= (1<<0)|(1<<6); // Enable TIM2 and BEEP peripherial
    while (CLK_CBEEPR_bit.BEEPSWBSY); // Wait for BEEPSWBSY flag to clear
    CLK_CBEEPR = 0x02; // Set LSI as BEEP clock source
    BEEP_CSR1_bit.MSR = 1; // Enable BEEPCLK measurement (BEEPCLK -> TIM2 ch1)
    BEEP_CSR2_bit.BEEPEN = 1;

    // Configure TIM2 channel 1
    TIM2_CCER1_bit.CC1E = 0; // Disable the Channel 1
    TIM2_CCMR1 = 0x01; // Input Capture mapped on the direct input
    TIM2_CCER1_bit.CC1E = 1; // Enable the Channel 1
    TIM2_CCMR1 |= 0x0C; // Capture every 8 events
    TIM2_CCER1_bit.CC1P = 0; // Polarity rising
    TIM2_SR1 = 0; // Clear TIM2 flags
    TIM2_SR2 = 0;
    TIM2_CR1_bit.CEN = 1; // Enable TIM2

    while (!TIM2_SR1_bit.CC1IF); // Wait a capture on TIM2 CC1
    //while ((TIM2_SR1 & (uint8_t)0x02) != 0x02);
    IC1_val1  = (TIM2_CCR1H << 8); // Get 1st CCR1 value
    IC1_val1 |=  TIM2_CCR1L;
    TIM2_SR1_bit.CC1IF = 0; // Clear CC1 flag

    while (!TIM2_SR1_bit.CC1IF); // Wait a capture on TIM2 CC1
    //while ((TIM2_SR1 & (uint8_t)0x02) != 0x02);
    IC1_val2  = (TIM2_CCR1H << 8); // Get 2nd CCR1 value
    IC1_val2 |=  TIM2_CCR1L;
    TIM2_SR1_bit.CC1IF = 0; // Clear CC1 flag

    TIM2_CCER1_bit.CC1E = 0; // Disable the Channel 1
    TIM2_CCMR1 = 0x00; // Reset CCMR1 register
    TIM2_CR1_bit.CEN = 0; // Disable TIM2

    BEEP_CSR1_bit.MSR = 0; // Disable BEEPCLK measurement
    CLK_PCKENR1 &= ~((1<<0)|(1<<6)); // Disable TIM2 and BEEP peripherial

    return (uint32_t)((master_freq * 8) / (IC1_val2 - IC1_val1));
}