基于STM32的TFT指针式时钟
stm32单片机时钟
stm32单⽚机时钟stm32 单⽚机时钟学习以及分析1 引⾔:单⽚机(Microcontrollers),采⽤超⼤规模集成电路技术把具有数据处理能⼒的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O⼝和中断系统、定时器/计数器等功能(可能还包括显⽰驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到⼀块硅⽚上构成的⼀个⼩⽽完善的微型计算机系统,在⼯业控制领域⼴泛应⽤。
单⽚机时钟可以说如同⼈的⼼脏那样重要,我们在⼼脏的搏动下进⾏⾃⼰的⽣命活动,同样的单⽚机在时钟下进⾏⾃⼰的控制活动。
2 时钟的分类:单⽚机的时钟分为内部时钟与外部时钟:⼀般⽽⾔,内部时钟集成在芯⽚内部(RC振荡电路),其精度⽐较低;外部时钟,顾名思义,存在于芯⽚外部(晶体或陶瓷谐振器),可以为系统提供精确的时钟。
晶振是给单⽚机提供⼯作信号脉冲的,如图所⽰的为外部晶振,频率为4MHz,我们常⽤的晶振频率为12MHz,单⽚机⼯作时,是⼀条⼀条地从RoM中取指令,然后⼀步⼀步地执⾏。
单⽚机访问⼀次存储器的时间,称之为⼀个机器周期,这是⼀个时间基准。
—个机器周期包括12个时钟周期。
如果⼀个单⽚机选择了12MHz晶振,它的时钟周期是1/12us,它的⼀个机器周期是12×(1/12)us,也就是1us。
有些晶振的频率并数是整数,如:11.0592MHz的晶振。
单⽚机在进⾏串⾏通信时,常⽤的波特率为1200,2400,4800,9600,115200等,为了适应单⽚机的串⼝通讯波特率的计算⽽来的。
⽤11.0592MHz晶振经过相应的分频或者倍频后刚好能够得出⼀个整数的波特率,这样在上位机和下位机的同步⽅⾯⽐较⽅便。
3 stm32的时钟来源这⾥以stm32f1系列的芯⽚为例。
由上⾯可知,系统的时钟来源有内部时钟与外部时钟,详细的来说stm32f1有五个时钟源:HSI(⾼速内部时钟)HSE(⾼速外部时钟)LSI(低速内部时钟)LSE(低速外部时钟)PLL(锁相环倍频输出)每⼀个时钟都可以独⽴的开启与关闭。
(1)STM32?RTC?基于time.h(TFT)的时钟实现
(1)STM32 RTC 基于time.h(TFT)的时钟实现头文件”time.h”下的函数:Clocl_t 和tine_t 都可以将系统的时间和日期标示为长整形。
结构类型 tm 保存分解的日期和时间元素。
Tm的结构定义如下:struct tm{int tm_sec;int tm_min;int tm_hour;int tm_mday;int tm_mon;int tm_year;int tm_wday;int tm_yday;int tm_isdst;};1.函数名称: localtime函数形式: struct tm *localtime(const time_t *time)函数功能:返回一个指向分解形式的 time 的 tm结构的指针(表示为当地时间)Timer的值由调用 time()函数获得2.函数名称: asctime函数原型: char * asctime(struct tm * ptr)函数功能: 得到机器时间(日期时间转换为 ASCII 码)函数返回: 返回的时间字符串格式为:星期,月,日,小时:分:秒,年参数说明: 结构指针ptr应通过函数 localtime()和 gmtime()得到3.函数名称: ctime函数原型: char *ctime(long *time)函数功能: 得到日历时间返回字符串格式:day month data hours:minute:seconds year\n\0Ctime()等价于 asctime(localtime(ctime))4.函数名称: difftime函数原型: double difftime(time_t time2, time_t time1)函数功能: 得到两次机器时间差,单位为秒5.函数名称: time函数原型: time_t time(time_t *time)函数功能: 得到机器的日历时间或者设置日历时间6.函数名称: clock函数原型: clock_t clock( )函数功能:返回调用时间已经运行时间的近似值,用 CLK_TCK除以该值,便将其转换成秒7.函数名称 mktime函数原型: time_t mktime(struct tm *time)函数功能:返回和 time 所指向的结构中时间表示等效的历时,用于初始化系统时间8.函数名 setlocale函数原型: char *setlocale(int category,char *locale)函数功能: 允许用户查询或设置某些参数。
stm32如何配置时钟
学习STM32笔记2 如何配置时钟学习STM32笔记2 如何配置时钟/*************************************************************该程序目的是用于测试核心板回来后是否能正常工作。
包括两个按键、两个LED现实。
按键为PC4、PC5,LED为PA0\PA1。
LED为低电平时点亮。
按键为低电平时触发。
************************************************************/#i nclude "stm32f10x_lib.h"void RCC_Configuration(void);//设置系统主时钟void GPIO_Configuration(void);//设置邋邋IO参数void NVIC_Configuration(void);//设置中断表地址void delay(void);//延时函数int main(void){#ifdef DEBUGdebug();#endifRCC_Configuration();NVIC_Configuration();GPIO_Configuration();while (1){delay();//设置指定的数据端口位GPIO_SetBits(GPIOA,GPIO_Pin_0);//设置指定的数据端口位delay();GPIO_ResetBits(GPIOA,GPIO_Pin_0);//清除指定的数据端口位GPIO_SetBits(GPIOA,GPIO_Pin_1);delay();GPIO_ResetBits(GPIOA,GPIO_Pin_1);delay();/*********************************************使用setbits 与resetbits 是比较简单,其实还是可以使用其它函数。
6.3 STM32的时钟深入剖析(32M,40M,72M灵活切换)
率不再有固定的关系,下面来详细解析 STM32 微控制器的时钟树。下图是 STM32 微控制 器的时钟树:
下表是结合图表明出来的: 标号
释义
1
内部低速振荡器(LSI,40Khz)
2
外部低速振荡器(LSE,32.768Khz)
6.1.4 例程01 STM32芯片32MHZ频率下跑点灯程序
1. 示例简介
我们先用一根杜邦线将 P0.0(PB8)和 JP19 上的 1 脚连起来(其实,连 JP19 上的任意一脚都可)。点灯程序在时钟主频 32MHz 下面运行,LED 灯的正极接的是
3.3V 电源,所以我们编程让 LED 负极拉低即 GPIO 引脚端口 B 的管脚 8 拉低,即 PB8 拉低,那么 LED 灯就会变亮,相关电路图如下图所示:
6.1.2 STM32的时钟
系统时钟的选择是在启动时进行,复位时内部 8MHZ 的 RC 振荡器被选为默认的 CPU 时钟,随后可以选择外部的、具失效监控的 4-16MHZ 时钟;当检测到外部时钟失效时,它 将被隔离,系统将自动地切换到内部的 RC 振荡器。
在 STM32 中,有五个时钟源,为 HSI、HSE、LSI、LSE、PLL,它们都是时钟所提供 的来源: 1. HSI 是高速内部时钟,RC 振荡器,频率默认为 8MHz,可以从 STM32 时钟树中看到
而“分支”很显然是最终的外部设备比如通用输入输出设备(GPIO)。这样可以轻易找出第
一条时钟的“脉络”:
3——5——7——21——8——9——11——13
对此条时钟路径做如下解析:
对于 3,首先是外部的 3-25MHz(前文已假设为 8MHz)输入;
stm32的时钟配置(非常详细)
stm32的时钟配置(⾮常详细)⼤家都知道在使⽤单⽚机时,时钟速度决定于外部晶振或内部RC振荡电路的频率,是不可以改变的。
⽽ARM的出现打破了这⼀传统的法则,可以通过软件随意改变时钟速度。
这⼀出现让我们的设计更加灵活,但是也给我们的设计增加了复杂性。
为了让⽤户能够更简单的使⽤这⼀功能,STM32的库函数已经为我们设计的更加简单⽅便。
在⽐较靠前的版本中,我们需要向下⾯那样设置时钟:ErrorStatus HSEStartUpStatus;void RCC_Configuration(void){RCC_DeInit(); // RCC system reset(for debug purpose)RCC_HSEConfig(RCC_HSE_ON); // Enable HSEHSEStartUpStatus = RCC_WaitForHSEStartUp(); // Wait till HSE is readyif (HSEStartUpStatus == SUCCESS) // 当HSE准备完毕切振荡稳定后{RCC_HCLKConfig(RCC_SYSCLK_Div1); // HCLK = SYSCLKRCC_PCLK2Config(RCC_HCLK_Div1); // PCLK2 = HCLKRCC_PCLK1Config(RCC_HCLK_Div2); // PCLK1 = HCLK/2FLASH_SetLatency(FLASH_Latency_2); // Flash 2 wait stateFLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // Enable Prefetch BufferRCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); // PLLCLK = 8MHz * 9 = 72 MHzRCC_PLLCmd(ENABLE); // Enable PLLwhile(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){; // Wait till PLL is ready}RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // Select PLL as system clock sourcewhile (RCC_GetSYSCLKSource() != 0x08) // Wait till PLL is used as system clock source {;}}}随之函数库的不断升级,到3.0以上时,我们就不⽤再这样编写时钟设置了,我们只要做如下两部即可:第⼀个: system_stm32f10x.c 中 #define SYSCLK_FREQ_72MHz 72000000第⼆个:调⽤SystemInit()说明:在stm32固件库3.0中对时钟频率的选择进⾏了⼤⼤的简化,原先的⼀⼤堆操作都在后台进⾏。
一种基于STM32的控制TFT-LCD显示的设计方法
一种基于STM32的控制TFT-LCD显示的设计方法摘要:TFT-LCD 即薄膜晶体管液晶显示器。
其英文全称为: Thin Film Transistor-Liquid CrystalDisplay。
TFT-LCD 与无源TN-LCD、 STN-LCD 的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。
本文设计了一种基于STM32开发板的ILI9341芯片控制液晶屏的方法。
摘要:STM32,LCD, ILI9341,TFT一、开发硬件介绍本设计开发板使用的屏幕是3.2寸TFT液晶彩屏,分辨率为320x240,并使用ILI9341芯片控制液晶屏。
液晶屏的控制芯片内部结构非常复杂,最主要的是位于中间的GRAM(Graphics RAM),可以理解为显存。
GRAM 中每个存储单元都对应着液晶面板的一个像素点。
芯片内部有电路把 GRAM存储单元的数据转化成液晶面板的控制信号,使每个像素点呈现特定的亮度和颜色,这些点组合起来则成为显示界面。
所用液晶屏模块原理图如图所示:从模块接口电路可以看出,LCD采用16位的并方式与外部连接,之所以不采用8位的方式,是因为彩屏的数据量比较大,尤其在显示图片的时候,如果用8位数据线,就会比16位方式慢一倍以上,我们当然希望速度越快越好,所以我们选择16位的接口。
二、用STM32驱动LCDILI9341的 8080 通讯接口时序可以由 STM32 使用普通 I/O 接口进行模拟,但这样效率较低,它提供了一种特别的控制方法——使用FSMC接口。
根据STM32对寻址空间的地址映射,地址0x6000 0000 ~0x9FFF FFFF是映射到外部存储器的,而其中的0x60000000 ~0x6FFF FFFF 则是分配给 NOR FLASH、PSRAM这类可直接寻址的器件。
stm32电子钟设计课程设计报告
成绩课程论文题目:基于STM32的多功能电子时钟学生姓名:梁健学生学号:1008050120系别:电气信息工程系专业:电子信息科学与技术年级:2010级任课教师:郑晓东电气信息工程学院制2013年3月基于stm32的多功能电子时钟学生:梁健指导教师:郑晓东电气信息工程学院电子信息科学与技术专业一、设计任务与要求 (5)1、设计任务 (5)2、设计要求 (5)二、方案设计与论证 (5)1、单片机芯片选择方案 (7)2、显示选择方案 (7)三、硬件单元电路设计与参数计算 (8)1、电源电路 (8)2、按键电路 (8)3、rtc时钟 (9)4、12864显示电路 (9)5、温度传感器模块 (10)四、软件设计与流程图 (10)1、主程序流程图 (10)2、显示子程序流程图 (12)3、按键子程序流程图 (14)五、总原电路及元器件清单 (16)1.总原理图 (16)六、元器件清单 (26)七、主程序 (26)八、参考文献 (30)摘要:本论文基于单片机原理技术介绍了一款于stm32芯片作为核心控制器的单片机数字电子钟的设计与制作,包括硬件电路原理的实现方案设计、软件程序编辑的实现、数字电子钟正常工作的流程、原理图仿真实现、硬件实物的安装制作与硬件实物的调试过程。
该单片机数字电子钟采用stm32自带的RTC,用lLCD12864能够准确显示时间(显示格式为:年月日时分秒),可随时进行时间调整,时间可采用12 小时制显示或24 小时制显示,用12864做成菜单形式,闹铃提醒,可按自己的要求设置扩展的小键盘个数,并增加温度显示。
关键词:单片机、数字电子钟、LCD12864、STM32、RTC,温度传感器一、设计任务与要求1、设计任务用STM32设计一个数字电子钟,采用LCD12864来显示并修改,时间或闹铃。
2、设计要求(1)显示格式为:XX\XX\XX XX\XX\XX 即:年\月\日时\分\秒。
(2)具有闹铃功能。
TFT-LCD的指针式时钟设计
基于T F T-L C D的指针式时钟设计摘要采用单片机与时钟芯片DS1302设计电子时钟时,通常是数字显示,这是由于选用数码管和1602等器件的显示能力有限。
而本次研究所选用TX05D99VM1AAA 模组,该模组实际上是一款手机液晶屏,轻松达到指针式时钟显示要求,在实现精美的指针式时钟的同时,显示年月日等重要信息。
本论文介绍一种基于ATmega128单片机与TFT-LCD显示屏实现指针式时钟显示的方案。
设计介绍了AVR单片机与时钟芯片DS1302和TFT-LCD液晶的接口电路,DS1302写入、读取、驱动以及TFT-LCD相关函数及初始化等的C语言程序。
并简要介绍了AVR单片机、时钟芯片DS1302、TFT液晶,以及AVR单片机的开发工具AVR Studio、ICCAVR和AVRGCC。
本设计集时间、时期、星期于一身,具有读取方便、显示直观、功能多样、电路简洁等优点。
关键词 TFT-LCD;DMAVR-128;DS1302;指针式时钟(小4号宋体,要求3-5个词)TF T-L CD-ba se d Anal og c lo c k de si g nAbstract.Using a single-chip clock chip DS1302 design electronic clock, digital display, which is due to the limited capacity of the display of the selected digital tube and 1602 devices. The TX05D99VM1AAA module, which is actually a mobile phone LCD screen, is easy to reach the pointer style clock display requirements. It also shows the beautiful analog clock and date and other important information.This paper introduces the Analog clock display program based on theATmega128 MCU with TFT-LCD display. The design of the AVR microcontroller and the clock chip DS1302 and TFT-LCD liquid crystal interface circuit, DS1302 write, read, drive and TFT-LCD-related functions, and initialization of C language program. And briefly introduced the AVR microcontroller, the clock chip DS1302, TFT LCD, AVR microcontroller development tools the AVR Studio, ICCAVR, and AVRGCC,. Design set time period, a week in one, with easy to read display and intuitive, versatile, simple circuit.Keywords TFT-LCD;DMAVR-128;DS1302;Analog clock目录第1章绪论 (1)1.1引言 (1)1.2选题背景 (1)第2章指针式时钟显示设计硬件环境简介 (2)2.1 DMAVR-128开发板结构图 (2)2.2 ATmega128简介 (2)2.3 系统设计模块 (5)2.3.1 系统电源模块 (5)2.3.2 单片机及时钟和复位模块 (6)2.3.3 单片机的I/O 接口 (7)2.3.4 蜂鸣器发声模块 (7)2.3.5 DS1302 实时时钟模块 (8)2.3.6 TFT 高质量彩屏液晶显示模块 (8)2.3.7 ISP下载接口和JTAG 调试接口模块 (9)第3章指针式时钟硬件模块设计 (10)3.1 设计要求 (10)3.2硬件设计方案 (10)3.3 关键模块设计 (10)3.3.1 DS1302实时时钟芯片 (10)3.3.2 TFT液晶显示模块 (14)第4章系统软件设计 (17)4.1 软件环境介绍 (17)4.1.1 AVR Studio开发平台 (17)4.1.2 ICCAVR 平台 (17)4.2 DMAVR-128指针式日历时钟程序 (18)4.2.1 程序框图 (18)4.2.2 源程序 (18)4.3 DS1302实时时钟芯片驱动程序 (21)4.3.1 程序框图 (22)4.3.2 源程序 (22)4.4 TFT液晶读写相关函数及初始化函数等 (25)第5章系统调试与注意事项 (35)5.1 调试注意事项 (35)5.1.1 开发板操作规范 (35)5.1.2 开发板供电及设置 (35)5.1.3 开发板测试 (35)5.1.4 ISP 工具使用 (35)5.1.5 JTAGICE 等仿真器工具使用 (35)5.1.6 外设安装 (36)5.2 设计成果展示 (36)结论 (37)致谢 (38)参考文献 (39)附录A 译文 (40)附录B 外文原文 (46)第1章绪论1.1引言随着人们生活水平和工作节奏的提高,传统的时钟已不能满足人们的需求。
STM32单片机对TFTLCD的驱动设计
STM32单片机对TFTLCD的驱动设计STM32单片机对TFTLCD(TFT液晶屏)的驱动设计是一种基于STM32单片机的液晶显示技术。
TFTLCD是一种高分辨率、高色彩鲜艳的显示技术,常用于嵌入式设备的显示界面。
在设计STM32单片机对TFTLCD的驱动时,需要考虑到单片机的硬件资源和软件设计。
一、硬件设计:1.接口设计:根据TFTLCD的规格书,确定TFTLCD的接口类型(如SPI、RGB等),然后根据接口类型选择合适的引脚来连接TFTLCD与STM32单片机。
2.时钟设计:TFTLCD需要一个稳定的时钟信号来提供时序控制,可以使用STM32单片机的定时器来生成时钟信号。
3.电源设计:TFTLCD需要一定的电压供应,可以通过外部的电源模块提供合适的电压给TFTLCD。
二、软件设计:1.初始化:在驱动设计的开始阶段,需要初始化TFTLCD的相关参数,如分辨率、颜色格式等。
2.数据传输:根据TFTLCD的接口类型,使用合适的通信协议进行数据传输。
如果是SPI接口,可以使用STM32的SPI外设来传输数据;如果是RGB接口,可以通过GPIO口来控制数据线的高低电平。
3.显示控制:通过向TFTLCD发送相应的控制指令,来实现对显示内容的控制,如清屏、画点、画线、显示图像等。
4.刷新机制:TFTLCD的驱动需要实现刷新机制,即在TFTLCD的刷新周期内,不断向TFTLCD发送新的数据。
可以使用双缓冲机制,先将数据写入一个缓冲区,再将缓冲区的数据一次性发送给TFTLCD,以提高刷新效率。
在STM32单片机对TFTLCD的驱动设计中,需要根据具体的TFTLCD型号和规格书来进行具体的硬件和软件设计。
每个TFTLCD的驱动设计都是独特的,需要根据具体的需求和要求来进行设计。
同时,也需要根据单片机的性能和资源来进行合理的设计,以确保驱动的效率和稳定性。
总结来说,STM32单片机对TFTLCD的驱动设计需要同时考虑硬件和软件的设计。
STM32直接驱动RGB接口的TFT数字彩屏设计
STM32直接驱动RGB接口的TFT数字彩屏设计摘要:随着LCD 显示技术的迅速发展,LCD 显示屏得到了广泛的应用。
一般来说,对于RGB 总线接口的数字屏都需要有控制器才能正常显示,但是本文利用STM32 处理器设计出了一种能直接挂载RGB 接口数字屏的方法。
实际应用验证了该CPU 有足够的时间来处理用户程序,一般中低端的CPU 很难做到这一点。
本方案能成功应用在电脑横机的人际界面显示中,主要得益于STM32 的强大功能:DMA 传输以及高级定时器等的应用。
本方案降低了产品的硬件成本。
关键词:TFT;DMA;FSMC;定时器;STM32F103VCT6;电脑横机引言随着工业技术的不断发展,人机界面的开发及应用空前火热,为了具有比较友好的人机界面,TFT 数字彩屏被广泛的应用,但是TFT 彩屏通常都不带有控制器,所以现在驱动彩屏的方案大致有2 种:①采用ARM9 或者更高级别的平台,芯片上带有TFT 控制器,可以直接挂接TFT 数字屏。
②采用低端CPU 处理器平台,外加TFT 控制器模块,再挂接TFT 数字屏。
对于方案①来说,系统的复杂度会莫名地增加,再加上该类的平台中主MCU 多为BGA 封装,对于需求很多小量多样化产品的客户来说,较难以接受这样的方案;而②方案平白无故添加了一个LCD 控制器。
这两种方案无论哪一种都增加了硬件成本,本文提出了一种由STM32 的FSMC 总线直接挂载RGB 接口屏的方案,直接由一片CPU(STM32F103VC)来完成TFT 屏的显示而且不会占用全部的CPU 时间,从而节约了产品的成本。
1 总体方案与硬件整体架构现在,TFT 屏的价格与传统的单色液晶模块的价格几乎相当,甚至比一些尺寸差不多的单色屏还要便宜;而从客户和厂商的角度来看,很多设备/仪器/小型工业装备的制造商也纷纷寻求彩色TFT 的设计方案,以提升产品的竞争力和显示效果。
基于以上原因,笔者以STM32 处理器的FSMC 接口挂载RGB 接口数字屏。
STM32时钟详细配置
STM32时钟配置STM32时钟配置步骤// 开启HSI时钟寄存器操作1).开启高速时钟HSE // 设置时钟控制寄存器RCC_CR 位16 置1使能RCC->CR|= 0x00010000;位16 :HSEON:外部高速时钟使能当进入待机和停止模式时,该位由硬件清零,关闭4-16MHz外部振荡器。
当外部4-16MHz 振荡器被用作或被选择将要作为系统时钟时,该位不能被清零。
2).等待高速时钟就绪// 读取时钟控制寄存器RCC_CR位17为1就位while(!(RCC-> CR>>17));位17:HSERDY:外部高速时钟就绪标志由硬件置’1’来指示外部4-16MHz振荡器已经稳定。
在HSEON位清零后,该位需要6个外部4-25MHz振荡器周期清零。
3).设置APB1,APB2,AHB分频系数// 设置时钟配置寄存器RCC_CFGRRCC_CFGR=0x00000400;(AHB :位4-7, (低速)APB1 :位8-10, (高速)APB2 :位11-13)位7:4:HPRE[3:0]:AHB预分频(AHB Prescaler)0xxx:SYSCLK不分频位10:8:PPRE1[2:0]:低速APB预分频(APB1) 100:HCLK 2分频位13:11:PPRE2[2:0]:高速APB预分频(APB2) 0xx:HCLK不分频4).设置PLL倍频// 配置时钟配置寄存器RCC_CFGR 位18-21RCC_CFGR|=7<<18;位21:18:PLLMUL:PLL倍频系数0111:PLL 9倍频输出5).PLL输入时钟源选择// 配置时钟配置寄存器RCC_CFGR 位16RCC_CFGR|=1<<16;位16:PLLSRC:PLL输入时钟源(PLL entry clock source) 1:HSE时钟作为PLL输入时钟。
由软件置’1’或清’0’来选择PLL输入时钟源。
stm32时钟概念
stm32时钟概念摘要:1.STM32 时钟概念概述2.STM32 时钟的分类3.STM32 时钟的配置方法4.STM32 时钟的应用实例5.总结正文:一、STM32 时钟概念概述STM32 时钟是指基于STM32 单片机的实时时钟(Real-Time Clock,RTC)功能。
实时时钟功能是指单片机内部集成的一个用于提供时间信息的时钟,它可以提供年、月、日、星期、时、分、秒等时间信息。
STM32 时钟广泛应用于各种嵌入式系统中,如智能家居、自动控制、消费电子等领域。
二、STM32 时钟的分类STM32 时钟主要分为以下两类:1.RTC 时钟:RTC 时钟是STM32 单片机内部集成的实时时钟,它可以提供年、月、日、星期、时、分、秒等时间信息。
RTC 时钟可以通过实时时钟控制器(RTC)和实时时钟寄存器(RTC Register)进行配置和控制。
2.EXTI 时钟:EXTI 时钟是STM32 单片机外部中断时钟,它可以通过外部中断控制器(EXTI)进行配置和控制。
EXTI 时钟主要用于实现对外部事件的实时响应和处理,如按键、传感器等外部事件的检测。
三、STM32 时钟的配置方法STM32 时钟的配置方法主要包括以下几个步骤:1.配置RCC 时钟:RCC 时钟是STM32 单片机的核心时钟,它决定了单片机的工作频率。
在配置RCC 时钟时,需要根据实际应用需求选择合适的时钟源和倍频,以满足系统的性能要求。
2.配置RTC 时钟:配置RTC 时钟需要设置RTC 时钟控制器的控制和状态寄存器(RTCCSR),以启用RTC 时钟并设置其工作模式。
同时,还需要配置RTC 时钟寄存器(RTC Register),以设置年、月、日、星期、时、分、秒等时间信息。
3.配置EXTI 时钟:配置EXTI 时钟需要设置外部中断控制器的控制和状态寄存器(EXTICSR),以启用EXTI 时钟并设置其工作模式。
同时,还需要配置外部中断事件表(EXTIEVT),以定义外部中断事件的优先级和中断响应方式。
STM32 时钟详解及范例
一、综述:1、时钟源在STM32 中,一共有5 个时钟源,分别是HSI 、HSE 、LSI 、LSE 、PLL 。
①HSI 是高速内部时钟,RC 振荡器,频率为8MHz ;②HSE 是高速外部时钟,可接石英/ 陶瓷谐振器,或者接外部时钟源,频率范围是4MHz –16MHz ;③LSI 是低速内部时钟,RC 振荡器,频率为40KHz ;④LSE 是低速外部时钟,接频率为32.768KHz的石英晶体;⑤PLL 为锁相环倍频输出,严格的来说并不算一个独立的时钟源,PLL 的输入可以接HSI/2 、HSE 或者HSE/2 。
PLL倍频可选择为2– 16 倍,但是其输出频率最大不得超过72MHz 。
其中,40kHz 的LSI 供独立看门狗IWDG 使用,另外它还可以被选择为实时时钟RTC 的时钟源。
另外,实时时钟RTC 的时钟源还可以选择LSE ,或者是HSE 的128 分频。
STM32 中有一个全速功能的USB 模块,其串行接口引擎需要一个频率为48MHz 的时钟源。
该时钟源只能从PLL 端获取,可以选择为1.5 分频或者1分频,也就是,当需使用到USB 模块时,PLL 必须使能,并且时钟配置为48MHz 或72MHz 。
另外STM32 还可以选择一个时钟信号输出到MCO 脚(PA.8) 上,可以选择为PLL 输出的2分频、HSI 、HSE 或者系统时钟。
系统时钟SYSCLK ,它是提供STM32 中绝大部分部件工作的时钟源。
系统时钟可以选择为PLL 输出、HSI 、HSE 。
系系统时钟最大频率为72MHz ,它通过AHB 分频器分频后送给各个模块使用,AHB 分频器可以选择 1 、 2 、 4 、8 、16 、64 、128 、256 、512 分频,AHB分频器输出的时钟送给5大模块使用:①送给AHB 总线、内核、内存和DMA使用的HCLK 时钟;②通过8分频后送给Cortex 的系统定时器时钟STCLK;③直接送给Cortex 的空闲运行时钟FCLK ;④送给APB1 分频器。
STM32时钟配置方法详解
STM32时钟配置方法详解STM32是意法半导体(STMicroelectronics)公司推出的一系列32位Flash微控制器,被广泛应用于各种嵌入式系统中。
时钟是STM32微控制器的核心部分,正确配置时钟可以确保系统正常工作并达到预期的性能。
本文将详细介绍STM32时钟配置的方法。
1.时钟源:STM32微控制器提供了多个时钟源,包括内部时钟(HSI、LSI)和外部时钟(HSE、LSE)。
其中,HSI(高速内部时钟)是一个高频率(通常为8MHz)的内部RC振荡器,适用于低功耗应用;LSI(低速内部时钟)是一个低频率(通常为40kHz)的内部RC振荡器,用于RTC(实时时钟)模块;HSE(高速外部时钟)是一个外接的高频晶振,用于提供更精确的时钟信号;LSE(低速外部时钟)是一个外接的低频晶振,适用于RTC模块。
2.主频和系统时钟:主频是指CPU的时钟频率,系统时钟是指STM32微控制器的总线时钟,包括AHB(高性能总线)、APB1(低速外设总线)和APB2(高速外设总线)。
在进行STM32时钟配置之前,需要按照以下几个步骤来完成。
1.启用对应的时钟源:根据具体需求,选择合适的时钟源并启用相应的时钟。
可以通过设置RCC_CR寄存器和RCC_APB1ENR/RCC_APB2ENR寄存器来实现。
例如,要使用HSE作为时钟源,需要首先启用HSE时钟。
2.配置时钟分频器:为了使系统时钟不超过芯片规格要求的最大频率,需要对时钟进行分频。
分频器有两个,即AHB分频器和APB分频器。
可以通过设置RCC_CFGR寄存器来实现。
例如,将AHB分频器设置为8,将APB1和APB2分频器分别设置为4,可以将主频分别分频为8MHz、32MHz和64MHz。
3.等待时钟稳定:当启用外部时钟源时,需要等待时钟稳定。
可以通过读取RCC_CR寄存器的特定标志位来判断时钟是否稳定。
4. 配置Flash存储器的延时:根据主频的不同,需要设置Flash存储器的访问延时,以确保正常读写数据。
基于STM32的FSMC接口驱动TFT彩屏的设计方案
基于STM32的FSMC接口驱动TFT彩屏的设计方案一、背景介绍TFT(Thin Film Transistor)彩屏是一种薄膜晶体管彩色液晶显示屏,具有高分辨率、广视角和真实色彩等特点,广泛应用于消费电子产品和工业设备等领域。
STM32是意法半导体(STMicroelectronics)推出的一系列基于ARM Cortex-M内核的32位微控制器,具有丰富的外设和强大的计算性能。
二、设计方案1.硬件选型选择适配的TFT彩屏模块和STM32系列微控制器,确保彩屏和微控制器之间的电气和通信接口兼容。
在硬件设计中,需要注意考虑TFT彩屏的分辨率、尺寸、显示接口、电源供应和触摸屏等特性。
2.接口连接将TFT彩屏的数据总线连接到STM32微控制器的FSMC(Flexible Static Memory Controller)接口,FSMC接口支持多种外部存储器和显示器设备的数据交互,包括SRAM、NOR Flash和LCD等。
在硬件设计中,需要根据TFT彩屏的接口类型(如RGB接口、SPI接口等)选择合适的引脚进行连接,并参考STM32的技术手册或数据手册配置FSMC接口的参数。
3.驱动程序编写根据TFT彩屏的型号和厂家提供的数据手册,编写合适的驱动程序来实现对TFT彩屏的初始化、配置和数据传输等操作。
驱动程序需要调用STM32的FSMC接口相关的函数来进行数据收发,并通过设置FSMC寄存器来配置时序和控制信号。
在编写驱动程序时,可以参考STM32提供的示例代码和库函数,或者使用第三方开源的驱动程序库。
4.显示数据处理通过使用TFT彩屏的驱动程序,可以实现对图像和文本等数据的显示。
在STM32微控制器中,可以通过使用内部存储器或外部存储器来存储需要显示的数据。
在显示数据处理时,需要根据TFT彩屏的分辨率和颜色配置,将数据转化为对应的像素点或颜色值,并通过驱动程序进行传输和显示。
5.功能扩展在基于STM32的FSMC接口驱动TFT彩屏的设计中,可以进一步扩展功能,如添加触摸屏控制、图形界面设计、动画效果和多任务处理等。
STM32-时钟配置与使用
STM32-时钟配置与使⽤0、前⾔RCC-复位和时钟控制器可以实现配置系统时钟SYSCLK,配置AHB(HCLK)总线时钟,配置外设APB1(PCLK1)和APB2(PCLK2)时钟库函数的标准配置为PCLK2=HCLK=SYSCLK=PLLCLK=72M,PCLK1=HCLK/2=36M系统初始化时会调⽤函数实现时钟配置。
#ifdef SYSCLK_FREQ_HSEuint32_t SystemCoreClock = SYSCLK_FREQ_HSE; /*!< System Clock Frequency (Core Clock) */#elif defined SYSCLK_FREQ_24MHzuint32_t SystemCoreClock = SYSCLK_FREQ_24MHz; /*!< System Clock Frequency (Core Clock) */#elif defined SYSCLK_FREQ_36MHzuint32_t SystemCoreClock = SYSCLK_FREQ_36MHz; /*!< System Clock Frequency (Core Clock) */#elif defined SYSCLK_FREQ_48MHzuint32_t SystemCoreClock = SYSCLK_FREQ_48MHz; /*!< System Clock Frequency (Core Clock) */#elif defined SYSCLK_FREQ_56MHzuint32_t SystemCoreClock = SYSCLK_FREQ_56MHz; /*!< System Clock Frequency (Core Clock) */#elif defined SYSCLK_FREQ_72MHzuint32_t SystemCoreClock = SYSCLK_FREQ_72MHz; /*!< System Clock Frequency (Core Clock) */static void SetSysClock(void){#ifdef SYSCLK_FREQ_HSESetSysClockToHSE();#elif defined SYSCLK_FREQ_24MHzSetSysClockTo24();#elif defined SYSCLK_FREQ_36MHzSetSysClockTo36();#elif defined SYSCLK_FREQ_48MHzSetSysClockTo48();#elif defined SYSCLK_FREQ_56MHzSetSysClockTo56();#elif defined SYSCLK_FREQ_72MHzSetSysClockTo72();#endif在system_stm32f10x.c⽂件中可更改宏定义改变系统时钟频率#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)/* #define SYSCLK_FREQ_HSE HSE_VALUE */#define SYSCLK_FREQ_24MHz 24000000#else/* #define SYSCLK_FREQ_HSE HSE_VALUE *//* #define SYSCLK_FREQ_24MHz 24000000 *//* #define SYSCLK_FREQ_36MHz 36000000 *//* #define SYSCLK_FREQ_48MHz 48000000 *//* #define SYSCLK_FREQ_56MHz 56000000 */#define SYSCLK_FREQ_72MHz 72000000#endif1、时钟树主要时钟HSE:⾼速外部时钟,可由有源晶振或⽆源晶振提供,4-16MHzPLL以HSE为来源时可设置不分频或2分频PLL:锁相环时钟源,可配置来⾃HSE或HSI/2PLLCLK:锁相环时钟,可设置倍频[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]SYSCLK:系统时钟PCLK2:APB2总线时钟,由HCLK通过⾼速APB2预分频得到,分频因⼦[1,2,4,8,16]其他时钟USB时钟:由PLLCLK通过USB预分频器得到,分频因⼦[1,1.5]Cortex系统时钟:由HCLK8分频得到,⽤来驱动内核的系统定时器SysTickADC时钟:由PCLK2经ADC预分频得到,分频因⼦[2,4,6,8]RTC时钟:由HSE/128或LSE或LSI得到MCO时钟:输出时钟,可由PLLCLK/2,HSI,HSE,SYSCLK配置2、时钟配置相关库函数配置函数/*将RCC外设初始化为复位状态*/void RCC_DeInit(void);/*使能HSE,可选参数RCC_HSE_OFF,RCC_HSE_ON,RCC_HSE_Bypass*/void RCC_HSEConfig(uint32_t RCC_HSE);/*等待时钟源启动稳定,返回SUCCESS,ERROR*/ErrorStatus RCC_WaitForHSEStartUp(void);/*配置PLL时钟源和PLL倍频因⼦RCC_RLLSource:RCC_PLLSource_HSE_Div1,RCC_PLLSource_HSE_Div2,RCC_PLLSource_HSI_Div2RCC_PLLMul:RCC_PLLMul_2 [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]*/void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul);/*配置系统时钟,可选参数RCC_SYSCLKSource_HSI,RCC_SYSCLKSource_HSE,RCC_SYSCLKSource_PLLCLK */void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);/*配置HCLK,可选参数RCC_SYSCLK_Div1 [1,2,4,8,16,64,128,256,512]*/void RCC_HCLKConfig(uint32_t RCC_SYSCLK);/*配置PCLK1,可选参数RCC_HCLK_Div1 [1,2,4,8,16]*/void RCC_PCLK1Config(uint32_t RCC_HCLK);/*配置PCLK2,可选参数RCC_HCLK_Div1 [1,2,4,8,16]*/void RCC_PCLK2Config(uint32_t RCC_HCLK);操作函数/*控制PLL开关,可选参数DISABLE,ENABLE*/void RCC_PLLCmd(FunctionalState NewState);/*获取状态,可选参数#define RCC_FLAG_HSIRDY ((uint8_t)0x21)#define RCC_FLAG_HSERDY ((uint8_t)0x31)#define RCC_FLAG_PLLRDY ((uint8_t)0x39)#define RCC_FLAG_LSERDY ((uint8_t)0x41)#define RCC_FLAG_LSIRDY ((uint8_t)0x61)#define RCC_FLAG_PINRST ((uint8_t)0x7A)#define RCC_FLAG_PORRST ((uint8_t)0x7B)#define RCC_FLAG_SFTRST ((uint8_t)0x7C)#define RCC_FLAG_IWDGRST ((uint8_t)0x7D)#define RCC_FLAG_WWDGRST ((uint8_t)0x7E)#define RCC_FLAG_LPWRRST ((uint8_t)0x7F)返回SET,RESET*/* - 0x08: PLL used as system clock*/uint8_t RCC_GetSYSCLKSource(void);使⽤HSE配置系统时钟1、开启HSE ,并等待 HSE 稳定2、设置 AHB、APB2、APB1的预分频因⼦3、设置PLL的时钟来源,和PLL的倍频因⼦,设置各种频率主要就是在这⾥设置4、开启PLL,并等待PLL稳定5、把PLLCK切换为系统时钟SYSCLK6、读取时钟切换状态位,确保PLLCLK被选为系统时钟/* 设置系统时钟:SYSCLK, AHB总线时钟:HCLK, APB2总线时钟:PCLK2, APB1总线时钟:PCLK1* PCLK2 = HCLK = SYSCLK* PCLK1 = HCLK/2,最⾼只能是36M* 参数说明:pllmul是PLL的倍频因⼦,在调⽤的时候可以是:RCC_PLLMul_x , x:[2,3,...16]* 举例:HSE_SetSysClock(RCC_PLLMul_9); 则设置系统时钟为:8MHZ * 9 = 72MHZ* HSE_SetSysClock(RCC_PLLMul_16); 则设置系统时钟为:8MHZ * 16 = 128MHZ,超频慎⽤** HSE作为时钟来源,经过PLL倍频作为系统时钟,这是通常的做法*/void HSE_SetSysClock(uint32_t pllmul){__IO uint32_t StartUpCounter = 0, HSEStartUpStatus = 0;// 把RCC外设初始化成复位状态,这句是必须的RCC_DeInit();//使能HSE,开启外部晶振,野⽕开发板⽤的是8MRCC_HSEConfig(RCC_HSE_ON);// 等待 HSE 启动稳定HSEStartUpStatus = RCC_WaitForHSEStartUp();// 只有 HSE 稳定之后则继续往下执⾏if (HSEStartUpStatus == SUCCESS){//----------------------------------------------------------------------//// 使能FLASH 预存取缓冲区FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);// SYSCLK周期与闪存访问时间的⽐例设置,这⾥统⼀设置成2// 设置成2的时候,SYSCLK低于48M也可以⼯作,如果设置成0或者1的时候,// 如果配置的SYSCLK超出了范围的话,则会进⼊硬件错误,程序就死了// 0:0 < SYSCLK <= 24M// 1:24< SYSCLK <= 48M// 2:48< SYSCLK <= 72MFLASH_SetLatency(FLASH_Latency_2);//----------------------------------------------------------------------//// AHB预分频因⼦设置为1分频,HCLK = SYSCLKRCC_HCLKConfig(RCC_SYSCLK_Div1);// APB2预分频因⼦设置为1分频,PCLK2 = HCLKRCC_PCLK2Config(RCC_HCLK_Div1);// APB1预分频因⼦设置为1分频,PCLK1 = HCLK/2RCC_PCLK1Config(RCC_HCLK_Div2);//-----------------设置各种频率主要就是在这⾥设置-------------------//// 设置PLL时钟来源为HSE,设置PLL倍频因⼦// PLLCLK = 8MHz * pllmulRCC_PLLConfig(RCC_PLLSource_HSE_Div1, pllmul);//------------------------------------------------------------------//// 开启PLLRCC_PLLCmd(ENABLE);// 等待 PLL稳定while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}// 当PLL稳定之后,把PLL时钟切换为系统时钟SYSCLKRCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);// 读取时钟切换状态位,确保PLLCLK被选为系统时钟while (RCC_GetSYSCLKSource() != 0x08){}}else{// 如果HSE开启失败,那么程序就会来到这⾥,⽤户可在这⾥添加出错的代码处理// 当HSE开启失败或者故障的时候,单⽚机会⾃动把HSI设置为系统时钟,// HSI是内部的⾼速时钟,8MHZwhile (1){使⽤HSI配置系统时钟1、开启HSI ,并等待 HSI 稳定2、设置 AHB、APB2、APB1的预分频因⼦3、设置PLL的时钟来源,和PLL的倍频因⼦,设置各种频率主要就是在这⾥设置4、开启PLL,并等待PLL稳定5、把PLLCK切换为系统时钟SYSCLK6、读取时钟切换状态位,确保PLLCLK被选为系统时钟/* 设置系统时钟:SYSCLK, AHB总线时钟:HCLK, APB2总线时钟:PCLK2, APB1总线时钟:PCLK1* PCLK2 = HCLK = SYSCLK* PCLK1 = HCLK/2,最⾼只能是36M* 参数说明:pllmul是PLL的倍频因⼦,在调⽤的时候可以是:RCC_PLLMul_x , x:[2,3,...16]* 举例:HSI_SetSysClock(RCC_PLLMul_9); 则设置系统时钟为:4MHZ * 9 = 72MHZ* HSI_SetSysClock(RCC_PLLMul_16); 则设置系统时钟为:4MHZ * 16 = 64MHZ** HSI作为时钟来源,经过PLL倍频作为系统时钟,这是在HSE故障的时候才使⽤的⽅法* HSI会因为温度等原因会有漂移,不稳定,⼀般不会⽤HSI作为时钟来源,除⾮是迫不得已的情况* 如果HSI要作为PLL时钟的来源的话,必须⼆分频之后才可以,即HSI/2,⽽PLL倍频因⼦最⼤只能是16 * 所以当使⽤HSI的时候,SYSCLK最⼤只能是4M*16=64M*/void HSI_SetSysClock(uint32_t pllmul){__IO uint32_t HSIStartUpStatus = 0;// 把RCC外设初始化成复位状态,这句是必须的RCC_DeInit();//使能HSIRCC_HSICmd(ENABLE);// 等待 HSI 就绪HSIStartUpStatus = RCC->CR & RCC_CR_HSIRDY;// 只有 HSI就绪之后则继续往下执⾏if (HSIStartUpStatus == RCC_CR_HSIRDY){//----------------------------------------------------------------------//// 使能FLASH 预存取缓冲区FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);// SYSCLK周期与闪存访问时间的⽐例设置,这⾥统⼀设置成2// 设置成2的时候,SYSCLK低于48M也可以⼯作,如果设置成0或者1的时候,// 如果配置的SYSCLK超出了范围的话,则会进⼊硬件错误,程序就死了// 0:0 < SYSCLK <= 24M// 1:24< SYSCLK <= 48M// 2:48< SYSCLK <= 72MFLASH_SetLatency(FLASH_Latency_2);//----------------------------------------------------------------------//// AHB预分频因⼦设置为1分频,HCLK = SYSCLKRCC_HCLKConfig(RCC_SYSCLK_Div1);// APB2预分频因⼦设置为1分频,PCLK2 = HCLKRCC_PCLK2Config(RCC_HCLK_Div1);// APB1预分频因⼦设置为1分频,PCLK1 = HCLK/2RCC_PCLK1Config(RCC_HCLK_Div2);//-----------------设置各种频率主要就是在这⾥设置-------------------//// 设置PLL时钟来源为HSE,设置PLL倍频因⼦// PLLCLK = 4MHz * pllmulRCC_PLLConfig(RCC_PLLSource_HSI_Div2, pllmul);//------------------------------------------------------------------//// 开启PLLRCC_PLLCmd(ENABLE);// 等待 PLL稳定while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}// 当PLL稳定之后,把PLL时钟切换为系统时钟SYSCLKRCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);// 读取时钟切换状态位,确保PLLCLK被选为系统时钟while (RCC_GetSYSCLKSource() != 0x08){}}else{// 如果HSI开启失败,那么程序就会来到这⾥,⽤户可在这⾥添加出错的代码处理// 当HSE开启失败或者故障的时候,单⽚机会⾃动把HSI设置为系统时钟,// HSI是内部的⾼速时钟,8MHZwhile (1){MCO输出MCO GPIO初始化/** 初始化MCO引脚PA8* 在F1系列中MCO引脚只有⼀个,即PA8,在F4系列中,MCO引脚会有两个*/void MCO_GPIO_Config(void){GPIO_InitTypeDef GPIO_InitStructure;// 开启GPIOA的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 选择GPIO8引脚GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//设置为复⽤功能推挽输出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//设置IO的翻转速率为50MGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;// 初始化GPIOA8GPIO_Init(GPIOA, &GPIO_InitStructure);}输出// MCO 引脚初始化MCO_GPIO_Config();// 设置MCO引脚输出时钟,⽤⽰波器即可在PA8测量到输出的时钟信号,// 我们可以把PLLCLK/2作为MCO引脚的时钟来检测系统时钟是否配置准确// MCO引脚输出可以是HSE,HSI,PLLCLK/2,SYSCLK//RCC_MCOConfig(RCC_MCO_HSE);//RCC_MCOConfig(RCC_MCO_HSI);//RCC_MCOConfig(RCC_MCO_PLLCLK_Div2);RCC_MCOConfig(RCC_MCO_SYSCLK);Systick系统定时器简介SysTick——系统定时器是属于 CM3 内核中的⼀个外设,内嵌在 NVIC 中。
STM32时钟源的介绍及使用方法——STM32时钟树
STM32时钟源的介绍及使⽤⽅法——STM32时钟树【温馨提⽰:以下内容均来⾃⽹友的⽆私奉献或书本的摘抄,在此表⽰感谢!】上图是STM32的时钟树,从树上我们可以看到,STM32的时钟有两个来源——内部时钟和外部时钟。
按时钟频率来分,⼜可分为⾼速时钟和低速时钟。
因此STM32的时钟有四个来源:⾼速外部时钟信号(HSE)、低速外部时钟信号(LSE)、⾼速内部时钟信号(HSI)和低速内部时钟信号(LSI)(图中分别⽤蓝⾊的①~④标注)。
①HSE⾼速外部时钟:由外部4~16MHz的晶体或有源晶振提供,通常采⽤8MHz。
②LSI低速外部时钟:外部晶体提供,主要是给实时时钟(RTC),⼀般为32.768kHz。
③HSI⾼速内部时钟:由内部RC振荡器产⽣的8MHz时钟,但不够稳定。
④LSI低速内部时钟:内部RC振荡器产⽣的供给RTC的时钟,频率在30kHz~60kHz之间,通常约40kHz。
时钟在STM32内部最终是供给四⼤块(图中⽤红⾊椭圆圈出):USB的48MHz时钟、系统时钟SYSCLK、实时时钟模块RTC、独⽴看门狗的时钟IWDGCLK。
其中最主要的,也是最⼤头是系统时钟SYSCLK,它可以是内部或外部⾼速时钟直接接过来,也可以内、外部⾼速时钟是PLL倍频后提供的,系统时钟再分别供给Cortex内核、SDIO、AHB总线、DMA、APB1、APB2等。
我们通常是采⽤外部8MHz⾼速时钟(HSE),所以着重说HSE。
我们以前⾯的GPIO上的时钟为例,由ST的Datasheet可知,GPIO是在APB2⾼速外设总线上的,图中绿⾊的线就是时钟的流程,我们⼀步步地来看。
8MHz外部晶体(或晶振)输⼊后,先经过⼀个开关PLLXTPRE(HSE divider for PLL entry),此开关决定对HSE进⾏2分频再输⼊到PLL或直接到PLL。
我们选择不分频。
这样时钟⼜到了第⼆个开关PLLSRC(PLL entry clock source),此开关决定PLL的时钟来源,是内部⾼速时钟⼆分频的时钟还是PLLXTPRE的输出。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于STM32的TFT指针式时钟摘要自时钟发明的那天起,它就注定了与人们有着密不可分的关系,但科学技术在不断发展,人们随着时间的推移对时间计量的精度要求越来越高,机械式时钟也越来越满足不了人们日益增高的要求了。
取而代之的事具有高度准确性和直观性且无机械装置,使用寿命更长更长等优点的电子时钟。
电子时钟更具人性化,更能提高人们的生活质量,更受人们欢迎,机械时代已经远去,电子时代已经到来。
因此本设计是基于意法半导体公司(ST)的STM32开发平台实现一种高精度,智能化的指针式时钟系统,采用STM32内部RTC设计电子时钟时,通常是数字显示,这是由于选用数码管和1602等器件的显示能力有限。
而12864是基于点阵式的液晶屏,其像素点为128×64,但12864自身像素较低,使其显示指针式时钟效果远低于2.2寸TFT-LCD液晶,但两者所基于的原理相同。
因此本设计采用STM32为控制核心,2.2寸TFT-LCD液晶作为显示芯片,构成了一个指针式电子时钟。
关键词:STM32;RTC;TFT-LCD第1章绪论1.1 引言随着科学技术的发展和电子技术产业结构调整,单片机开始迅速发展,由于家用电器逐渐普及,市场对于智能时钟控制系统的需求也越来越大。
单片机以其芯片集成度高、处理功能强、可靠性高等优点,成功应用于工业自动化、智能仪器仪表、家电产品等领域。
近些年,人们对数字钟的要求也越来越高,传统的时钟已不能满足人们的需求。
多功能数字钟不管在性能还是在样式上都发生了质的变化,有电子闹钟、数字闹钟等等。
而目前,对于指针式时钟来说,所用的指针大多是靠机械装置驱动达到显示时间的目的,例如手表,挂钟,钟楼等等,单片机在指针式时钟中的应用也已经非常普遍的,人们对指针时钟的功能及工作顺序都非常熟悉。
但是却很少知道它的内部结构以及工作原理。
由单片机作为指针时钟的核心控制器,可以通过它的时钟信号进行计时实现计时功能,将其时间数据经单片机输出,利用显示器显示出来。
输出设备显示器可以用液晶显示技术。
1.2 本设计的目的和意义1.2.1 设计目的(1)巩固,加深和扩大STM32应用的知识面,提高综合及灵活运用所学知识解决工业控制的能力;(2)培养针对课题需要,选择和查阅有关手册,图表及文献资料的自学能力,提高组成系统,编程,调试的动手能力;(3)对课题设计方案的分析、选择、比较,熟悉用STM32做系统开发,研制的过程,软硬件设计的方法,内容及步骤;(4)进一步掌握C语言在硬件编程中的应用,熟悉怎样用C语言实现TFT-LCD上的绘图功能;(5)掌握STM32内部RTC的原理和应用。
1.2.2设计意义数字指针式时钟是采用数字电路实现对时,分,秒,星期,年,月,日等数字以及指针表盘显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。
因此,研究数字钟及扩大其应用,有着非常现实的意义。
1.3本设计的主要研究内容(1)在硬件设计方面,本系统采用STM32为整个电子钟系统的核心处理器,通过高STM32内部RTC 来控制时间和日期的读取,最后再通过单片机对TFT-LCD 液晶进行驱动并实现在液晶上显示整个指针式电子时钟。
(2)在软件设计方面,重点研究了下列内容:A.TFT-LCD 的驱动函数如何编写,包括LCD 的读函数(读数据,读LCD 状态),写函数(写数据,写命令),初始化函数,清屏函数等一系列驱动函数。
B.用C 语言在LCD 上绘图必须先写出打点函数,这是绘图的基本要求,由于本设计需要在液晶屏上模拟指针式时钟,因而还要写出绘圆和画线函数,于是便实现了表盘的绘制,时分秒指针的绘制等,从而在LCD 上可以模拟指针式电子钟。
C.STM32内部RTC 负责时间和日期信息的读取,自动计时,调整等一列功能,通过掌握DS1302的时序图,指令和功能表完成其驱动函数的编写,如读一字节函数,写一字节函数,指定位置读数据函数,指定位置写数据函数等等。
再通过读时间函数实现与LCD 信息传输。
第2章 硬件系统设计2.1 系统框图与说明初步确定设计系统由STM32主控模块、TFT-LCD 显示模块组成。
系统框图如下图所示系统框图2.2 硬件设计部分2.2.1 单片机芯片选择作为电子爱好者或者电子行业硬件工程的开发者,单片机技术的掌握是必须的,但是目前很多的初学者选择入门的单片机都是基于MCS-51 内核的单片机,虽然此类单片机学习简单,使用方便,但是其性能在很多场合却是大打折扣,要么速度欠缺,要么存储空间欠缺,因此,由于MCS-51 自身的结构所限制,与目前的新技术有明显的脱节。
STM32在运行速度,存储器空间,内部功能模块的集成化,以串行接口为主的外围扩展,适合使用高级语言编程,以及在开发技术和仿真调试方面都比MCS-51内核的单片机要先进。
STM32 现在推出的型号,从最低的10 块钱的,到最高端的STM32F103ZET6,价格也不过40 元不到。
其中包括的型号,有50 种之多。
用户可以随便选择满足自己需求的产品。
高端方面,STM32还推了F105/F107 系列。
强化了USB 和网络的功能。
这方面A VR32,从淘宝上看到的最低价格是30 元左右,具体配置没去看了。
A VR32同STM32最大的缺点就是下载程序不方便,人家得专门为你做个下载器,或者从你那里买,OURA VR论坛上也有人搞了下载器出来,还真佩服这些哥们,挺厉害的。
STM32 具有如下特点:1 )复用IO口重映射功能。
由于有些复用功能可以重映射,使得在STM32的PCB 设计的时候,方便很多。
2 )全部引脚都可以作为中断输入。
全部IO口都可以作为中断输入,这点比很多ARM好,当要使用中断的时候,随便那个IO口都可以,而不需要接到特定的几个脚上,这样极大的方便了设计,不论原理图设计还是PCB 设计。
3 )SWD调试支持。
STM32支持SWD调试,只需要2 跟IO线,就可以用来调试和下载代码,对引脚不多的型号尤其适用。
4 )串口下载程序。
串口下载代码很多ARM都具有这个功能,STM32也保留了这一优秀设计,极大的降低了开发成本(不需要什么JLINK 、ULINK之类的了,也不需要专门的下载器)。
下面是STM32F103RBT6的简单引脚图:STM32F103RBT6的引脚图我是用ALIENTEK MiniSTM32 开发板作为最小系统板,ALIENTEK MiniSTM32开发板是的外观如图所示:ALIENTEK MiniSTM32开发板板载资源如下:◆CPU :STM32F103RBT6 ,LQFP64,FLASH:128K ,SRAM :20K ;◆1 个标准的JTAG/SWD 调试下载口◆1 个电源指示灯(蓝色)◆2 个状态指示灯(DS0 :红色,DS1 :绿色)◆1 个红外接收头,配备一款小巧的红外遥控器◆1 个IIC 接口的EEPROM芯片,24C02 ,容量256 字节◆1 个SPI FLASH 芯片,W25X16,容量为2M 字节◆1 个DS18B20/DS1820 温度传感器预留接口◆1 个标准的2.4/2.8 寸LCD接口,支持触摸屏◆1 个OLED 模块接口◆1 个USB 串口,可用于程序下载和代码调试◆1 个USB SLA VE接口,用于USB 通信◆1 个SD卡接口◆1 个PS/2 接口,可外接鼠标、键盘◆1 组5V电源供应/ 接入口◆1 组3.3V 电源供应/ 接入口◆1 个启动模式选择配置接口◆2 个2.4G 无线通信接口(24L01 和JF24C )◆1 个RTC 后备电池座,并带电池◆1 个复位按钮,可用于复位MCU和LCD◆3 个功能按钮,其中WK_UP兼具唤醒功能◆1 个电源开关,控制整个板的电源◆独创的一键下载功能◆除晶振占用的IO口外,其余所有IO口全部引出,其中GPIOA和GPIOB 按顺序引2.2.2 TFT-LCD显示电路设计(1)TFT-LCD液晶介绍彩屏TFT型液晶一直在我们日常生活中也经常用到,比如我们常见的MP3、MP4和手机等,我们可以通过A Tmega128完成对TFT液晶进行控制。
ALIENTEK MiniSTM32开发板板载了TFT液晶接口,液晶选用了TX05D99VM1AAA模组,该模组实际上是一款手机液晶屏,包含主屏和副屏2个屏幕,尺寸大小2.4,分辨率分别为128x160和96x64,最大支持26万色,用单片机控制也相对较简单。
实物图如下图所示:其原理图如下:第3章软件系统设计整个软件系统采用模块化思想,把TFT液晶,RTC程序分别集成在一起,形成统一的函数接口,方便在在功能程序中调用。
采用这种方法不仅使程序模块化,使程序结构层次分明,便于管理和维护,同时可方便以后开发的调用,只要按照函数接口参数的定义,在功能程序模块中调用接口函数即可,而不必关心底层驱动是如何实现的,这样缩短了开发周期,开发效率大大提高。
本设计的软件系统分为三个部分:RTC的时间采集系统子程序,TFT-LCD彩屏的显示子程序和主程序。
4.1 主程序设计4.1.1 主程序设计框图主程序首先是要初始化STM32各个I/O口和TFT-LCD液晶模块,再对LCD进行清屏,之后调用RTC日历时钟的子程序,完成对日历时钟的初始化和时间数据的读写,最后调用LCD 液晶模块的显示子程序显示数据,主程序的组成就是通过分别调用各个子程序组成一个完整的指针式时钟系统功能。
主程序流程图如下图所示:图3.1 主程序流程图。