基于ARM的时钟闹钟设计Word格式文档下载.docx

上传人:b****6 文档编号:20293038 上传时间:2023-01-21 格式:DOCX 页数:20 大小:99.33KB
下载 相关 举报
基于ARM的时钟闹钟设计Word格式文档下载.docx_第1页
第1页 / 共20页
基于ARM的时钟闹钟设计Word格式文档下载.docx_第2页
第2页 / 共20页
基于ARM的时钟闹钟设计Word格式文档下载.docx_第3页
第3页 / 共20页
基于ARM的时钟闹钟设计Word格式文档下载.docx_第4页
第4页 / 共20页
基于ARM的时钟闹钟设计Word格式文档下载.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

基于ARM的时钟闹钟设计Word格式文档下载.docx

《基于ARM的时钟闹钟设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于ARM的时钟闹钟设计Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。

基于ARM的时钟闹钟设计Word格式文档下载.docx

(2)32位的可编程计数器,可用于长程时间段的测量。

(3)两个单独的时钟:

用于APB1接口的PLCK1和RTC时钟(此时RTC时钟的频率必须小于PCLK1时钟的四分之一以上)。

(4)可以选择一下三种RTC的时钟源:

HSE(highspeedexternal)时钟除以128,即高速外部时钟,接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4~16MHz。

LSI(lowspeedinternal)振荡器时钟,即低速内部时钟,频率为40kHz。

LSE(lowspeedexternal)振荡器时钟,即低速外部时钟,接石英晶体,频率为32.768kHz。

(5)2钟独立的复位类型:

APB1接口由系统复位。

RTC核(预分频器、闹钟、计数器和分频器)只能由备份域复位。

(6)3个专门的可屏蔽中断:

闹钟中断,用来产生一个软件可编程的闹钟中断。

秒中断,用来产生一个可编程的周期性中断信号(最长可达1s)。

溢出中断,检测内部可编程计数器溢出并回转为0的状态。

3总体设计框图

本电路主要由3大部分电路组成:

ARM最小系统电路、时钟显示电路和闹钟警报电路(本设计用LED灯指示)。

其中ATM最小系统主要由复位电路和时钟电路组成。

在该设计中,闹钟提醒由LED灯代替,当闹钟时间到的话,LED灯亮,延时设定的时间后自动关闭。

总体设计方框图,如图1所示。

STM32

液晶显示电路

复位电路

闹铃提醒电路

时钟电路

图1总体设计方框图

4硬件电路

该设计分为软件设计和硬件设计两大模块,硬件电路由ARM最小系统电路、时钟显示电路和闹钟提醒电路组成。

4.1STM32芯片管脚介绍

STM32F103R6T6管脚示意图,如图2所示。

图2STM32F103R6T6管脚示意图

4.2STM32复位和时钟电路设计

此电路主要是复位电路和时钟电路两部分,其中复位电路采用按键手动复位和上电自动复位组合,电路如图2(右)所示:

其中7脚为STM32的复位端。

时钟电路如图2(左)所示:

晶振采用的是8MHz和32.786KHz,8MKz分别接STM32的5脚和6脚,32.786KHz分别接STM32的3脚和4脚。

图3STM32复位和时钟电路

4.3闹钟提醒电路

本设计的闹钟提醒电路没有采用蜂鸣器,为了调试方便用实验板上的发光二极管LED1—LED4指示,其与实验板对应接口为PC0—PC3。

电路如图4所示。

图4闹钟提醒电路

5程序流程图

5.1主程序流程图

主程序流程图,如图5所示。

图5主程序流程图

5.2中断程序流程图

中断程序流程图,如图6所示。

图6中断程序流程图

6总结与体会

通过这次时钟的设计,使我对ARM有了更深的理解。

刚开始拿到题提目,我先是查找相关资料,从图书馆和网上找到相关的课题,参考借鉴别人的设计,从而理清我们设计的思路。

此次作业设计大致可以分为两部分,电路图部分和程序编程部分,其中最有难度的是程序的编写与调试。

在编写程序的过程中,我遇到了各种各样的问题,工程之间的结合,对于其中的错误怎样解决,需要配置什么,更改哪里等等。

对于ARM我学的很浅,编程遇到问题不知道如何解决,我知道这个是我的弱点,但在这两周的课程设计中,用KeiluVision4在ARM开发板上进行程序调试,遇到问题解决问题,在这个过程中我收获了不少。

参考文献

[1]彭刚、秦志强等.基于ARMCortex-M3的STM32系列嵌入式微控制器应用实践[M].北京:

电子工业出版社

[2]李宁.基于MDK的STM32处理器开发应用[M].北京航空航天大学出版社,2008.

[3]王永红、徐炜、赫立平.STM32系列ARMCortex-M3微控制器原理与实践[M].北京航空航天大学出版社,2008.

[4]ARMLimited.Cortex-M3TechnicalReferenceManual(r2p0).ARMDDI0037G2008.

[5]

附录

1总体电路图

2串口助手演示效果

3源程序

/*

*函数名:

NVIC_Configuration

*描述:

配置RTC秒中断的主中断优先级为1,次优先级为0

*输入:

*输出:

*调用:

外部调用

*/

voidNVIC_Configuration(void)

{

NVIC_InitTypeDefNVIC_InitStructure;

/*Configureonebitforpreemptionpriority*/

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

/*EnabletheRTCInterrupt*/

NVIC_InitStructure.NVIC_IRQChannel=RTC_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;

NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&

NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel=RTCAlarm_IRQn;

NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;

}

GPIO_Configuration

配置GPIO

voidGPIO_Configuration(void)

{

/*定义一个GPIO_InitTypeDef类型的结构体*/

GPIO_InitTypeDefGPIO_InitStructure;

/*开启GPIOC的外设时钟*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

/*选择要控制的GPIOC引脚*/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;

/*设置引脚模式为通用推挽输出*/

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

/*设置引脚速率为50MHz*/

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

/*调用库函数,初始化GPIOC*/

GPIO_Init(GPIOC,&

GPIO_InitStructure);

GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);

RTC_Configuration

配置RTC

voidRTC_Configuration(void)

/*EnablePWRandBKPclocks*/

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);

/*AllowaccesstoBKPDomain*/

PWR_BackupAccessCmd(ENABLE);

/*ResetBackupDomain*/

BKP_DeInit();

/*EnableLSE*/

RCC_LSEConfig(RCC_LSE_ON);

/*WaittillLSEisready*/

while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET)

{}

/*SelectLSEasRTCClockSource*/

RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

/*EnableRTCClock*/

RCC_RTCCLKCmd(ENABLE);

/*WaitforRTCregisterssynchronization*/

RTC_WaitForSynchro();

/*WaituntillastwriteoperationonRTCregistershasfinished*/

RTC_WaitForLastTask();

/*EnabletheRTCSecond*/

RTC_ITConfig(RTC_IT_SEC,ENABLE);

RTC_ITConfig(RTC_IT_ALR,ENABLE);

/*SetRTCprescaler:

setRTCperiodto1sec*/

RTC_SetPrescaler(32767);

/*RTCperiod=RTCCLK/RTC_PR=(32.768KHz)/(32767+1)*/

Time_Regulate

返回用户在超级终端中输入的时间值,并将值储存在

*RTC计数寄存器中。

用户在超级终端中输入的时间值,单位为s

内部调用

uint32_tTime_Regulate(void)

uint32_tTmp_HH=0xFF,Tmp_MM=0xFF,Tmp_SS=0xFF;

printf("

\r\n==============TimeSettings====================================="

);

\r\nPleaseSetHours"

while(Tmp_HH==0xFF)

{

Tmp_HH=USART_Scanf(23);

}

:

%d"

Tmp_HH);

\r\nPleaseSetMinutes"

while(Tmp_MM==0xFF)

Tmp_MM=USART_Scanf(59);

Tmp_MM);

\r\nPleaseSetSeconds"

while(Tmp_SS==0xFF)

Tmp_SS=USART_Scanf(59);

Tmp_SS);

/*ReturnthevaluetostoreinRTCcounterregister*/

return((Tmp_HH*3600+Tmp_MM*60+Tmp_SS));

Time_Adjust

时间调节

voidTime_Adjust(void)

{//uint32_tAAAA;

//AAAA=Time_Regulate();

/*Changethecurrenttime*/

RTC_SetCounter(Time_Regulate());

RTC_SetAlarm(Time_Regulate());

Time_Display

显示当前时间值

-TimeVarRTC计数值,单位为s

*/

voidTime_Display(uint32_tTimeVar)

uint32_tTHH=0,TMM=0,TSS=0;

/*Computehours*/

THH=TimeVar/3600;

/*Computeminutes*/

TMM=(TimeVar%3600)/60;

/*Computeseconds*/

TSS=(TimeVar%3600)%60;

Time:

%0.2d:

%0.2d:

%0.2d\r"

THH,TMM,TSS);

Time_Show

在超级终端中显示当前时间值

voidTime_Show(void)

\n\r"

/*Infiniteloop*/

while

(1)

/*If1shaspaased*/

if(TimeDisplay==1)

/*Displaycurrenttime*/

Time_Display(RTC_GetCounter());

TimeDisplay=0;

USART_Scanf

串口从超级终端中获取数值

-value用户在超级终端中输入的数值

uint8_tUSART_Scanf(uint32_tvalue)

uint32_tindex=0;

uint32_ttmp[2]={0,0};

while(index<

2)

/*LoopuntilRXNE=1*/

while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET)

tmp[index++]=(USART_ReceiveData(USART1));

//从串口终端里面输进去的数是ASCII码值

if((tmp[index-1]<

0x30)||(tmp[index-1]>

0x39))

\n\rPleaseentervalidnumberbetween0and9"

index--;

/*CalculatetheCorrespondingvalue*/

index=(tmp[1]-0x30)+((tmp[0]-0x30)*10);

/*Checks*/

if(index>

value)

\n\rPleaseentervalidnumberbetween0and%d"

value);

return0xFF;

returnindex;

/**************************************************************************/

/*STM32F10xPeripheralsInterruptHandlers*/

/*AddheretheInterruptHandlerfortheusedperipheral(s)(PPP),forthe*/

/*availableperipheralinterrupthandler'

snamepleaserefertothestartup*/

/*file(startup_stm32f10x_xx.s).*/

/*************************************************************************/

/**

*@briefThisfunctionhandlesRTCglobalinterruptrequest.

*@paramNone

*@retval:

None

voidRTC_IRQHandler(void)

if(RTC_GetITStatus(RTC_IT_SEC)!

=RESET)

{

/*CleartheRTCSecondinterrupt*/

RTC_ClearITPendingBit(RTC_IT_SEC);

/*ToggleGPIO_LEDpin6each1s*/

//GPIO_WriteBit(GPIO_LED,GPIO_Pin_6,(BitAction)(1-GPIO_ReadOutputDataBit(GPIO_LED,GPIO_Pin_6)));

/*Enabletimeupdate*/

TimeDisplay=1;

/*WaituntillastwriteoperationonRTCregistershasfinished*/

RTC_WaitForLastTask();

/*ResetRTCCounterwhenTimeis23:

59:

59*/

if(RTC_GetCounter()==0x00015180)

RTC_SetCounter(0x0);

}

if(RTC_GetITStatus(RTC_IT_ALR)!

=RESET)

{

RTC_ClearITPendingBit(RTC_IT_ALR);

printf("

\r\nRTCalarmbegin!

"

GPIO_ResetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);

Delay_nms(3000);

GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);

Delay_nus(int16)

微秒级延时n<

32767

voidDelay_nus(u16n)

u16j;

while(n--)

j=8;

while(j--);

/***************************************************************************/

Delay_nms(int16)

毫秒级延时n<

voidDelay_nms(u16n)

Delay_nus(1100);

/***********************《嵌入式系统》课程设计报告*************************

*文件名:

main.c

*描述:

利用STM32的RTC实现一个简易的电子时钟。

在串口助手中显示时间值。

*显示格式为Time:

XX:

XX:

XX(时:

分:

秒),当时间

*计数为:

23:

59:

59时将刷新为:

00:

00。

*另外还能设置闹钟

****************************基于ARM的时钟系统****************************/

intmain(void)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 成人教育 > 成考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1