stm32f103c8t6秒表
时间: 2025-01-04 07:36:51 浏览: 11
### 使用 STM32F103C8T6 实现秒表功能
为了实现秒表功能,可以利用 STM32 的定时器模块来完成计时操作。具体来说,可以通过配置 TIM2 或其他通用定时器来达到这一目的。
#### 配置定时器
首先,在 STM32CubeMX 中创建一个新的项目并选择目标芯片为 STM32F103C8T6。接着按照如下方式配置:
- **RCC 设置**:确保 HSE 已经被启用作为系统时钟源,并通过 PLL 将频率提升到 72 MHz[^1]。
- **TIM2 初始化**:
- 设定预分频系数 (PSC),使得定时器输入时钟等于 1 kHz(即每毫秒触发一次更新事件)。对于 72 MHz 的 APB1 总线时钟而言,应设 PSC=7199。
- 自动重装载寄存器(ARR)设置成最大值 999,这样每次溢出会增加一秒的时间间隔。
- 启用中断以便处理时间到达的情况。
```c
// 定义全局变量用于存储经过了多少秒钟
volatile uint32_t secondsElapsed = 0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
if(htim->Instance==TIM2){ // 如果是来自 TIM2 的回调函数调用
secondsElapsed++; // 增加已过去的秒数计数器
}
}
```
上述代码片段展示了如何定义一个全局变量 `secondsElapsed` 来记录已经流逝的秒数,并且实现了当定时器周期结束时会自动执行的回调函数 `HAL_TIM_PeriodElapsedCallback()` 。每当 TIM2 发生上溢时就会进入该函数并将 `secondsElapsed` 加一表示过去了一秒。
#### 主程序逻辑
在主循环里只需要等待按键按下即可启动/停止计时过程;也可以显示当前累计的时间长度给用户查看。
```c
int main(void)
{
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM2_Init();
__HAL_TIM_ENABLE(&htim2);
while (1)
{
// 这里可以根据实际需求加入更多业务逻辑
// 显示当前时间或其他交互界面...
// 处理按钮点击事件以控制开始暂停等功能...
HAL_Delay(500);
}
}
/* USER CODE BEGIN 4 */
/**
* @brief Start or stop the timer based on button press.
*/
static void HandleButtonPress(){
static GPIO_PinState lastState;
if(GPIO_PIN_SET != HAL_GPIO_ReadPin(USER_BUTTON_PORT,USER_BUTTON_PIN)){
if(lastState == RESET && GetTickCount() - previousTime >= DEBOUNCE_DELAY_MS){
ToggleTimerStatus();
previousTime = GetTickCount();
}
lastState = SET;
}else{
lastState = RESET;
}
}
/**
* @brief Toggles between starting and stopping the timer operation.
*/
static inline void ToggleTimerStatus(){
if(__HAL_TIM_IS_ACTIVE(&htim2,TIM_FLAG_UPDATE)){
__HAL_TIM_DISABLE_IT(&htim2,TIM_IT_UPDATE);
printf("Stop\n");
}else{
__HAL_TIM_CLEAR_FLAG(&htim2,TIM_FLAG_UPDATE);
__HAL_TIM_ENABLE_IT(&htim2,TIM_IT_UPDATE);
printf("Start\n");
}
}
uint32_t GetTickCount(void){
return HAL_GetTick();
}
/* USER CODE END 4 */
```
这段 C 语言代码提供了基本框架,其中包含了初始化外设、开启定时器以及响应按键的操作。这里假设有一个名为 `HandleButtonPress` 函数用来检测是否有键按下的情况发生,并据此切换计时状态。另外还提供了一个辅助方法 `ToggleTimerStatus` ,它负责打开或关闭定时器中断从而实现秒表启停的效果。
阅读全文