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){}}/* 以后内容设置外部设备时钟使能*/……….}。