第8章 STM32时钟与GPIO设计
stm32数字时钟课程设计

stm32 数字时钟课程设计一、课程目标知识目标:1. 学生能理解STM32的基本结构和工作原理,掌握其编程方法。
2. 学生能掌握数字时钟的基本原理,包括时钟源、分频器、计数器等组成部分。
3. 学生能了解实时时钟(RTC)的功能及其在STM32中的应用。
技能目标:1. 学生能运用C语言编写程序,实现STM32控制数字时钟的功能。
2. 学生能通过调试工具,对程序进行调试和优化,确保数字时钟的准确性。
3. 学生能运用所学知识,设计具有实用价值的数字时钟产品。
情感态度价值观目标:1. 培养学生对电子技术和编程的兴趣,激发其探究精神。
2. 培养学生团队合作意识,使其在项目实施过程中学会相互沟通、协作。
3. 培养学生严谨、细致、负责的工作态度,提高其解决实际问题的能力。
课程性质:本课程为实践性较强的课程,结合STM32和数字时钟知识,培养学生的动手能力和实际操作技能。
学生特点:学生具备一定的电子技术基础和C语言编程能力,对实际操作感兴趣,但可能缺乏项目实践经验。
教学要求:注重理论与实践相结合,引导学生主动探索,提高其分析问题、解决问题的能力。
在教学过程中,关注学生的个体差异,因材施教,使每位学生都能在原有基础上得到提高。
将课程目标分解为具体的学习成果,便于后续教学设计和评估。
二、教学内容本课程教学内容主要包括以下几部分:1. STM32基本原理与编程基础:介绍STM32的内部结构、工作原理,C语言编程基础及其在STM32中的应用。
- 教材章节:第一章至第三章- 内容:微控制器基础、STM32硬件结构、C语言编程基础、STM32编程环境搭建。
2. 数字时钟原理与设计:讲解数字时钟的基本原理、组成部分以及设计方法。
- 教材章节:第四章至第五章- 内容:时钟源、分频器、计数器、实时时钟(RTC)、数字时钟设计方法。
3. STM32实现数字时钟功能:结合STM32和数字时钟知识,指导学生动手实践,实现数字时钟功能。
STM32的IO口设置方法实例

STM32的IO⼝设置⽅法实例STM32的IO⼝设置⽅法实例!通过本节的学习,你将了解到STM32的IO⼝作为输出使⽤的⽅法。
本节分为如下⼏个⼩节:3.1.1 STM32 IO⼝简介3.1.2 硬件设计3.1.3 软件设计3.1.4 仿真与下载3.1.1 STM32 IO简介作为所有开发板的经典⼊门实验,莫过于跑马灯了。
ALIENTEK MiniSTM32开发板板载了2个LED,DS0和DS1,本实验将通过教你如何控制这两个灯实现交替闪烁的类跑马灯效果。
该实验的关键在于如何控制STM32的IO⼝输出。
了解了STM32的IO⼝如何输出的,就可以实现跑马灯了。
通过这⼀节的学习,你将初步掌握STM32基本IO⼝的使⽤,⽽这是迈向STM32的第⼀步。
STM32的IO⼝可以由软件配置成8种模式:1、输⼊浮空2、输⼊上拉3、输⼊下拉4、模拟输⼊5、开漏输出6、推挽输出7、推挽式复⽤功能8、开漏复⽤功能每个IO⼝可以⾃由编程,单IO⼝寄存器必须要按32位字被访问。
STM32的很多IO⼝都是5V兼容的,这些IO⼝在与5V电平的外设连接的时候很有优势,具体哪些IO⼝是5V兼容的,可以从该芯⽚的数据⼿册管脚描述章节查到(I/O Level标FT的就是5V电平兼容的)。
STM32的每个IO端⼝都有7个寄存器来控制。
他们分别是:配置模式的2个32位的端⼝配置寄存器CRL和CRH;2个32位的数据寄存器IDR和ODR;1个32位的置位/复位寄存器BSRR;⼀个16位的复位寄存器BRR;1个32位的锁存寄存器LCKR;这⾥我们仅介绍常⽤的⼏个寄存器,我们常⽤的IO端⼝寄存器只有4个:CRL、CRH、IDR、ODR。
CRL和CRH控制着每个IO⼝的模式及输出速率。
STM32的IO⼝位配置表如表3.1.1.1所⽰:表3.1.1.1 STM32的IO⼝位配置表STM32输出模式配置如表3.1.1.2所⽰:表3.1.1.2 STM32输出模式配置表接下来我们看看端⼝低配置寄存器CRL的描述,如下图所⽰:图3.1.1.1端⼝低配置寄存器CRL各位描述该寄存器的复位值为0X4444 4444,从上图可以看到,复位值其实就是配置端⼝为浮空输⼊模式。
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的电子时钟设计

第39卷第11期2020年11月绵阳师范学院学报Journal of Mianyang Teachers'CollegeVol.39No.11Nov.2020D01:10.16276/51-1670/g.2020.11.005基于STM32的电子时钟设计郭辛(绵阳师范学院机电工程学院,四川绵阳621000)摘要:随着嵌入式技术的应用与推广.ARM32位处理器已逐步占据电子消费品和工业测控制造领域主导地位.本文以Cortex-M系列产品的典型代表STM32F103RC为平台,采用固件库技术思想为导向,按照CMSIS标准构建工程,将定时器、LCD驱动以及中断系统等各功能模块进行整合,设计一款电子时钟.通过综合设计的应用开发,摸索和总结出一套针对STM32的学习和设计方法,为高端处理器的应用开发提供新思路.关键词:STM32;嵌入式系统;固件库;定时器;LCD显示中图分类号:TN91文献标志码:A文章编号:1672-612X(2020)11-0028-040引言单片机自诞生之日起已走过近半个世纪的历程.随着电子技术和计算机技术的飞速发展,进入21世纪以来以嵌入式系统为代表的新兴技术正在逐渐占据工业控制领域主导地位,并逐步取代以8位处理器为核心的传统测控系统⑴.近年来由于数字信息技术和网络技术的广泛应用,单片机作为主流核心处理器的地位逐步下降,现代电子技术的发展正朝着智能化、网络化和低功耗的方向迈进•新技术的不断更新,需要新的设计思想的注入才能满足技术发展需求•那么,如何将新兴技术融合到传统知识架构体系,将基础理论与工程应用实际相结合,就成为设计人员急需破解的难题•ARM作为一种32位的高性能、低成本的嵌入式RISC微处理器,得到了广泛的应用,STM32系列是意法半导体(STMicroelectronics)集团专为要求高性能、低成本和低功耗的嵌入式应用设计的ARM Cortex-M系列产品的代表作•基于STM32的嵌入式技术已经渗透在工业控制系统、数据采集系统、智能化仪器仪表和办公自动化等诸多领域的应用,甚至在很大程度上正在改变我们现有的商业模式和工作生活方式,如智能手机、导航系统、无人机和平板电脑等,并呈现出明显的系统化、人工智能化和物联网的趋势.目前,Cortex系列处理器已经占据了大部分嵌入式处理器的中高端产品市场,而嵌入式系统的应用开发对从业者要求很高,初学者若要快速掌握其原理并在实际工程中加以应用,必须改变传统的思维方式并构建新的设计理念■本文以STM32F103RC处理器(Cortex-M普通型号之一)为平台,通过对定时器、中断系统和LCD显示模块的组合设计为例,针对基于固件库设计思想的方法进行探讨与总结,以开启嵌入式系统的应用设计学习之门⑵.1固件库概述固件库是指“STM32标准函数库”,它是由ST公司针对STM32提供的函数接口,即API(Application Program Interface),是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征.它是架设在构成部件的寄存器与用户驱动层之间的代码,向下处理与寄存器直接相关的配置,向上为用户提供配置寄存器的接口⑶.部件的调用和基本操作写成了通用的子函数,对复杂的硬件操作实现了函数封装■在以51单片机为代表的8位机由于硬件系统相对简单,通常采用宜接配置寄存器的方式来进行应用开发;而32位处理器核内系统复杂,外设资源丰富•应用系统若仍旧采用传统的设计方式,不但效率低、可移收稿日期:2020-04-30作者简介:郭辛(1971-),男,四川成都人,讲师,硕士,研究方向:汽车电子控制技术.绵阳师范学院学报(自然科学版)植性差,而且技术难度大,已不能适应较复杂的工程应用•基于固件库的技术思想为解决这一问题提供了新思路:开发者根据具体任务需求按照CMSIS标准构建工程,利用固件库提供的资源,设计和改造相关函数以实现对部件的操作•本文结合综合实验项目的开发——电子时钟的设计为例,首先介绍库函数中主要涉及的定时器和LCD显示驱动的基本结构和工作原理,在此基础上利用现有库资源进行功能设计与系统构建•2定时器概述STM32F1系列中,共有8个定时器TIM1-TIM8,分为基本定时器,通用定时器和高级定时器.基本定时器TIM6和TIM7是一个16位的只能向上计数的定时器,它只能定时,没有外部I/O;通用定时器TIM2/ 3/4/5是一个16位的可以向上/下计数的定时器,可以定时、输出比较和输入捕捉,每个定时器有四个外部I/O;高级定时器TIM1/8是一个16位的可以向上/下计数的定时器,可以定时、输出比较,输入捕捉,以及实现三相电机互补输出信号,每个定时器有8个外部I/O⑷.此例以TIM6作定时器,设计一款LCD屏显电子时钟,计时60min,最小显示值Is.2.1TIM6定时器组成根据STM32参考手册基本定时器的功能结构如图1所示⑶.定时器若要向外提供基本时钟信号,需对相关寄存器进行参数设置:1)时钟源TIM*CLK:根据STM32时钟系统设置,通常挂载APB1时钟总线,默认取值为72MH z[5];2)16位分频器PSC:用于存放预分频值,分频范围1-65536,则时钟周期图1基本定时器功能框图Fig.l Block Diagram of Basic Timer FunctionCK_CLK=(PSC+1)/TIM*CLK(1)即每计1个数的时间间隔3)自动重装载寄存器ARR:用于存放16位计数值,用于设定定时长度Td=CK_CLK*ARR(2)综上所述,首先对定时器初始化,将所预设参数写入到对应的结构体中,赋值包含以下内容:#define BASIC_TIM#define BASIC_TIM_CLK #define BASIC_TIM_ARR #define BASIC_TIM_PSC TIM6RCC_APB1Periph_TIM6 1000-171按照以上参数设置,基本定时时长为:Td=〔(PSC+1)/TIM*C LK〕*A RR=(72/72M)*1000=1ms(3) 2.2电子时钟定时原理如图2所示,内部定时器提供基准时长Td=lms,引入定时中断,每计时1ms中断一次;中断次数time二1000产生Is定时,即LCD显示屏每隔1s更新一次秒位(sec)计数值;每计满60s更新一次分位(min)计数值,并将其分别显示到LCD屏上.2.3LCD显示内部时基信号产生后,还需将结果显示出来,每次中断定时时长为:Td=((PSC+1)/TIM*CLK)*ARRL J701ARR MAX(65535)ls=Td*t ime(中断次数)图2定时原理示意图Fig.2Schematic Diagram of Timing PrincipleSTM32F103实验板配2.8吋16位数据接口液晶屏,控制芯片采用了ILI0341.ILI0341是一个用于TFT液晶郭辛:基于STM32的电子时钟设计显示的单芯片控制驱动器,具有262,144色的240RGBX320像素显示方案;IU0341支持8/9/16/18位数据总线的MCU接口,6/16/18位数据总线的RGB接口以及3/4线的SPI接口⑷,本示例中液晶屏控制器采用了预先配置的8080接口通讯,使用16根数据线的RGB565格式.其相关驱动程序按照IU9341标准编制,主要由如下几步完成:1)初始化LCD数据/控制管脚ILI9341_GPIO_Config().2)点亮背光ILI9341_BackLed_Control(ENABLE).3)初始化控制寄存器ILI9341_REG_Config().4)设置显示模式ILI9341_GramScan(LCD_SCAN_MODE).初始化液晶屏完成后,调用显示驱动函数•5)清屏ILI9341_Clear(0,0,LCD_X_LENGTH,LCD_Y_LENGTH).6)设置显示字符字体(8x16)、颜色(红字)及背景(黑底)LCD_SetFont(&Font8xl6);LCD_SetColors (RED,BLACK).7)使用c标准库把时间变量转化成字符串并显示sprintf(dispBuff,"time:%d:%d”,y,x);[6]LCD_ ClearLine(LINE(6));ILI9341_DispStringLine_EN(UNE(6),dispBuff).将数据转换成字符串,存放于数组dispBuff并写入指定行•3系统设计在以51单片机为主控单元的系统中,我们往往采用直接配置寄存器控制字的方法来操控硬件,因为MCS-51内部寄存器只有21个,而且功能简单,程序设计宜观简便;而STM32作为系统主控制器,其内部设备多达几十个,而控制这些设备的寄存器有几百个,若要使系统维持基本运转,操作这些寄存器所需的驱动程序代码成千上万行,这对于应用开发者来说逐条写程序是不现实的•芯片厂商将这些外设的驱动源码封装成固件函数包提供给用户,由用户在此基础上进行应用开发,因此以STM32为主控制器的应用系统开发就包括项目搭建和程序设计两部分•3.1固件库文件结构分析1)启动文件startup_stm32fl0x_hd.s:设置堆栈、PC指针和配置系统时钟等.2)时钟配置文件system_stm32fl0x.c:将外部时钟倍频并为各子模块提供配套的时钟源.3)内核相关的驱动文件core_cm3.h:内核的外设寄存器映射;core_cm3.c:内核的夕卜设驱动固件库•NVIC(嵌套向量中断控制器)描述文件:misc.h和misc.c.4)夕卜设相关的库文件stm32fl0x.h:实现了内核之夕卜的寄存器映射;stm32fl0x_xx.c:夕卜设的驱动函数库文件;核外设备:GPIO、USRAT、I2C、SPI、FSMC等驱动文件.5)头文件的配置文件stm32flO X_conf.h头文件的配置文件,将多个外设的头文件进行统一调配管理,如:stm32fl0x_usart.h,stm32fl0x_i2c.h,stm32fl0x_spi.h,stm32fl0x_adc.h, stm32f10x_fsmc.h...对外设描述的结构体,映射地址的头文件都放在stm32fl0x_conf.h中进行声明,使用时只需包含该配置头文件即可,并可通过“宏断言”函数进行选配•6)专门注册中断服务函数的C文件:stm32fl0x_it.c和stm32fl0x_it.h.这些文件按照相应的规贝!]分布在不同的路径下,这个规则就是ST集团与各芯片开发商共同制订的CMSIS标准⑶.3.2工程项目构建参照CMSIS标准创建项目文件以及组文件夹:CMSIS、FWlib、inc、src、Project、Output和User,并将固件库提供的基本源代码拷贝到对应目录下,如:项目文件创建并保存在Project路径下;核外外设的驱动程序复制到src源码目录下;对描述部件的寄存器结构体统一定义在inc头文件目录下;而宜接针对任务而设计的程序文件通常放置在用户目录User中,如main()程序,中断服务程序等等.在本例的电子时钟设计中,根据前面所介绍的定时器和LCD的工作原理,配置相关驱动程序或函数集,并写入预设的定时参数,重新组合、设计功能程序:1)计算并确定定时初值以及另濒器参数;2)LCD初始化机模式配置,设计变量显示程序;3)中断服务程序的数据处理部分程序设计-绵阳师范学院学报(自然科学版)3.3程序设计首先对定时器、中断寄存器、AFIO 引脚以及液晶屏进 行初始化设置,并将设计的参数值写入对应寄存器中;开启 定时时钟和中断系统,主程序实时不间断显示时间——分 位(min)和秒位(sec);中断服务程序完成定时器计数值的 更新和处理,并将其转换成时间变量传回主程序显示,程序 流程图见图3.4结论由于内部时钟源能提供1K~72MHz 时钟信号,误差 为±1%,则时钟误差最小可以控制在0. 01 us 范围内.通 过上述实验教学项目的开发,总结出32位微处理平台在工 程实践中的设计流程:(1)任务分析:根据设计要求明确项 目所需实现功能,提出设计方案主体框架、功能模块构成、 技术实现路线;(2)搭建工程项目:根据STM32平台所提供 资源,确定主控系统模块并搭建项目主体框架;对照现有资 源匹配现有的子模块,制作与主系统的接口函数并确定底 层部件参数;(3)主系统集成:完成主要业务的程序编制并 进行系统整和调试.基于STM32平台的嵌入式系统开发, 应采用立足于对系统资源的整合和集成的思维方式,将各 部件的驱动程序看作一种供开发者使用的函数集合,开发 主程序流程图|清除定時中断标志|开始Itime++I 中断服务流程图图3程序流程图Fig.3 Program Flow Chart 者需要做的是将这些离散、抽象的“程序块”有机地进行组合,以搭积木的方式进行模块化设计,这才是嵌入 式系统应用的本质所在.参考文献:[1]严武军.后PC 时代计算机专业建设的思考和探索[J].现代计算机,2011,23:92-97.[2]张良.Multisim 在“自动控制原理”实验教学中的应用[J].绵阳师范学院学报,2019,11(38):27-32.[3]刘火良.STM32库开发实战指南[M].北京:机械工业出版社,2017:317-403.[4]田泽.ARM9嵌入式开发实验与实践[M].北京:北京航空和航天大学出版社,2006:279-282.[5]Jean brosse .嵌入式实时操作系统|jl C\OS-U [ M].邵贝贝译.北京:北京航天航空大学出版社,2007: 116-121.[6] 苏小红.C 语言大学实用教程[M].北京:电子工业出版社,2011:309-322.The Design of An Electronic Clock Based on STM32GUO Xin(School of Mechanical and Electrical Engineering , Mianyang Teachers x College , Mianyang , Sichuan 621000)Abstract : With the development of the embedded system technology , ARM32 bit processor has gradually taken a dominant position in the field of electronic consumer goods and industrial measurement and control manu facturing. This paper takes The STM32F103RC , a typical representative of Cortex-M series products , as the plat form, adopts the technical thought of firmware library as the guidance , and builds projects according to CMSIS standard , integrates various functional modules such as timer , LCD driver and interrupt system , and designs an e- lectronic clock. Through the application development of comprehensive design , a set of learning and design methods for STM32 is explored and summarized to provide new ideas for the application development of high-end processors.Keywords : STM32, embedded system , firmware library , timer , LCD display(责任编辑:陈桂芳)。
图文详解stm32时钟树

对于广大初次接触STM32的读者朋友(甚至是初次接触ARM器件的读者朋友)来说,在熟悉了开发环境的使用之后,往往“栽倒”在同一个问题上。
这问题有个关键字叫:时钟树。
众所周知,微控制器(处理器)的运行必须要依赖周期性的时钟脉冲来驱动——往往由一个外部晶体振荡器提供时钟输入为始,最终转换为多个外部设备的周期性运作为末,这种时钟“能量”扩散流动的路径,犹如大树的养分通过主干流向各个分支,因此常称之为“时钟树”。
在一些传统的低端8位单片机诸如51,AVR,PIC等单片机,其也具备自身的一个时钟树系统,但其中的绝大部分是不受用户控制的,亦即在单片机上电后,时钟树就固定在某种不可更改的状态(假设单片机处于正常工作的状态)。
比如51单片机使用典型的12MHz晶振作为时钟源,则外设如IO口、定时器、串口等设备的驱动时钟速率便已经是固定的,用户无法将此时钟速率更改,除非更换晶振。
而STM32微控制器的时钟树则是可配置的,其时钟输入源与最终达到外设处的时钟速率不再有固定的关系,本文将来详细解析STM32微控制器的时钟树。
图1是STM32微控制器的时钟树,表1是图中各个标号所表示的部件。
标号图1标号释义1 内部低速振荡器(LSI,40Khz)2 外部低速振荡器(LSE,32.768Khz)3 外部高速振荡器(HSE,3-25MHz)4 内部高速振荡器(HIS,8MHz)5 PLL输入选择位6 RTC时钟选择位7 PLL1分频数寄存器8 PLL1倍频寄存器9 系统时钟选择位10 USB分频寄存器11 AHB分频寄存器12 APB1分频寄存器13 AHB总线14 APB1外设总线15 APB2分频寄存器16 APB2外设总线17 ADC预分频寄存器18 ADC外设19 PLL2分频数寄存器20 PLL2倍频寄存器21 PLL时钟源选择寄存器22 独立看门狗设备23 RTC设备图1 STM32的时钟树在认识这颗时钟树之前,首先要明确“主干”和最终的“分支”。
实验二STM32单片机GPIO程序开发

实验二STM32单片机GPIO程序开发
一.实验目的
1.掌握STM32单片机输入输出接口程序开发
2.掌握用库函数开发STM32单片机程序
二.实验环境
1.TEB-CM5000嵌入式单片机实验系统
2.MDK4.7嵌入式软件开发环境
三.实验内容
1.熟悉TEB-CM5000嵌入式单片机实验系统上的LED灯电路和单
独按钮电路。
2.学习并掌握库函数版本相关的实例程序,主要学习
gpio_key_led实例程序。
3.利用库函数开发出USER2(PD3)按钮控制LD5(PF7)亮灭。
具体
功能:USER2(PD3)按钮按下时,LD5灯闪烁;当USER2(PD3)按钮弹开时,LD5灯停止闪烁。
四.实验要求
1.完成实验要求中提到要完成的所有内容,完成代码并提
交主要代码。
2.对每行主要代码要进行注释,说明其功能。
五.实验提交要求
1.按照实验模板完成实验报告,其中包括实验要求的所有内容。
2.提交电子版报告,撰写程序流程图,并且提交程序主要代码。
3.最终提交形式:制作成压缩rar格式文件,文件命名:班级_组号_学号_姓名_实验一.rar。
stm32芯片时钟(晶振)连接到芯片的 引脚

STM32芯片时钟(晶振)连接到芯片引脚一、引言STM32芯片是一款由STMicroelectronics公司生产的32位微控制器,具有高性能、低功耗、丰富的外设和可扩展性等特点。
在STM32芯片中,时钟(晶振)连接到芯片引脚是一个非常重要的部分,直接关系到芯片的工作频率和稳定性。
二、 STM32芯片时钟STM32芯片的时钟系统包括内部RC振荡器、内部RC振荡器、外部晶体振荡器等,其中晶振作为一种最常用的外部时钟源,具有稳定性高、精度好等优点,因此在实际应用中得到了广泛的应用。
三、连接方式STM32芯片中,晶振可以连接到芯片的多个引脚上,通常采用的是双向连接方式,即一个晶振同时连接到芯片的两个引脚上,以提高时钟信号的稳定性和可靠性。
四、连接引脚STM32芯片的不同系列和不同型号,在连接晶振时会有所不同,但基本的连接原理是相通的。
一般来说,连接引脚包括晶振输入引脚(XTAL1)和晶振输出引脚(XTAL2),分别用来输入晶振的信号和输出晶振的信号,并通过外部电路提供稳定的时钟信号给芯片内部的时钟系统。
五、连接建议在实际应用中,连接晶振时需要注意以下几点:1. 选择合适的晶振型号和频率,根据实际需求选择合适的晶振型号和频率,以保证芯片的工作稳定。
2. 连接线路布局合理,尽量减小晶振到芯片引脚的连接长度,减小外界干扰。
3. 使用合适的外围电路,包括对晶振输入引脚和晶振输出引脚的连接电路、滤波电路等。
六、结语正确连接STM32芯片时钟(晶振)到芯片引脚对于芯片的正常工作和稳定性有着重要的意义,希望本文能为您在实际应用中提供一些帮助。
感谢您的阅读。
七、晶振类型和频率选择在选择晶振类型和频率时,需要根据具体的应用需求进行选择。
一般来说,晶振的频率可以选择从几十kHz到几十MHz不等。
对于低功耗应用,可以选择较低频率的晶振,而对于需要高性能的应用,则需要选择较高频率的晶振。
还需要考虑晶振的负载电容和稳定性等因素,以保证晶振在工作时能够提供稳定可靠的时钟信号。
第八章 STM32定时器

GPIO_ResetBits(GPIOC,GPIO_Pin_0); GPIO_ResetBits(GPIOC,GPIO_Pin_1); GPIO_ResetBits(GPIOC,GPIO_Pin_2); GPIO_ResetBits(GPIOC,GPIO_Pin_3); }
TIM_Perscaler:用户设定的预分频系数, 其值范围从0~65535,为1999
8.7 TIM2应用实例概述
void Timer_Configuration(void) { /*定义TIM结构体变量*/ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_DeInit(TIM2); TIM_TimeBaseStructure.TIM_Period=35999; TIM_TimeBaseStructure.TIM_Prescaler=1999; TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure); TIM_ClearFlag(TIM2,TIM_FLAG_Update); TIM_Cmd(TIM2,ENABLE);
8.7 TIM2应用实例概述
4.定时器的初始化
定时时间T的计算公式: T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK =(35999+1)*(1999+1)/72MHz=1s
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
挂载在APB1上的外设名
#define
RCC_APB1Periph_TIM2 #define RCC_APB1Periph_TIM3 … … #define RCC_APB1Periph_TIM14 #define RCC_APB1Periph_WWDG #define RCC_APB1Periph_SPI2 #define RCC_APB1Periph_SPI3 #define RCC_APB1Periph_USART2 #define RCC_APB1Periph_USART3 #define RCC_APB1Periph_UART4 #define RCC_APB1Periph_UART5 #define RCC_APB1Periph_I2C1 #define RCC_APB1Periph_I2C2 #define RCC_APB1Periph_USB #define RCC_APB1Periph_CAN1 #define RCC_APB1Periph_CAN2 #define RCC_APB1Periph_BKP #define RCC_APB1Periph_PWR #define RCC_APB1Periph_DAC #define RCC_APB1Periph_CEC
嵌入式系统与应用
Embedded System Development
第8章 STM32时钟与GPIO设计
8.1 8.2 8.3 8.4 8.6
时钟设置与开启外设时钟 GPIO简介 GPIO端口配置寄存器 stm32f10x.h库中GPIO代码剖析 GPIO控制LED灯实验
8.1 系统时钟配置与外设时钟开启
((uint32_t)0x00000001) ((uint32_t)0x00000002) ((uint32_t)0x00000100) ((uint32_t)0x00000800) ((uint32_t)0x00004000) ((uint32_t)0x00008000) ((uint32_t)0x00020000) ((uint32_t)0x00040000) ((uint32_t)0x00080000) ((uint32_t)0x00100000) ((uint32_t)0x00200000) ((uint32_t)0x00400000) ((uint32_t)0x00800000) ((uint32_t)0x02000000) ((uint32_t)0x04000000) ((uint32_t)0x08000000) ((uint32_t)0x10000000) ((uint32_t)0x20000000) ((uint32_t)0x40000000)
RCC_APB2Periph_AFIO RCC_APB2Periph_GPIOA RCC_APB2Periph_GPIOB RCC_APB2Periph_GPIOG RCC_APB2Periph_ADC1 RCC_APB2Periph_ADC2 RCC_APB2Periph_TIM1 RCC_APB2Periph_SPI1 RCC_APB2Periph_TIM8 RCC_APB2Periph_USART1 RCC_APB2Periph_ADC3 RCC_APB2Periph_TIM15 RCC_APB2Periph_TIM16 RCC_APB2Periph_TIM17 RCC_APB2Periph_TIM9 RCC_APB2Periph_TIM10 RCC_APB2Periph_TIM11
RCC时钟寄存器组在stm32f10x.h中的定义
typedef struct __IO 宏定义core_cm3.h中: { __IO uint32_t CR; #define __IO volatile; __IO uint32_t CFGR; __IO uint32_t CIR; –volatile,易变的,用变量时需 __IO uint32_t APB2RSTR; 到原地址重新存取。 __IO uint32_t APB1RSTR; uint32_t定义在stdin.h里。 __IO uint32_t AHBENR; __IO uint32_t APB2ENR; typedef unsigned int uint32_t; __IO uint32_t APB1ENR; 知道了结构体首地址就确定RCC __IO uint32_t BDCR; __IO uint32_t CSR; 寄存器组所有32位寄存器的地址, #ifdef STM32F10X_CL 0x04正好是地址偏移量,所以把连 __IO uint32_t AHBRSTR; 续的寄存器组定义为结构。 __IO uint32_t CFGR2; #endif /* STM32F10X_CL */ #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) uint32_t RESERVED0; __IO uint32_t CFGR2; #endif /* STM32F10X_LD_VL || STM32F10X_MD_VL || STM32F10X_HD_VL */ } RCC_TypeDef;
在startup_stm32f10x_hd.s启动文件中,调用__main函 数之前先调用了SystemInit()初始化函数,其中系统时钟 SYSCLK设置:时钟源、倍频、分频it()定义在system_stm32f10x.c文件中,其他 的配置主要在stm32f10x_rcc.c中。 使用外设时,配置初始化后,必须也要开启外设时钟。
2、SetSysClock()函数如下
此函数中选择调用确定使用频率的函数。 static void SetSysClock(void) {#ifdef SYSCLK_FREQ_HSE SetSysClockToHSE(); #elif defined SYSCLK_FREQ_24MHz SetSysClockTo24(); #elif defined SYSCLK_FREQ_36MHz SetSysClockTo36(); #elif defined SYSCLK_FREQ_48MHz SetSysClockTo48(); #elif defined SYSCLK_FREQ_56MHz SetSysClockTo56(); #elif defined SYSCLK_FREQ_72MHz // 使用此项 SetSysClockTo72(); #endif}
欲深入分析时钟配置,就仔细阅读这些最底层的库函数!
8.1.2 开启关闭外设时钟
外设都是挂在AHB、APB1、APB2总线上,要想使用某个外 设,必须初始化外设后,再开启使用开启外设的时钟, 不用时再关闭外设时钟,从而降低STM32的整体功耗。 stm32f10x_rcc.c文件中有开启和关闭外设时钟的库函数 ,如下: RCC_AHBPeriphClockCmd(外设名,ENABLE|DISABLE) –挂在AHB总线外设的开启与关闭函数,ENABLE开启, DISABLE关闭外设时钟; RCC_APB1PeriphClockCmd(外设名,ENABLE|DISABLE) –挂在APB1总线外设的开启与关闭函数; RCC_APB2PeriphClockCmd(外设名,ENABLE|DISABLE) –挂在APB2总线外设的开启与关闭函数;
8.1.1 时钟设置解析
系统时钟SYSCLK是SystemInit()先将配置时钟相关的 寄存器都复位为默认值,再调用SetSysClock()选择使 用频率,而具体设置是通过宏定义设置的。 函数调用顺序: 启动文件 → SystemInit() → SetSysClock () → SetSysClockTo72()。
挂载在AHB的外设名
stm32f10x_rcc.h中对外设名进行了宏定义,看名即知设 备。
#define #define #define #define #define #define #define #define #define #define #define RCC_AHBPeriph_DMA1 ((uint32_t)0x00000001) RCC_AHBPeriph_DMA2 ((uint32_t)0x00000002) RCC_AHBPeriph_SRAM ((uint32_t)0x00000004) RCC_AHBPeriph_FLITF ((uint32_t)0x00000010) RCC_AHBPeriph_CRC ((uint32_t)0x00000040) RCC_AHBPeriph_FSMC ((uint32_t)0x00000100) RCC_AHBPeriph_SDIO ((uint32_t)0x00000400) RCC_AHBPeriph_OTG_FS ((uint32_t)0x00001000) RCC_AHBPeriph_ETH_MAC ((uint32_t)0x00004000) RCC_AHBPeriph_ETH_MAC_Tx ((uint32_t)0x00008000) RCC_AHBPeriph_ETH_MAC_Rx ((uint32_t)0x00010000)
挂载在APB2上的外设名
#define #define #define … … #define #define #define #define #define #define #define #define #define #define #define #define #define #define
1、SystemInit()
STM32时钟系统的SystemInit()中设置:
–SYSCLK(系统时钟)=72MHz –AHB总线时钟(使用SYSCLK)=72MHz –APB1总线时钟(PCLK1)=36MHz –APB2总线时钟(PCLK2)=72MHz –PLL时钟=72MHz 用到的RCC寄存器复位值: –RCC_CR = 0x0000 xx83; –RCC_CFGR = 0x0000 0000; –RCC_CIR = 0x0000 0000; –RCC_CFGR2 = 0x0000 0000; –… … 这些RCC时钟寄存器组名的宏定义与其他外设寄存器名定 义都在stm32f10x.h文件中。