使用 Systick 设计一个电子时钟。通过串口每秒输出一次时分秒信息(时钟初始值为当前时间,无需获取系统时间)
时间: 2024-03-08 14:49:36 浏览: 182
好的,我可以帮你设计一个基于Systick的电子时钟,并通过串口输出时分秒信息。下面是代码实现:
```c
#include "stm32f10x.h"
#include <stdio.h>
#define USARTx USART1
#define BAUD_RATE 115200
volatile uint32_t ticks = 0;
volatile uint8_t seconds = 0;
volatile uint8_t minutes = 0;
volatile uint8_t hours = 0;
void init_usart(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
// USART1_TX PA9
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
// USART1_RX PA10
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
USART_InitStruct.USART_BaudRate = BAUD_RATE;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode = USART_Mode_Tx;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_Init(USART1, &USART_InitStruct);
USART_Cmd(USART1, ENABLE);
}
void USART_SendString(char* str)
{
while (*str)
{
while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
USART_SendData(USARTx, *str++);
}
}
void SysTick_Handler(void)
{
ticks++;
if (ticks >= 1000)
{
ticks = 0;
seconds++;
if (seconds >= 60)
{
seconds = 0;
minutes++;
if (minutes >= 60)
{
minutes = 0;
hours++;
if (hours >= 24)
{
hours = 0;
}
}
}
}
}
int main(void)
{
SystemInit();
init_usart();
SysTick_Config(SystemCoreClock / 1000);
char time_str[20];
while (1)
{
sprintf(time_str, "%02d:%02d:%02d\r\n", hours, minutes, seconds);
USART_SendString(time_str);
while (ticks != 0);
}
}
```
这个程序中,我们使用了Systick定时器,并设置它的频率为1kHz。每当Systick定时器触发一次中断,我们就将计时器`ticks`加1。当计时器`ticks`累加到1000时,说明已经过了1秒钟,我们就将秒数`seconds`加1。同样的道理,我们可以通过判断分钟数`minutes`和小时数`hours`是否需要加1来更新时间。最后,我们通过串口将时分秒信息输出到电脑终端上。
需要注意的是,在输出时分秒信息之后,我们需要等待一段时间,直到计时器`ticks`被重置为0,才能继续更新时间。否则,由于串口输出操作需要一定时间,会导致时间计算有误差。
阅读全文