利用实时时钟RTC的秒中断通过USART1接口显示实时时钟。自行设计具体的功能并尝试编程实现。写出具体代码
以下是一个基于STM32F103C8T6的实时时钟RTC的秒中断程序,通过USART1接口显示实时时钟的代码:
#include "stm32f10x.h"
RTC_InitTypeDef RTC_InitStructure;
RTC_TimeTypeDef RTC_TimeStruct;
USART_InitTypeDef USART_InitStructure;
void RTC_Configuration(void);
void USART_Configuration(void);
void NVIC_Configuration(void);
void RTC_IRQHandler(void);
void USART1_IRQHandler(void);
int main(void)
{
RTC_Configuration();
USART_Configuration();
NVIC_Configuration();
while (1)
{
// 等待秒中断
}
}
void RTC_Configuration(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
PWR_BackupAccessCmd(ENABLE);
RCC_LSEConfig(RCC_LSE_ON);
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
RCC_RTCCLKCmd(ENABLE);
RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
RTC_InitStructure.RTC_SynchPrediv = 0xFF;
RTC_Init(&RTC_InitStructure);
RTC_ITConfig(RTC_IT_SEC, ENABLE);
RTC_WaitForSynchro();
}
void USART_Configuration(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
USART_Cmd(USART1, ENABLE);
}
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_Init(&NVIC_InitStructure);
}
void RTC_IRQHandler(void)
{
if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
{
RTC_ClearITPendingBit(RTC_IT_SEC);
RTC_GetTime(RTC_Format_BIN, &RTC_TimeStruct);
char time[9];
sprintf(time, "%02d:%02d:%02d", RTC_TimeStruct.RTC_Hours, RTC_TimeStruct.RTC_Minutes, RTC_TimeStruct.RTC_Seconds);
USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
USART_SendData(USART1, time[0]);
}
}
void USART1_IRQHandler(void)
{
if (USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
{
static uint8_t i = 1;
if (i < 9)
{
USART_SendData(USART1, time[i]);
i++;
}
else
{
i = 1;
USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
}
}
}
此程序初始化了RTC和USART1,并启用了秒中断。每当秒中断触发时,程序将读取RTC时间并将其转换为字符串格式。然后,程序将字符串发送到USART1接口。USART1发送数据时,USART1_IRQHandler将被触发。在这个中断处理程序中,程序将字符串的每个字符逐个发送到USART1接口,直到整个字符串发送完毕。
原文地址: http://www.cveoy.top/t/topic/bDVD 著作权归作者所有。请勿转载和采集!