/******************************************************************************* * 名 称: 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 }
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); }
/* 名称: 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); }
/** * @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); }
// 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)); }