【WCH】STM32F103转CH32F203工程驱动DS1302案例
- 相关篇《STM32基于标准库工程驱动DS1302》
- 《关于CH32F203程序下载方式说明》
- 有关CH32F203资料手册以及SDK资料:
https://www.wch.cn/products/CH32F103.html
- 《【WCH】基于STM32F1标准库程序烧录到CH32F203中运行方法》
- ✨本文仅对驱动DS1302内容案例进行移植说明,有关STM32F103转CH32F203工程请查看上面的相关篇内容。
- ⚡从STM32F103工程移植到CH32F203时钟频率在
system_stm32f10x.c
文件中新增了CH32的96MHz的相关时钟配置参数。

#elif defined SYSCLK_FREQ_96MHz
static void SetSysClockTo96(void)
{
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
RCC->CR |= ((uint32_t)RCC_CR_HSEON);
do
{
HSEStatus = RCC->CR & RCC_CR_HSERDY;
StartUpCounter++;
}
while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
if((RCC->CR & RCC_CR_HSERDY) != RESET)
{
HSEStatus = (uint32_t)0x01;
}
else
{
HSEStatus = (uint32_t)0x00;
}
if(HSEStatus == (uint32_t)0x01)
{
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE_HSE | RCC_CFGR_PLLMULL12);
RCC->CR |= RCC_CR_PLLON;
while((RCC->CR & RCC_CR_PLLRDY) == 0)
{
}
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
while((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
{
}
}
else
{
}
}
main主程序代码
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "DS1302.h"
int main(void)
{
DS1302_Time_t time = {0};
const char *WEEK[7] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
DS1302_Init();
while (1)
{
DS1302_GetTime(&time);
printf("Current Time: %02d-%02d-%02d %02d:%02d:%02d T:%s\r\n", time.year, time.month, time.day, time.hour, time.minute, time.second,WEEK[time.week-1]);
delay_ms(2000);
delay_ms(2000);
}
}
DS1302驱动代码
- 驱动代码依旧是原来使用STM32的代码,没有做任何修改。
- DS1302.c文件
#include "DS1302.h"
#include "delay.h"
#include "usart.h"
#define DS1302_SEC_ADDR 0x80
#define DS1302_MIN_ADDR 0x82
#define DS1302_HOUR_ADDR 0x84
#define DS1302_DAY_ADDR 0x86
#define DS1302_MONTH_ADDR 0x88
#define DS1302_WEEK_ADDR 0x8a
#define DS1302_YEAR_ADDR 0x8c
#define DS1302_CONTROL_ADDR 0x8e
#define DS1302_CHARGER_ADDR 0x90
#define DS1302_CLKBURST_ADDR 0xbe
static u8 time_buf[8] = {0x20,0x23,0x04,0x14,0x11,0x22,0x10,0x06};
u8 sec_buf=0;
u8 sec_flag=0;
void DS1302_Init()
{
RCC->APB2ENR |= 1<<2;
GPIOA->CRL &= 0X000FFFFF;
GPIOA->CRL |= 0X33300000;
GPIOA->ODR |=1<<6;
}
void DS1302_WriteByte(u8 addr,u8 data)
{
u8 i;
DS1302_RST=0;
DS1302_CLK=0;
DS1302_RST=1;
DS1302_OutPut_Mode();
addr=addr&0xFE;
for(i=0;i<8;i++)
{
if (addr&0x01) DS1302_OUT=1;
else DS1302_OUT=0;
DS1302_CLK=1;
DS1302_CLK=0;
addr=addr>>1;
}
for (i=0;i<8;i++)
{
if(data&0x01) DS1302_OUT=1;
else DS1302_OUT=0;
DS1302_CLK=1;
DS1302_CLK=0;
data = data >> 1;
}
DS1302_CLK=1;
DS1302_RST=0;
}
u8 DS1302_ReadByte(u8 addr)
{
u8 i,temp;
DS1302_RST=0;
DS1302_CLK=0;
DS1302_RST=1;
DS1302_OutPut_Mode();
addr=addr|0x01;
for(i=0;i<8;i++)
{
if (addr&0x01) DS1302_OUT=1;
else DS1302_OUT=0;
DS1302_CLK=1;
DS1302_CLK=0;
addr = addr >> 1;
}
DS1302_InPut_Mode();
for(i=0;i<8;i++)
{
temp=temp>>1;
if (DS1302_IN) temp|=0x80;
else temp&=0x7F;
DS1302_CLK=1;
DS1302_CLK=0;
}
DS1302_CLK=1;
DS1302_RST=0;
return temp;
}
void DS1302_WriteTime()
{
DS1302_WriteByte(DS1302_CONTROL_ADDR,0x00);
DS1302_WriteByte(DS1302_SEC_ADDR,0x80);
DS1302_WriteByte(DS1302_YEAR_ADDR,time_buf[1]);
DS1302_WriteByte(DS1302_MONTH_ADDR,time_buf[2]);
DS1302_WriteByte(DS1302_DAY_ADDR,time_buf[3]);
DS1302_WriteByte(DS1302_HOUR_ADDR,time_buf[4]);
DS1302_WriteByte(DS1302_MIN_ADDR,time_buf[5]);
DS1302_WriteByte(DS1302_SEC_ADDR,time_buf[6]);
DS1302_WriteByte(DS1302_WEEK_ADDR,time_buf[7]);
DS1302_WriteByte(DS1302_CHARGER_ADDR,0xA5);
DS1302_WriteByte(DS1302_CONTROL_ADDR,0x80);
}
void DS1302_ReadTime(void)
{
time_buf[1]=DS1302_ReadByte(DS1302_YEAR_ADDR);
time_buf[2]=DS1302_ReadByte(DS1302_MONTH_ADDR);
time_buf[3]=DS1302_ReadByte(DS1302_DAY_ADDR);
time_buf[4]=DS1302_ReadByte(DS1302_HOUR_ADDR);
time_buf[5]=DS1302_ReadByte(DS1302_MIN_ADDR);
time_buf[6]=(DS1302_ReadByte(DS1302_SEC_ADDR))&0x7f;
time_buf[7]=DS1302_ReadByte(DS1302_WEEK_ADDR);
}
void DS1302_GetTime(DS1302_Time_t* time)
{
DS1302_ReadTime();
time->year=(time_buf[0]>>4)*1000+(time_buf[0]&0x0F)*100+(time_buf[1]>>4)*10+(time_buf[1]&0x0F);
time->month=(time_buf[2]>>4)*10+(time_buf[2]&0x0F);
time->day=(time_buf[3]>>4)*10+(time_buf[3]&0x0F);
time->hour=(time_buf[4]>>4)*10+(time_buf[4]&0x0F);
time->minute=(time_buf[5]>>4)*10+(time_buf[5]&0x0F);
time->second=(time_buf[6]>>4)*10+(time_buf[6]&0x0F);
time->week=(time_buf[7]&0x0F);
}
#ifndef _DS1302_H
#define _DS1302_H
#include "stm32f10x.h"
#include "sys.h"
#define DS1302_OutPut_Mode() {GPIOA->CRL &= 0xF0FFFFFF;GPIOA->CRL |= 0x03000000;}
#define DS1302_InPut_Mode() {GPIOA->CRL &= 0xF0FFFFFF;GPIOA->CRL |= 0x08000000;}
#define DS1302_IN PAin(6)
#define DS1302_OUT PAout(6)
#define DS1302_RST PAout(5)
#define DS1302_CLK PAout(7)
typedef struct TIMEData
{
u16 year;
u8 month;
u8 day;
u8 hour;
u8 minute;
u8 second;
u8 week;
}DS1302_Time_t;
void DS1302_Init(void);
void DS1302_WriteByte(u8 addr,u8 data);
u8 DS1302_ReadByte(u8 addr);
void DS1302_WriteTime(void);
void DS1302_ReadTime(void);
void DS1302_GetTime(DS1302_Time_t* time);
#endif
工程源码
链接: https:
提取码: pden