STM32初学者心得(时钟系统)-必需认真看完
stm32实训报告经验总结
stm32实训报告经验总结STM32实训报告经验总结一、引言在这次STM32实训中,我深入了解了微控制器的基本原理和操作,学会了使用Keil MDK-ARM软件进行编程,掌握了STM32的GPIO、串口、定时器等基本外设的使用。
通过实际操作,我对于嵌入式系统设计和开发有了更深刻的理解。
二、实训过程1. 基础知识学习:首先,我通过阅读教材和网上资料,学习了微控制器的基本概念、STM32的体系结构和外设特性。
我了解到,STM32是一款功能强大的32位ARM Cortex-M核微控制器,具有丰富的外设接口和强大的处理能力。
2. 开发环境搭建:我按照教程安装了Keil MDK-ARM软件,配置了开发环境。
Keil软件提供了完整的开发工具链,包括代码编辑、编译链接、调试和仿真等功能。
3. 硬件平台搭建:我使用STM32开发板搭建了硬件平台。
我熟悉了开发板的电路原理图和引脚配置,了解了各个外设接口的使用方法。
4. 编程实践:在理解了基本概念和操作方法后,我开始进行编程实践。
我编写了GPIO输入输出、串口通信、定时器中断等程序,通过实际操作掌握了STM32的基本外设使用。
5. 调试与优化:在编程过程中,我遇到了许多问题,通过查阅资料和反复调试,最终解决了问题。
我还对程序进行了优化,提高了程序的效率和稳定性。
三、实训收获通过这次实训,我掌握了STM32微控制器的开发流程和基本外设的使用方法。
我学会了使用Keil MDK-ARM软件进行编程和调试,了解了嵌入式系统设计和开发的实际操作过程。
同时,我在实践中遇到了许多问题,通过解决问题,我提高了解决问题的能力。
四、展望未来这次实训让我对嵌入式系统设计和开发有了更深刻的理解。
在未来的学习和工作中,我将继续深入学习嵌入式系统的相关知识,掌握更多的技能和方法。
同时,我将尝试将所学知识应用到实际项目中,提高自己的实践能力和工程经验。
STM32入门教程--系统时钟配置
STM32 系统时钟配置一、STM32的时钟系统时钟是什么?时钟通常是振荡器(如晶振)产生的特定频率的方波信号,时钟周期是时钟频率的倒数,时钟频率1MHz时钟周期为1/1000000=1us。
时钟周期是MCU处理指令的最小时间单元,每个程序指令都需要若干个时钟周期,MCU的时钟频率越快,完成一个指令的时间就越短,速度就越快。
时钟是MCU运行的基础,好比MCU的脉搏,是MCU性能的重要参数。
每个MCU 都是在某个特定的时钟频率下进行工作的,如C51单片机时钟频率为12MHz,而STM32F103 的系统时钟频率是72MHz。
STM32的时钟系统STM32时钟频率较高,时钟越快功耗越大,同时抗电磁干扰能力也会越弱。
而且STM32外设非常多,而通常外设是不需要像系统时钟那么高的频率的,比如看门狗和RTC 只需要几十K的时钟即可。
另外实际使用的时候通常只会用到有限的几个外设,STM32可以只给需要启动的外设分配时钟,以此来降低功耗。
由此可看出STM32 的时钟系统较为复杂,它采用了多个时钟源的方法来解决这些问题。
STM32 有4个独立时钟源:HSI、HSE、LSI、LSE。
①、HSI是高速内部时钟,RC振荡器,频率为8MHz,精度不高。
②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。
③、LSI是低速内部时钟,RC振荡器,频率为40kHz,提供低功耗时钟。
④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。
其中LSI是作为IWDGCLK(独立看门狗)时钟源和RTC时钟源而独立使用,HSI高速内部时钟 HSE高速外部时钟 PLL锁相环时钟这三个经过分频或者倍频作为系统时钟来使用基本时钟源(图中绿色箭头指出):(1)HSI高速内部时钟,RC振荡器,8MHz。
(2)HSE高速外部时钟,石英/陶瓷谐振器,8MHz。
(3)LSI低速内部时钟,RC振荡器,40kHz。
STM32全面学习总结
一、文档和库规范固件库命名规则(1)外设函数的命名以该外设的缩写加下划线为开头。
每个单词的第一个字母都由英文字母大写书写,例如:SPI_SendData。
在函数名中,只允许存在一个下划线,用以分隔外设缩写和函数名的其它部分。
(2)名为PPP_Init的函数,其功能是根据PPP_InitTypeDef中指定的参数,初始化外设PPP,例如TIM_Init.(3)名为PPP_DeInit的函数,其功能为复位外设PPP的所有寄存器至缺省值,例如TIM_DeInit.(4)名为PPP_StructInit的函数,其功能为通过设置PPP_InitTypeDef 结构中的各种参数来定义外设的功能,例如:USART_StructInit(5)名为PPP_Cmd的函数,其功能为使能或者失能外设PPP,例如:SPI_Cmd.(6)名为PPP_ITConfig的函数,其功能为使能或者失能来自外设PPP某中断源,例如:RCC_ITConfig. (7)名为PPP_DMAConfig的函数,其功能为使能或者失能外设PPP的DMA接口,例如:TIM1_DMAConfig. 用以配置外设功能的函数,总是以字符串“Config”结尾,例如GPIO_PinRemapConfig.(8)名为PPP_GetFlagStatus的函数,其功能为检查外设PPP某标志位被设置与否,例如:I2C_GetFlagStatus. (9)名为PPP_ClearFlag的函数,其功能为清除外设PPP标志位,例如:I2C_ClearFlag. (10)名为PPP_GetITStatus 的函数,其功能为判断来自外设PPP的中断发生与否,例如:I2C_GetITStatus.(11)名为PPP_ClearITPendingBit的函数,其功能为清除外设PPP中断待处理标志位,例如:I2C_ClearITPendingBit.编码规则变量布尔型在文件stm32f10x_type.h中,布尔形变量被定义如下:typedef enum {FALSE = 0,TRUE = !FALSE} bool;标志位状态类型在文件stm32f10x_type.h中,我们定义标志位类型(FlagStatus type)的2个可能值为“设置”与“重置”(SET or RESET)。
stm32时钟系统 -
STM32片上时钟分析一、结论1、f107应当使用25MHz晶振。
若采用8MHz的晶振,搭配3.0.0版固件库,则将f107当做f103使用,不能驱动通信线产品所有功能(以太网)。
2、以太网的时钟可以参考f107数据手册,附录A2.二、stm32f107的片上时钟系统f107与f103时钟系统略有不同,以下讨论除非特别说明,全都针对f107,采用25MHz 晶振,时钟树见附录。
1、系统时钟:SYSCLK系统复位后,HSI振荡器被选为系统时钟(8MHz),通过软件(SystemInit()函数)将系统时钟源切换到PLLCLK。
PLLCLK的来源是外部晶振HSE,由HSE信号经过5分频、8倍频、5分频、9倍频得到,为72MHz。
(若在f107上采用8MHz晶振,则将HSE信号9倍频得到PLLCLK(72MHz),即系统时钟)2、RTC时钟源来自32.768kHZ晶振。
3、金牛版上另外有一个25MHz的晶振,供给以太网PHY。
三、时钟系统初始化(SystemInit()函数)此函数在3.0.0与3.1.2版本固件库中是不同的。
相较于f103,f107在硬件上多了两个锁相环和一个CFGR2寄存器,并且定义了CR寄存器的26~29位。
3.0.0版本固件库升级为3.1.2版本,正是为了配合这种变化,并实现新增的功能。
调用3.0.0库中的SystemInit()函数,结果如下:寄存器值CR 0101 0083CFGR 001D 0402CFGR2 函数未涉及此寄存器CIR 0000 0000对此不作过多讨论,这样的方式会使以太网无法使用。
调用3.1.2库中的SystemInit()函数,结果如下:寄存器值CR 0501 0083CFGR 001D 0402CFGR2 0001 0644CIR 009F 0000前三个寄存器配置了系统时钟,CIR是对中断的设置。
这样,系统时钟的来源如下图。
蓝色为复位后的时钟系统,红色为软件设置的时钟。
STM32入门系列-STM32时钟系统,时钟使能配置函数
STM32⼊门系列-STM32时钟系统,时钟使能配置函数 之前的推⽂中说到,当使⽤⼀个外设时,必须先使能它的。
怎么通过库函数使能时钟呢?如需了解寄存器配置时钟,可以参考《STM32F10x中⽂参考⼿册》“复位和时钟控制(RCC)”章节,其中有详细的寄存器介绍。
固件库已经把时钟相关寄存器的使能配置都封装好,放在stm32f10x_rcc.c和stm32f10x_rcc.h中。
只需要打开stm32f10x_rcc.h⽂件,会发现有很多的宏定义和时钟使能函数的声明。
这些时钟函数可⼤致分为三类。
⼀类是外设时钟使能函数,⼀类是时钟源和倍频因⼦配置函数,还有⼀类是外设复位函数。
当然还有⼏个获取时钟源配置的函数。
下⾯就来简单介绍下这些函数的使⽤。
⾸先看⼀下时钟使能函数,时钟使能函数包括外设时钟使能和时钟源使能。
外设时钟使能相关函数如下:void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);上⾯3个时钟使能函数也正是STM32的3条总线(这个在前⾯介绍存储器与寄存器章节讲过)。
由于STM32的外设都是挂接在AHB和APB 总线上的,所以要使能外设时钟,也就是使能对应外设所挂接的总线时钟。
⽐如GPIO外设它是挂接在APB2总线上的,如果使⽤GPIO外设,就需要先使能APB2总线时钟,使能时钟代码如下。
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph,FunctionalState NewState);要想哪个外设挂接在哪个总线上呢,可以通过STM32中⽂参考⼿册查找,还可以在固件库stm32f10x_rcc.h⽂件中查找。
STM32使用心得
STM32使用心得第一篇:STM32使用心得stm32使用心得第一次使用stm32,以前用过51、avr、pic、2812,感觉stm32还真有点不一样,呵呵。
因为是第一次使用,下面说的肯定有不少错误,诚心求大家指正。
这次做的是用stm32f103zd+lattice 的lc4256v做一个波形发生器。
通过上位机可以控制生成波形的频率,然后stm32根据频率计算波形占空比数据,通过总线形式传给cpld,然后cpld把这些数据转换成相对应占空比的pwm输出,外部接RC滤波电路,产生相对应的波形。
由于频率范围较大,计算量也比较大,所以采用了stm32+cpld 的结构。
Stm32运行在72MHZ,通过mco脚给cpld 36M HZ的时钟,stm32和cpld通过总线方式通信。
此系统中Stm32主要用到的资源是:一个UART,一个TIMER及其中断,FSMC和DMA。
本人总结了下,Stm32初始化一个片内外设一般过程一般有以下几部分:1.InitStructure配置及初始化2.时钟使能3.相对应的IOInitStructure配置及初始化4.相对应的IO时钟使能5.外设使能6.中断配置及中断程序编写下面介绍一下自己所用的UART、TIMER、FSMC、DMA的初始化。
UART初始化:此系统中使用的是UART2,未用UART中断。
UART初始化主要有:IO初始化,UART InitSturcture初始化,UART时钟使能,UART 使能。
程序如下: GPIO_InitTypeDef GPIO_InitStructure;// Configure USART2_Tx as alternate push-pullGPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);// Configure USART2_Rx as input floatingGPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);//IO时钟使能RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);USART_InitTypeDef USART_InitStructure;/* USART2 configured as follow:-BaudRate = 9600 baud-Word Length = 8 Bits-One Stop Bit-No parity-Hardware flow control disabled(RTS and CTS signals)-Receive and transmit enabled*/USART_ART_BaudRate = 9600;USART_ART_WordLength = USART_WordLength_8b;USART_ART_StopBits = USART_StopBits_1;USART_ART_Parity = USART_Parity_No;USART_ART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx;/* Configure the USART2*/USART_Init(USART2, &USART_InitStructure);//UART时钟使能RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);/* Enable the USART2 */USART_Cmd(USART2, ENABLE);TIMER初始化使用的是TIM2。
stm32实训心得体会
stm32实训心得体会篇一:STM32 实验2报告实验2MINI STM32按键控制LED灯实验一、实验目的1、掌握嵌入式程序设计流程。
2、熟悉STM32固件库的基本使用。
二、实验内容1、编程使用I/O口作为输入,控制板载的两个LED 灯。
2、使用固件库编程。
三、实验设备硬件: PC机一台MINI STM32开发板一套软件: RVMDK 一套Windows XP 一套四、实验步骤1、设计工程,使用固件库来编程设置。
、在这里我们建立一个文件夹为: STM32-Projects.点击Keil 的菜单:Project –>New Uvision Project ,然后将目录定位到刚才建立的文件夹STM32-Projecst 之下,在这个目录下面建立子文件夹shiyan1, 然后定位到 shiyan1目录下面,我们的工程文件就都保存到shiyan1 文件夹下面。
工程命名为shiyan1, 点击保存.是这个型号。
、这里我们定位到STMicroelectronics 下面的STM32F103RB ,然后点击Add ,然后Close.、用同样的方法,将 Groups 定位到CORE 和USER 下面,添加需要的文件。
这里我们的CORE 下面需要添加的文件为core_ ,startup_stm32f10x_ ,USER 目录下面需要添加的文件为,stm32f10x_,system_ 这样我们需要添加的文件已经添加到我们的工程中去了,最后点击 OK,回到工程主界面、下面我们要告诉 MDK,在哪些路径之下搜索相应的文件。
回到工程主菜单,点击魔术棒,出来一个菜单,然后点击 c/c++ 选项. 然后点击 Include Paths 右边的按钮。
弹出一个添加path 的对话框,然后我们将图上面的 3 个目录添加进去。
记住,keil 只会在一级目录查找,所以如果你的目录下面还有子目录,记得path 一定要定位到最后一级子目录。
Stm32 学习笔记1--时钟
Stm32 学习笔记1—时钟1、5个时钟源HSI、HSE、LSI、LSE、PLLHIS:内部高速时钟HSE:外部高速时钟LSI:内部低速时钟LSE:低速外部时钟PLL:锁相环输出2、AMBA总线AHB:系统总线APB:外设总线,其总APB2为高速外设总线,APB1为低速外设总线外设时钟使能函数:NewState取值:ENABLE或DISABLEvoid RCC_APB2PeriphClockCmd(u32 RCC_APB2Periph, FunctionalState NewState)void RCC_APB1PeriphClockCmd(u32 RCC_APB1Periph, FunctionalState NewState)系统时钟使能函数:NewState取值:ENABLE或DISABLE需要使用某一或多个外设时需打开相对应的时钟,多个时钟用“|”分隔3、RCC相关寄存器3.1寄存器名称和功能描述①一个32位的时钟控制寄存器(RCC_CR)②一个32位的时钟配置寄存器(RCC_CFGR)③一个32位的时钟中断寄存器(RCC_CIR)④一个32位的APB2外设复位寄存器(RCC_APB2RSTR)⑤一个32位的APB1外设复位寄存器(RCC_APB1RSTR)⑥一个32位的AHB外设时钟使能寄存器(RCC_AHBENR)⑦一个32位的APB2外设时钟使能寄存器(RCC_APB2ENR)⑧一个32位的APB1外设时钟使能寄存器(RCC_APB1ENR)⑨一个32位的备份域控制寄存器(RCC_BDCR)⑩一个32位的控制/状态寄存器(RCC_CSR)3.2结构定义和访问方法typedef struct{vu32 CR;vu32 CFGR;vu32 CIR;vu32 APB2RSTR;vu32 APB1RSTR;vu32 AHBENR;vu32 APB2ENR;vu32 APB1ENR;vu32 BDCR;vu32 CSR;} RCC_TypeDef;#define RCC_BASE (AHBPERIPH_BASE + 0x1000)#ifdef _RCC#define RCC ((RCC_TypeDef *) RCC_BASE)#endif /*_RCC */其中AHBPERIPH_BASE=(u32)0x40020000,那么RCC指向0x400210003.3RCC配置方法:void RCC_Configuration(void){RCC_DeInit();/*RCC复位*/RCC_HSEConfig(RCC_HSE_ON);/*打开外部高速时钟晶振HSE ,Enable HSE */ HSEStartUpStatus = RCC_WaitForHSEStartUp();/*等待直到晶振准备好*/if(HSEStartUpStatus == SUCCESS)/*晶振准备好*/{FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/*使能FLASH半周期访问*/FLASH_SetLatency(FLASH_Latency_2);/*设置代码延时值*//*********************************************************************************************************************************************/ RCC_HCLKConfig(RCC_SYSCLK_Div1);/*置AHB时钟(HCLK), AHB时钟= 系统时钟/1*/RCC_PCLK2Config(RCC_HCLK_Div1); /*高速时钟APB2时钟= HCLK */RCC_PCLK1Config(RCC_HCLK_Div2);/*低速时钟APB1时钟= HCLK / 2 */RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);/*设置PLL时钟源及倍频系数,外部时钟8M,倍频数9*//*****************************************************************************原型:void RCC_PLLConfig(u32 RCC_PLLSource, u32 RCC_PLLMul)*********************************************************************************/RCC_PLLCmd(ENABLE);/*PLL使能*//*等待锁相环输出稳定*/while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}/* 选择系统时钟源*/RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/****************************************************************************************************************************************************/ /* 返回当前系统时钟源0x00:HSI,0x04:HSE,0x08:PLL */while(RCC_GetSYSCLKSource() != 0x08){}}/* 以后内容设置外部设备时钟使能*/……….}。
STM32学习心得(新手必看)
STM32学习心得(新手必看)(作者:logokfu 邮箱:g535343589@ )在这里说下我的学习心得体会(照顾下新手,老鸟都表笑哦,呵呵)。
说下关于开发环境的建立,都说万事开头难,每种芯片都有它的开发环境,首先得熟悉STM32的开发环境。
用的最多就是MDK 和IAR 了,关于MDK ,这个用过51单片机的筒子肯定都知道keil uvision 。
这个MDK 其实就是专门开发ARM 芯片的工具。
开发51单片机的那个叫C51 。
这个C51和MDK 共同使用keil uvsion 这个UI 界面。
也是说C51和MDK 共同使用keil uvsion 这个外壳。
好了,关于开发软件的介绍就介绍这么多,有什么还不清楚的,筒子们可以邮箱联系我。
当然支持STM32的集成开发环境(IDE )还不止MDK 和IAR ,只不过这两个使用的人相对其他工具来说用的人比较多吧。
另外 RIDE, HiTOP , TrueSTUDIO 这个三个开发工具也支持STM32的开发(可能还有其他的工具,不过我不知道)。
有兴趣的盆友可以使用下尝尝鲜。
说下关于ST 官方为我们提供的固件库的使用问题。
不要觉得固件库是这个什么可怕的东西,固件库是ST 为用户提供的函数库,这些函数帮我们一次性解决多个寄存器的设置问题。
如果没有固件库的话,那么我们就需要像使用51单片机那样直接设置要使用的寄存器,在51单片机上为寄存器直接赋值可能没什么的,但是由于STM32的寄存器太多,如果一个个设置的话会很麻烦,有时候还会忘掉某些寄存器的设置,ST 提供的固件库正是为我们提供了这些方便。
我们只需要为相关函数指定参数就可以完成寄存器的设置了。
为产品的快速开发提供了保障。
当然新固件库是好,但是却会对新手理解硬件结构造成一定的影响。
有的人喜欢直接为STM32的寄存器直接赋值,说这样子比较直观,有的人喜欢使用固件库。
当然这个是个人喜好,大家可以根据自己的喜好进行选择。
stm32cubemx实验报告总结和心得
stm32cubemx实验报告总结和心得在进行STM32Cubemx实验的过程中,我深深感受到了这款软件的便利和强大。
STM32Cubemx是一款由STMicroelectronics公司开发的工具,它可以帮助开发人员快速生成基于STM32微控制器的初始化代码,极大地降低了开发的难度和工作量。
在本次实验中,我使用STM32Cubemx完成了一个简单的LED控制实验,并获得了一些宝贵的心得和体会。
首先,STM32Cubemx的界面简洁直观,操作相对简单。
在使用过程中,我发现该软件提供了丰富的代码生成选项,包括时钟配置、引脚配置、外设配置等等。
通过简单地点击和选择,我就能够轻松地生成所需的初始化代码,并将其导入到我的项目中。
其次,STM32Cubemx支持多种外设的配置和集成。
在实验中,我需要控制一个LED的亮灭,并通过按键来进行触发。
通过STM32Cubemx,我可以方便地配置GPIO引脚的输入输出,并将按键和LED与相应的引脚连接起来。
这种可视化的配置方式使得硬件和软件之间的连接变得更加简单和直观。
此外,STM32Cubemx还提供了一些实用的功能和资源。
在实验中,我遇到了一些问题,例如外设的中断处理和时钟配置等。
通过查阅STM32Cubemx的在线文档和社区论坛,我很快找到了解决方案,并成功地解决了这些问题。
这些资源的丰富性和及时性为我提供了很大的帮助,也让我的实验进展得更加顺利。
综上所述,STM32Cubemx是一款功能强大且易于使用的STM32微控制器代码生成工具。
在本次实验中,我通过使用STM32Cubemx完成了LED控制实验,并获得了许多宝贵的心得和体会。
我相信,在今后的学习和工作中,我将继续利用STM32Cubemx这一强大工具,提高我的开发效率和项目质量。
基于stm32通用定时器设置的学习心得
基于stm32通用定时器设置的学习心得为APB1 总线,所以首先,得将APB1 外设时钟打开。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);其次,就是定时器的相关参数信息的配置,这些参数信息都在TIM_TimeBaseInitTypeDef 这么一个结构体当中,所以得定义这么一个结构体变量。
结构体中的有关成员含义如下:TIM_TimeBaseInitStrcture.TIM_Prescaler = 0x1c20; //时钟预分频系数,看单词意思就知道了,即是将APB1 时钟进行相应分频得到一个合适的频率TIM_TimeBaseInitStrcture.TIM_CounterMode = TIM_CounterMode_Up; //计数模式TIM_TimeBaseInitStrcture.TIM_Period = 0x270f; //计数周期,即是往ARR 寄存器中填的一个自动转载值,这个值等于目标值-1TIM_TimeBaseInitStrcture.TIM_ClockDivision=TIM_CKD_DIV1; //这是数字滤波器的相关设置,定时的时候不用外部时钟,所以这个设为0 即可,TIM_CKD_DIV1 这个就是等价于0,你要是设为其他值也不影下面自然是初始化这个结构体当中的参数信息了。
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStrcture);再次,就是定时器中断的相关配置了,在配置中断的时候特别一定要注意顺序,否则就会出问题,我一开始就是没注意这个顺序问题,看着错误还不知道怎么回事,还好后面被我发现,哈哈。
在使能中断之前一定得先清掉中断中断标志位和中断挂起位,如下:TIM_ClearFlag(TIM2, TIM_FLAG_Update);TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update);TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);如果不先清掉挂起位和标志位,那么一使能中断,就立马进入中断服务函数,显然这不是我们想要的,我就被这个问题整了一下。
先看一张STM32时钟系统框图
先看一张STM32时钟系统框图在STM32中,有五个时钟源,分别是为HSI、HSE、LSI、LSE、PLL。
HSI内部高速RC振荡时钟,8MHz;HSE,外部高速时钟,4M__16MHZ;LSI,内部低速RC 时钟,40KHZ;LSE外部低速时钟,32.768KHz;PLL锁相环倍频,由图可知,可以选择HSE/2、HSI/2、HSE,倍频系数可以是2——16,但是不要超过72MHz。
SYSCLK系统时钟,由图可知可以选择HSE、HSI、PLLCLK的一种,最高72MHz,通过AHB分频器后送给各个模块,AHB分频可以选择1、2、4、8、16、64、128、256 、512,AHB分频后送给5大模块使用。
1HCLK ,也就是AHB总线、内核、内存和DMA使用的HCLK时钟2 通过8分频后送给Cortex的系统定时器时钟3 直接送给Cortex的空闲运行时钟FCLK4 送给APB1分频器。
APB1分频器可选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路定时器(Timer)2、3、4倍频器使用。
该倍频器可选择1或者2倍频,时钟输出供定时器2、3、4使用5 送给APB2分频器。
APB2分频器可选择1、2、4、8、16分频,其输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给定时器(Timer)1倍频器使用。
该倍频器可选择1或者2倍频,时钟输出供定时器1使用。
另外,APB2分频器还有一路输出供ADC分频器使用,分频后送给ADC模块使用。
ADC分频器可选择为2、4、6、8分频。
注意定时器的倍频器,当APB的分频为1时,它的倍频值为1,否则它的倍频值就为2。
连接在APB1(低速外设)上的设备有:电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、窗口看门狗、Timer2、Timer3、Timer4。
stm32:系统时钟
stm32:系统时钟实验4 系统时钟实验上⼀章,我们介绍了STM32 内部系统滴答定时器,该滴答定时器产⽣的延时⾮常精确。
在本章中,我们将⾃定义RCC系统时钟,通过改变其倍频与分频实现延时时间变化,实现LED灯闪烁效果。
通过本章的学习,你将了解 RCC系统时钟的使⽤。
本章分为以下学习⽬标:1、了解 STM32 的系统构架。
2、了解 STM32 的时钟构架。
3、了解 RCC 时钟的操作步骤。
1.1 STM32 的系统构架STM32 的时钟⽐较复杂,它可以选择多种时钟源,也可以选择不⼀样的时钟频率,⽽且在系统总线上⾯,每条系统的时钟选择都是有差异的。
所以想要清楚的了解 STM32 的时钟分配,我们先来了解⼀下 STM32 的系统构架是什么样的。
从上图我们知道,RCC 时钟输出时钟出来,然后经过 AHB 系统总线,分别分配给其他外设时钟,⽽不⼀样的外设,是先挂在不⼀样的桥上的。
⽐如: ADC1、ADC2、 SPI1、GPIO 等都是挂在 APB2 上⾯,⽽有些是挂在 APB1上⾯,所以,虽然它们都是从 RCC 获取的时钟,但是它们的频率有时候是不⼀样的。
1.2 STM32 的时钟树STM32 单⽚机上电之后,系统默认是⽤的时钟是单⽚机内部的⾼速晶振时钟,⽽这个晶振容易受到温度的影响,所以晶振跳动的时候不是有⼀定的影响,所以⼀般开发使⽤的时候都是使⽤外部晶振,⽽且单⽚机刚启动的时候,它的时钟频率是 8MHZ,⽽STM32 时钟的最⾼频率是 72MHZ,所以单⽚机⼀般开机之后运⾏的程序是切换时钟来源,并设置时钟频率。
⼤家可能有点疑惑,在第⼀章到第三章之中,我们并没有看到单⽚机开机之后设置时钟来源和时钟频率的。
其实在使⽤库函数的时候,其实在库函数启动⽂件⾥⾯,是帮助我们把时钟频率设置到 72MHZ 了。
⼤家可以打开⼀个库函数⼯程,在 system_stm32f10x.c 的第 106⾏,它定义了⼀个 SYSCLK_FREQ_72MHz:#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_72MHz 72000000然后在下⾯的程序中,根据这个 SYSCLK_FREQ_72MHz 定义,它默认设置成72MHZ。
stm32心得体会
stm32心得体会我使用STM32微控制器进行项目开发的经验已经超过一年了。
我通过这段时间的使用和学习,对STM32的性能和特点有了更深入的理解。
下面是我使用STM32的心得体会。
首先,STM32具有强大的处理能力。
它采用了Cortex-M系列的ARM内核,具有高速的时钟频率和丰富的内存空间,使得它能够处理复杂的任务和多个外设的同时操作。
我在实际的开发中,使用STM32处理各种传感器数据、驱动各种执行器等,都能够得到良好的性能。
同时,STM32还支持多核、多任务的处理方式,进一步提高了系统的处理能力。
其次,STM32具有丰富的外设资源。
它具有多个GPIO口、定时器、串口通信接口、I2C、SPI等多种外设,能够满足各种应用的需求。
我在实际的项目中,经常需要使用到串口通信、定时器和GPIO口等,STM32提供了非常简洁方便的API,使得开发工作变得更加简单高效。
同时,STM32还支持中断机制和DMA传输,大大提高了系统的响应速度和数据传输效率。
此外,STM32还具有丰富的开发工具和生态系统。
ST官方提供了STM32CubeMX软件,能够快速生成初始化代码和配置文件,大大提高了开发的效率。
同时,ST还提供了丰富的开发文档和示例代码,以及一系列的开发板和调试工具,方便开发者进行硬件测试和调试。
此外,STM32生态系统还有许多第三方库和开发工具,丰富了开发者的选择和功能。
最后,我认为使用STM32进行开发具有较高的学习门槛。
由于STM32架构较为复杂,对硬件和软件的理解要求较高。
同时,STM32的开发工具和文档也相对复杂,需要一定的学习成本。
对于初学者来说,建议先了解一些基本的电子和嵌入式系统知识,再进行STM32开发。
但是一旦熟悉了STM32的开发流程和API,就能够快速进行项目开发。
综上所述,STM32作为一款强大的微控制器,具有高性能、丰富的外设资源和完善的开发工具,非常适合用于嵌入式系统的开发。
我通过使用STM32进行项目开发,不仅提高了技术水平,也获得了一些实际的应用经验。
stm32秒表心得体会
stm32秒表心得体会一、我的经验二、如何写好时间的读秒:首先要明确,我们这里所指的读秒是在测量系统误差允许范围内的读秒。
有很多朋友反映自己对数字不敏感,为了准确地读出秒,可以在日常学习和工作中培养一下良好的习惯,比如记录好第几天进行几次读秒(最好把它列个表),做到心中有数。
当然对于电子计算机的高级用户来讲,本着简便快捷的原则,完全可以根据人脑判断来读取或者修改时间。
三、如何写好时间的读秒:秒表从外形上分,大致分两类。
1.全能型。
就是那种只显示年月日星期和小时分钟秒的表;2.万能型。
它除了这些功能外,还带有一定程度的计算、存储等功能,这样使得其可操作性更强。
现在市面上的主流产品一般都采用万能型,因此也可称之为“通用型”的秒表。
按照测量方式的不同又可将秒表分为单点秒表和多点秒表。
在使用方法上,我建议选择后者。
但是无论哪一种秒表,它们与我们的生活都息息相关,只要掌握好正确的读法,熟练运用,它们就会为你的生活增添色彩。
四、关于工具和环境的问题1.计时器不宜放置在阳光直射的地方或热源附近。
特别是太阳能的影响,太阳辐射容易导致电子装置的计时误差加大。
即使在阴凉处,温度变化大,同样会影响计时的精度。
另外,如果使用室内计时器,注意应远离各种电气设备,避免干扰信号。
2.不要让秒表受震动,例如敲击,晃动或翻转,这样可能造成滑块松脱而损坏秒针。
3.不要让秒表靠近磁场,例如计算机,手机等等。
由于无线信号传送需要的电磁波较长,因此在距离计时器十米左右的地方使用无线装置,效果会更佳。
4.不要让计时器靠近任何强烈的气味。
当然除非已被证实它发出的味道没有危险性,否则请尽量远离各种食物。
五、关于本人在课堂上遇见过的典型错误问题1.在实际应用中怎么判断零刻度值是否准确?例如,机械秒表上的表盘上的刻度代表0°,1°,10°,20°,30°等等,当看到某位数字比较模糊,例如180°,150°,100°……在实际应用中,由于部件摩擦,转动齿轮,皮带轮……这些部件都会产生微小的偏移,这种偏移就叫做误差,而用仪器检查它的方法就叫做校表。
自己整理STM32学习笔记(关于 时钟)
STM32学习----时钟(转载)在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。
①、HSI是高速内部时钟,RC振荡器,频率为8MHz。
②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。
③、LSI是低速内部时钟,RC振荡器,频率为40kHz。
④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。
⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。
倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。
其中40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。
另外,实时时钟RTC的时钟源还可以选择LSE,或者是HSE的128分频。
RTC的时钟源通过RTCSEL[1:0]来选择。
STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。
该时钟源只能从PLL输出端获取,可以选择为1.5分频或者1分频,也就是,当需要使用USB模块时,PLL必须使能,并且时钟频率配置为48MHz或72MHz。
另外,STM32还可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为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的系统定时器时钟。
③、直接送给Cortex的空闲运行时钟FCLK。
④、送给APB1分频器。
APB1分频器可选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给定时器(Timer)2、3、4倍频器使用。
STM32时钟配置方法详解
STM32时钟配置方法详解时钟树是STM32微控制器中一系列时钟源和时钟分频器的组成部分。
时钟树包括系统时钟、外设时钟和内核时钟。
系统时钟用于驱动整个微控制器系统的核心,外设时钟用于驱动各种外设,内核时钟用于驱动CPU的运算。
在进行时钟配置之前,首先需要了解系统所需的时钟频率。
在STM32中,系统时钟可以通过多种方式进行配置,例如使用外部晶体、外部时钟、内部RC振荡器或者PLL(锁相环)等方式。
外部晶体是一种常用的时钟源,可以提供高精度的时钟频率。
在使用外部晶体时,首先需要设置PLL的时钟源为外部晶体,并设置PLL输入除频器的分频系数。
然后,再根据系统所需的时钟频率,设置PLL的倍频系数,以得到最终的系统时钟频率。
外部时钟是从外部提供的时钟信号,一般用于测试和调试。
使用外部时钟时,需要设置PLL的时钟源为外部时钟,并设置PLL的倍频系数,以得到所需的系统时钟频率。
内部RC振荡器是一种低成本的时钟源,但是其频率不如外部晶体稳定和精确。
在使用内部RC振荡器时,需要设置PLL的时钟源为内部RC振荡器,并设置PLL的倍频系数,以得到所需的系统时钟频率。
PLL是一种用于产生稳定高频时钟的电路,可以从一个低频时钟源产生一个高频时钟源。
使用PLL时,需要设置其输入时钟源和倍频系数。
系统时钟的分频系数可以通过RCC_CFGR寄存器进行设置。
RCC_CFGR寄存器的各个位域用于配置系统时钟的分频系数,包括分频因子、APB1的分频系数、APB2的分频系数等。
外设时钟是用于驱动外设的时钟,可以由系统时钟分频得到。
外设时钟的分频系数可以通过RCC_CFGR寄存器及各个外设的控制寄存器进行设置。
内核时钟是用于驱动CPU的运算的时钟。
在STM32微控制器中,CPU 时钟可以由系统时钟分频得到,分频系数可以通过RCC_CFGR寄存器和FLASH_ACR寄存器进行设置。
除了上述方法之外,STM32还可以使用时钟配置工具进行时钟配置。
STM32学习体会
STM32学习体会STM32学习体会学习STM32也有一段时间了,周围的人也在学习这款单片机,感觉它是越来越流行,没办法,功能强大,又便宜,谁不愿意用呢。
搞不懂A VR,现在都快被挤兑成诺基亚了,还是死守价格不便宜!没学的就跳过啊,STM32,MSP430都是不错的选择因为暑假的时候学了MSP430,所以现在学STM32让我感觉很容易就上手了,相比51,主要是初始化更加繁琐了,没办法嘛,功能强大,寄存器就多,多了配置起来就复杂一些。
个人感觉一开始还是走寄存器路线,因为只有学懂了底层的东西才能更好的理解它的功能是怎么实现的,才能从中找出来捷径。
以后的话貌似还可以走库函数路线,那样可以大大的缩短开发周期。
几乎所有的单片机开始都是在介绍IO口,但是我感觉在此之前应该学习一下时钟,STM32的时钟使能分的HH特别细,每一个外设都有一个对应的时钟使能位,还有相对应的复位位,基本上都在RCC->APB1ENR,RCC->APB2ENR 两个寄存器里面,几乎初始化每一个外设之前,包括IO口,都要使能它的时钟,STM32还有一个后背区,当单片机复位的时候,这个区域是不会复位的,它的RTC模块只要有后备电源,即使单片机关机了,也可以给你提供大概136年的实时时钟计时!下面就是IO口了,它的IO口有8种模式,但是常用的就那么几种,推拉式输出,推拉式输入,复用功能等等,每四位控制一个IO口,最常用的就是0X8,0X3。
使能了时钟,设置好模式,就可以使用它的IO了,输出电平的高低就是控制ODR,输入就是读IDR,但是这两个寄存器只能整体访问。
但是STM32所有的位带操作为我们可以像操作51一样操作它的IO提供了可能,例如,如果要控制PA1这一位,只要对PAout(1),PAin(1)操作就行了,免去了数据的位运算!还有一点就是注意特殊IO,因为有的IO复位的时候默认是复用功能,如和JTAG有关的几个IO,如果你想把它当成普通IO使用,先把JTAG禁用了之后就OK了。