演示PY32F030K28自帶RTC并驅動LED數碼顯示時鐘。
/**
******************************************************************************
* 文件名程: main.c
* 作 者: 東莞鄧凱哥
* 功 能: 主函數
* 硬 件: PY32F030K28-StartKit-V0.1
* 說明:數碼管顯示RTC時鐘DEMO
* 軟件版本 V0.0.1(2024/4/16 16:02)
******************************************************************************
**/
#include "main.h"
#include "rtc.h"
#include "rcc.h"
#include "led.h"
#include "usart.h"
#include "timepare.h"
/* Private variables ---------------------------------------------------------*/
const uint8_t dispArr[] = {LL_LED_DISP_0, LL_LED_DISP_1, LL_LED_DISP_2, LL_LED_DISP_3, LL_LED_DISP_4, \
LL_LED_DISP_5, LL_LED_DISP_6, LL_LED_DISP_7, LL_LED_DISP_8, LL_LED_DISP_9
};
static uint8_t dotdis = 0 ;
/******************************************************************************
**函數信息 :System_Tick(uint32_t Ticks)
**功能描述 :系統嘀嗒時鐘配置
**輸入參數 :Ticks 頻率
**輸出參數 :無
**說 明 :
******************************************************************************/
void System_Tick(uint32_t Ticks)
{
SysTick->LOAD = (uint32_t)((SystemCoreClock / Ticks) - 1UL); /* set reload register */
SysTick->VAL = 0UL; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /* Enable the Systick Timer */
}
/******************************************************************************
**函數信息 :main()
**功能描述 :主函數
**輸入參數 :無
**輸出參數 :無
**說 明 :
******************************************************************************/
int main(void)
{
/* 配置系統時鐘 */
APP_RCC_Config();
/* 配置USART1相關參數 */
APP_USART1_Config();
/* 配置LED相關參數 */
APP_LED_Config();
/* 配置RTC相關參數 */
APP_RTC_Config();
/* 設置RTC時間 */
SET_RTC_Time(8,14,23);
/* 開啟系統嘀嗒定時器 */
System_Tick(1000);
while (1)
{
if( TimePare.Tim1ms_flag == 1 ) //1ms任務
{
TimePare.Tim1ms_flag = 0;
if( ++TimePare.Tim10ms_count >= 10 )
{
TimePare.Tim10ms_count = 0;
TimePare.Tim10ms_flag = 1;
}
if( ++TimePare.Tim50ms_count >= 50 )
{
TimePare.Tim50ms_count = 0;
TimePare.Tim50ms_flag = 1;
}
}
if( TimePare.Tim10ms_flag == 1 ) //10ms 任務
{
TimePare.Tim10ms_flag = 0;
if( ++TimePare.Tim100ms_count >= 10 )
{
TimePare.Tim100ms_count = 0;
TimePare.Tim100ms_flag = 1;
}
if( ++TimePare.Tim200ms_count >= 20 )
{
TimePare.Tim200ms_count = 0;
TimePare.Tim200ms_flag = 1;
}
}
if( TimePare.Tim50ms_flag == 1 ) //50ms 任務
{
TimePare.Tim50ms_flag = 0;
}
if( TimePare.Tim100ms_flag == 1 ) //100ms 任務
{
TimePare.Tim100ms_flag = 0;
if( ++TimePare.Tim500ms_count >= 5 )
{
TimePare.Tim500ms_count = 0;
TimePare.Tim500ms_flag = 1;
}
}
if( TimePare.Tim200ms_flag == 1 ) //200ms 任務
{
TimePare.Tim200ms_flag = 0;
}
if( TimePare.Tim500ms_flag == 1 ) //500ms 任務
{
dotdis ++;
APP_UpadateRtcTimeStruct();
//顯示RTC時鐘
LL_LED_SetDisplayValue(LED, LL_LED_COM0, dispArr[ RTC_TimeStruct.hour /10]);
// if( dotdis / 2 ) //常規的方法,用除法
if( dotdis >> 1 ) //更高效的方法,用移位
{
dotdis = 0;
LL_LED_SetDisplayValue(LED, LL_LED_COM1, dispArr[ RTC_TimeStruct.hour %10] | LL_LED_DISP_DOT ); //時鐘點閃爍
}else{
LL_LED_SetDisplayValue(LED, LL_LED_COM1, dispArr[ RTC_TimeStruct.hour %10] );
}
LL_LED_SetDisplayValue(LED, LL_LED_COM2, dispArr[ RTC_TimeStruct.min /10]);
LL_LED_SetDisplayValue(LED, LL_LED_COM3, dispArr[ RTC_TimeStruct.min %10]);
TimePare.Tim500ms_flag = 0;
if( ++TimePare.Tim1s_count >= 2 )
{
TimePare.Tim1s_count = 0;
TimePare.Tim1s_flag = 1;
}
}
if( TimePare.Tim1s_flag == 1 ) //1000ms 任務
{
printf("Hours = %02d, Min = %02d, Sec = %02d\r\n",\
RTC_TimeStruct.hour, RTC_TimeStruct.min, RTC_TimeStruct.sec); //串口打印 時,分,秒
TimePare.Tim1s_flag = 0;
}
}
}
/**
* @brief 錯誤執行函數
* @param 無
* @retval 無
*/
void APP_ErrorHandler(void)
{
/* 無限循環 */
while (1)
{
}
}
#ifdef USE_FULL_ASSERT
/**
* @brief 輸出產生斷言錯誤的源文件名及行號
* @param file:源文件名指針
* @param line:發生斷言錯誤的行號
* @retval 無
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* 用戶可以根據需要添加自己的打印信息,
例如: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* 無限循環 */
while (1)
{
}
}
#endif /* USE_FULL_ASSERT */
程序和PDF格式的原理圖:
01.7z
(1.07 MB, 下載次數: 5)
2024-9-9 01:39 上傳
點擊文件名下載附件
|