稀里糊涂学习STM32全本
stm32学习经历(5篇可选)
stm32学习经历(5篇可选)第一篇:stm32学习经历随便写写,关于stm32 最近在学习stm32,写点东西,虽然简单,但都是原创啊开发板是前辈画的,好像是用来测试一个3G功能的,不过对于我来说太远;我要来了3个,自己焊了一个最小系统,好在公司资源还是不错的,器件芯片有,还可以问问前辈--对公司还是比较满意的,虽然工资少了点,但学东西第一位O(∩_∩)O~。
最开始当然是建工程了,这个真不太会,前前后后竟用了一周(时间真长,别见笑啊),上网查资料,问前辈,自己琢磨。
总算搞定,然后从GPIO开始学,开始还真没什么头绪(虽然在大学学点51,但完全没有真正应用,顶多是跑马灯实验),开始纠结是从寄存器开始学还是从库函数开始学,后来看到一句“用库函数入门,用寄存器提高”于是下定决心用库,但当时没有库的概念,结果走了很多弯路,看了很多不必要的东西,当时竟没理解到只是调用库就OK了,别的不用管。
最后潜心的在教程网看完一个例程后照猫画虎写了一个,经过了多次调试以后,灯终于亮了!那个兴奋啊。
再次还要感谢希望自己坚持下去,早日能写出一个属于自己的程序,完成一个说的过去的功能,下面把我的程序粘出来,和大家分享下,大虾看到了别见笑啊注:1.有两个灯,PA4 B12,都是低电平点亮2.有两个按键,PB8 和 PB9,按下是低电平3.程序开始后两个灯常亮,按下按键后熄灭,抬起后继续亮main.c中#include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "stm32f10x_exti.h" void RCC_Configuration(void) //时钟配置函数{ ErrorStatus HSEStartUpStatus; //使能外部晶振RCC_HSEConfig(RCC_HSE_ON); //等待外部晶振稳定HSEStartUpStatus = RCC_WaitForHSEStartUp(); //如果外部晶振启动成功,则进行下一步操作if(HSEStartUpStatus==SUCCESS) { //设置HCLK(AHB时钟)=SYSCLK 将系统时钟进行分频后,作为AHB总线时钟RCC_HCLKConfig(RCC_SYSCLK_Div1); //PCLK1(APB1) = HCLK/2 将HCLK时钟2分频后给低速外部总线RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK2(APB2) = HCLK HCLK时钟配置给高速外部总线 RCC_PCLK2Config(RCC_HCLK_Div1); //外部高速时钟HSE 4倍频RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_4); //启动PLL RCC_PLLCmd(ENABLE); //等待PLL稳定while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //系统时钟SYSCLK来自PLL输出RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //切换时钟后等待系统时钟稳定 while(RCC_GetSYSCLKSource()!=0x08); } // 下面这些都是外设总线上所挂的外部设备时钟的配置RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_AP B2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE); }void GPIO_Configuration(void) //GPIO配置函数{ //GPIO_DeInit(GPIOA); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP; GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP; GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPU;GPIO_Init(GPIOB,&GPIO_InitStructure); } void EXTI_Config(void) { EXTI_InitTypeDef EXTI_InitStructure; // 管脚选择GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource8);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource9); // 清除 EXTI线路挂起位EXTI_ClearITPendingBit(EXTI_Line8|EXTI_Line9); // EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_Line = EXTI_Line8|EXTI_Line9; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); } void NVIC_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; // 注意名称是“_IRQn”,不是“_IRQChannel”NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;// NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } int main(void) { RCC_Configuration(); GPIO_Configuration(); EXTI_Config(); NVIC_Config();while(1) { GPIO_ResetBits(GPIOB,GPIO_Pin_12); GPIO_ResetBits(GPIOA,GPIO_Pin_4); } } 中断文件 it.c中void EXTI9_5_IRQHandler(void) { if ( EXTI_GetITStatus(EXTI_Line8) != RESET ) { EXTI_ClearITPendingBit(EXTI_Line8);GPIO_SetBits(GPIOA,GPIO_Pin_4);while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)==0); } if ( EXTI_GetITStatus(EXTI_Line9) != RESET ){ EXTI_ClearITPendingBit(EXTI_Line9);GPIO_SetBits(GPIOB,GPIO_Pin_12);while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==0);勤劳的蜜蜂有糖吃} }第二篇:STM32入门经历,高手不要进!现在STM32初学入门,写些关于入门的帮助,也算答谢帮助过我的人.希望象我这样想学STM32的朋友不用迷茫.(本入门只适合低手,高手不要见笑).1.硬件平台.现在可以买到学习有的有英蓓特的MCBSTM32 和万利的EK-STM32F,可能目前出来最好的还是的神舟系列开发板,包括神舟I号(103RBT),神舟II号(103VCT),神舟III号(103ZET),神舟iv号(107VCT)几款都有,反正这几个板我都买了,学校出钱买的,还挺实惠,让老板打了个折扣,如果你自己开板做,成本还比这高.学会了才自己做自己的板子吧.2.软件平台.现在流行的有Keil MDK 3.15b和 IAR EWARM 4.42A. 购买评估板时,里面的光盘已经带了.为什么选这两个平台,用的人多,你以后遇到问题,可以找人解决的机会就大.英蓓特的MCBSTM32用的是Keil MDK 平台, 万利的是 IAR EWARM.3.C语言知识如果想补这推荐一本入门的书C Primer Plus 中文版.这本也是入门的好书.4.ST的数据手册STM32F10x参考手册看完这个就对STM32的内部有认识.STM32 Document and library rules 个人认为这个最重要.因为你学会了C语言看例程时.很多如GPIO_SetBits GPIO_ResetBits.很多C语言以外的函数库.这些都是STM32的库文件.5.看例程.如keil MDK 3.15b下的C:/Keil/ARM/Boards/Keil/MCBSTM32 有很多例程.GPIO口,RTC,PWM,USB,CAN等等....你想到的都有例程.6.多上论坛,呵呵.....有不明问下高手,我也是这样.只要不断努力,你一定会成功的.第三篇:STM32学习心得笔记STM32学习心得笔记时钟篇在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。
一天入门STM32
前言一天入门STM32,仅一天的时间,是否有真的这么快。
不同的人对入门的理解不一样,这篇一天入门STM32的教程,我们先对入门达成一个共识,如果你有异议,一天入门不了,请不要较真,不要骂街,保持一个工程师该有的修养,默默潜心学习,因为你还有很大的上升空间。
我眼中的入门:(前提是你学过51单片机和C语言)1、知道参考官方的什么资料来学习,而不是陷入一大堆资料中无从下手。
2、知道如何参考官方的手册和官方的代码来独立写自己的程序,而不是一味的看到人家写的代码就觉得人家很牛逼。
3、消除对STM32的恐惧,消除对库开发的恐惧,学习是一个快乐而富有成就感的过程。
第1章一天入门STM32本章参考资料:《STM32中文参考手册》《CM3权威指南CnR2》学习本章时,配合《STM32中文参考手册》GPIO章节一起阅读,效果会更佳,特别是涉及到寄存器说明的部分。
1.151与STM32简介51是嵌入式学习中一款入门级的精典MCU,因其结构简单,易于教学,且可以通过串口编程而不需要额外的仿真器,所以在教学时被大量采用,至今很多大学在嵌入式教学中用的还是51。
51诞生于70年代,属于传统的8位单片机,如今,久经岁月的洗礼,既有其辉煌又有其不足。
现在的市场产品竞争激烈,对成本极其敏感,相应地对MCU的要求也更苛刻:功能更多,功耗更低,易用界面和多任务。
面对这些要求,51现有的资源就显得得抓襟见肘了。
所以无论是高校教学还是市场需求,都急需一款新的MCU来为这个领域注入新的活力。
基于这市场的需求,ARM公司推出了其全新的基于ARMv7架构的32位Cortex-M3微控制器内核。
紧随其后,ST(意法半导体)公司就推出了基于Cortex-M3内核的MCU—STM32。
STM32凭借其产品线的多样化、极高的性价比、简单易用的库开发方式,迅速在众多Cortex-M3MCU中脱颖而出,成为最闪亮的一颗新星。
STM32一上市就迅速占领了中低端MCU市场,受到了市场和工程师的无比青睐,颇有星火燎原之势。
手把手教你STM32笔记解析
STM32F1031、IO口处理IO口包含7个寄存器配置寄存器两个:CRL(32),CRH(32)数据寄存器两个:IDR(32),ODR(32),但是他们只用了16位置位复位寄存器:BSRR(32)复位寄存器:BRR(16)锁存寄存器:LCKR(32)常用的有前面四个:其中前面两个是用来设置的,后面两个是用来操作的。
每个IO口占用四位进行设置(低两位是MODE,高两位是CNF),每组16个,总共需要64个位设置,分别从CRL低位开始,到CRH 的高位结束。
每个IO口四位二进制的常用配置:模拟输入模式(ADC):0x0;推挽输出模式(输出口50MHz):0x3;上/下拉输入模式(输入口用):0x8;复用输出(第二供能):0xB;STM32F407学习笔记1、系统时钟的设置:Stm32_Clock_Init(168,4,2,7);参数分别是:PLLN,PLLM,PLLP,PLLQHSE分频PLLM之后为VCO的输入,一般VCO的输入要求为1~2MHz,一般建议取为2MHz,防止PLL抖动。
VCO输出是输入的PLLN倍频,SYSCLK在去PLL输出时,SYSCLK = PLL=HSE/PLLM*PLLN/PLLP而PLLQ是为48MHz时钟配置用的,CLK48= HSE/PLLM*PLLN/PLLQ所以要设置系统时钟为168MHz时候推荐的参数取值为SYSCLK = PLL=HSE/PLLM*PLLN/PLLP =8/4*168/2=168MHzCLK48= HSE/PLLM*PLLN/PLLQ=8/4*168/7=48MHz2、延时函数设置:delay_init(168);延时函数参数为系统时钟SYSCLK初始化后就可以调用延时函数:delay_ms(ms);参数不能大于65536,因为参数是16位数delay_us(us);参数不能大于7989153、普通IO的使用a.首先是使能时钟RCC->AHB1ENR|=1<<5;在该寄存器相应的位置1即可b.IO口模式设置:GPIO_Set(GPIOF,PIN9|PIN10,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD _PU);参数分别是:GPIOx,PIN9|PIN10(具体对应的口,可以使用与的关系)因为每种占一位#define PIN01<<0#define PIN11<<1#define PIN21<<2#define PIN31<<3#define PIN41<<4#define PIN51<<5#define PIN61<<6#define PIN71<<7#define PIN81<<8#define PIN91<<9#define PIN101<<10#define PIN111<<11#define PIN121<<12#define PIN131<<13#define PIN141<<14#define PIN151<<15Mode:四种,各个模式只能设置一种#define GPIO_MODE_IN 0//普通输入模式#define GPIO_MODE_OUT 1 //普通输出模式#define GPIO_MODE_AF2//AF功能模式#define GPIO_MODE_AIN3//模拟输入模式输出推挽或者开漏选择:#define GPIO_OTYPE_PP0//推挽输出#define GPIO_OTYPE_OD1//开漏输出推挽输出可输出强的高、低电平,用于连接数字器件开漏输出相当于三极管的集电极,电流型驱动,只可以输出强的低电平,高电平需外拉。
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从⼊门到精通前⾔:还记得⼤学⽼师跟我说过的⼀句话,嵌⼊式这个⾏业越学越觉得⾃⼰懂得太少。
这也许就是我们要树⽴终⽣学习的⽬标和动⼒吧!我所理解的精通就是对崇尚的技术永⽆⽌境地追求。
⼀、相识STM32STM32这款由ST公司开发的32位微控制器,是继51单⽚机后第⼀款我为之痴迷的经典MCU。
⼤学的时光很短,⽽我与她为伴,但从未静下⼼来,好好看她!1.1 STM32如何选型?当开发⼀款嵌⼊式产品时,主控芯⽚的选型相信是⼀个⾮常棘⼿的问题,不仅要考虑芯⽚的性能和硬件资源是否可以满⾜产品的需求,还有考虑芯⽚的成本以及功耗等因素,但这些对于有经验的⼯程师来说并不算什么难事。
那对于初学者该如何选型呢?那肯定是找资料最齐全的,推荐初学者选择STM32F103系列作为⾃⼰的⼊门32的经典,学习资料可以选择正点原⼦,原⼦哥的STM32资料相信⼤家都有所⽿闻,确实做得很⽤⼼。
附上原⼦论坛要增加⾃⼰阅历,没事可以多逛逛论坛,关注⼀些新出的MCU,毕竟技术在发展,作为嵌⼊式⼯程师要跟上时代的进步,其实官⽅⼿册可以提供我们⼀个很好的参考,⼤家可以⾃⾏去ST官⽹下载,然后再选择最符合⾃⼰项⽬要求的芯⽚。
1.2 BOOT引脚设置在ISP下载电路中,我们需要配置BOOT引脚,有关BOOT引脚不同的配置会产⽣不同的启动⽅式,具体见表格BOOT配置。
BOOT0BOOT1启动⽅式0X内部FLASH10系统存储器11内部SRAM1.3 如何分配原理图IO在画原理图之前,⼀般的做法是先把引脚分类好,然后才开始画原理图,引脚分类具体见表格。
引脚分类引脚说明电源(VBAT)、(VDD VSS)、(VDDA VSSA)、(VREF+ VREF-)等晶振IO主晶振IO,RTC晶振IO下载IO⽤于JTAG下载的IO:JTMS、JTCK、JTDI、JTDO、NJTRSTBOOT IO BOOT0、BOOT1,⽤于设置系统的启动⽅式引脚分类引脚说明复位IO NRST,⽤于外部复位GPIO专⽤器件接到专⽤的总线,⽐如I2C,SPI,SDIO,FSMC,DCMI这些总线的器件需要接到专⽤的IO1.4 如何寻找IO的功能说明要想根据功能来分配 IO,那就得先知道每个 IO 的功能说明,这个我们可以从官⽅的数据⼿册⾥⾯找到。
stm32自学笔记PPT课件
第三章 键盘
• 下面在分析一下中断子函数:
• void EXTI0_IRQHandler(void)
•{
•
delay_ms(10);//消抖
Hale Waihona Puke •if(KEY2==1)
//按键2
•
{
•
LED0=!LED0;
•
LED1=!LED1;
•
}
•
EXTI->PR=1<<0; //PR,清除LINE0上的中断标志位 ,终端挂起寄存器组。
•
GPIOA->CRH|=0X80800000;
•
GPIOA->ODR|=1<<13; //PA13上拉,PA0默认下拉
•
GPIOA->ODR|=1<<15; //PA15上拉
•
Ex_NVIC_Config(GPIO_A,0,RTIR); //上升沿触发
•
Ex_NVIC_Config(GPIO_A,13,FTIR);//下降沿触发
• 3.建立.h文件,.h文件是用来保存一些宏定义和一些函 数声明的,这样能够使函数看起来更加清晰,所以在这 里一定要把各个.h函数的路径添加到工程里面。
第二章 跑马灯实验
• 主函数:
• int main(void)
•{
•
Stm32_Clock_Init(9); //系统时钟设置,把PLL设置为9,比如说当前的时钟为8Mhz,那
• JTAG_Set(JTAG_SWD_DISABLE);//关闭JTAG和SWD,在原理图上可以看 到PA13和PA15为键盘和JTAG与SWD所共用,而这两种方针接口,他们 和普通的IO口公用,当想使用普通IO口时,必须先把他们关闭。在这 个函数里面设置参数,如果为二进制数00,则代表全部使能,如果是 二进制数01,则是能SWD,如果是10,则表示全部关闭。JTAG是一种 国际标准测试协议,主要用于芯片内部的测试。
STM32入门教程
STM32入门教程STM32是一款由意法半导体(STMicroelectronics)开发的32位微控制器系列。
它是一种广泛应用于嵌入式系统设计的芯片,具有高性能、低功耗、丰富的外设接口以及可编程的特点。
对于初学者来说,入门STM32可能会有一定的难度。
本篇教程将逐步介绍STM32的基本知识和入门方法,帮助初学者快速上手。
第一部分:STM32简介在入门STM32之前,我们首先了解一些基本的背景知识。
STM32系列采用了ARM Cortex-M内核,具有不同的系列和型号,例如STM32F1xx、STM32F4xx等。
不同的系列和型号拥有不同的性能和外设接口,所以在选型时需要根据具体需求进行选择。
第二部分:开发环境搭建第三部分:编写第一个程序第四部分:外设的使用STM32拥有丰富的外设接口,包括GPIO、UART、SPI、I2C等。
在这一部分,我们将详细介绍如何使用这些外设。
以GPIO为例,我们将学习如何配置GPIO引脚的输入输出模式,如何控制GPIO引脚的高低电平,以及如何使用外部中断功能。
类似地,我们还将介绍UART、SPI和I2C等外设的使用方法。
第五部分:中断的处理中断是STM32中一个非常重要的特性。
它可以让我们在程序运行的同时,对外部事件做出及时的响应。
本节我们将学习如何配置和使用中断。
首先,我们需要了解中断向量表和中断优先级的概念。
然后,学习如何编写中断处理函数,并配置和启用中断。
最后,通过一个例子,演示如何使用中断来处理外部事件,例如按键的按下和释放。
第六部分:时钟和定时器时钟和定时器是嵌入式系统中非常重要的功能模块。
STM32提供了多个时钟源和定时器模块,可以用于各种定时任务和时序要求。
在这一部分,我们将学习如何配置时钟源和时钟分频器,以及如何配置和使用定时器。
通过一个实例,我们将学习如何使用定时器来产生精确的延时和周期性的中断信号。
第七部分:存储器和编程方法STM32拥有多种存储器类型,包括闪存、RAM和EEPROM等。
最简单的STM32入门教程
最简单的STM32入门教程展开全文本文讲述的是如何从零开始,使用keil建立一个简单的STM32的工程,并闪烁LED灯,给小白看。
第零步,当然首先你得有一个STM32的板子,其IO口上接了一个LED。
第一步,建立一个文件夹0.0第二步,打开keil,建立工程在弹出来的对话框中选择你所用的STM32的芯片。
在接下来弹出来的对话框中选择是,这样keil就帮我们建立好了启动文件。
第三步,新建一个main.c文件,并添加到工程中。
点击New按钮,建立一个文本文件。
在建立的文本文件中输入C中的main函数点击保存保存后,将文件添加到工程中第四步,点击编译可以看到keil有报错错误信息为:没有定义的符号SystemInit ,这是因为在启动文件中有调用SystemInit 函数,但是我们没有定义它,如下图:暂时不用理会上述启动文件中汇编的含义,只需在main.c 中添加该函数即可消除该错误。
修改后再编译,程序没有报错了。
至此,一个STM32的工程就建立完成了。
第五步,将下面的代码复制粘贴1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #define PERIPH_BASE ((unsigned int)0x40000000) #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800) #define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00) #define GPIOC_BASE (APB2PERIPH_BASE + 0x1000) #define GPIOD_BASE (APB2PERIPH_BASE + 0x1400) #define GPIOE_BASE (APB2PERIPH_BASE + 0x1800) #define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00) #define GPIOG_BASE (APB2PERIPH_BASE + 0x2000) #define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C #define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C #define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C #define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C #define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C#define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C #define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr&0xFFFFF)<<5)+(bitnum<<2))19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) #define LED0 MEM_ADDR(BITBAND(GPIOA_ODR_Addr,8))//#define LED0 *((volatile unsigned long *)(0x422101a0)) //PA8 typedef struct{volatile unsigned int CR;volatile unsigned int CFGR;volatile unsigned int CIR;volatile unsigned int APB2RSTR;volatile unsigned int APB1RSTR;volatile unsigned int AHBENR;volatile unsigned int APB2ENR;volatile unsigned int APB1ENR;volatile unsigned int BDCR;volatile unsigned int CSR;} RCC_TypeDef;#define RCC ((RCC_TypeDef *)0x40021000)typedef struct{volatile unsigned int CRL;volatile unsigned int CRH;volatile unsigned int IDR;volatile unsigned int ODR;volatile unsigned int BSRR;volatile unsigned int BRR;volatile unsigned int LCKR;} GPIO_TypeDef;#define GPIOA ((GPIO_TypeDef *)GPIOA_BASE)void LEDInit(void){RCC->APB2ENR|=1<<2; //GPIOA 时钟开启GPIOA->CRH&=0XFFFFFFF0;GPIOA->CRH|=0X00000003;}//粗略延时void Delay_ms(volatile unsigned int t){unsigned int i,n;for(n=0;n<t;n++)for(i=0;i<800;i++);}int main(void){LEDInit();636465666768697071727374757677787980818283 while(1){LED0=0;Delay_ms(500);LED0=1;Delay_ms(500); }}void SystemInit(void){}下面一段是对代码的简单讲解,可不用太深入。
stm32学习步棸
STM32入门要比ARM7简单很多,只是比8位机复杂一点,时钟配置多了几项,外设更丰富了。
学习的
第一步:了解一下其体系结构,选择一个编译软件,了解程序烧录调试方法。
第二步:选择一个学习板,从点亮一个灯开始,从GPIO入手,慢慢掌握stm32的开发,建议不要买太复杂的学习板,这只会让你丧失信息,循序渐进比较好。
第三步:深入学习,学会时钟配置,学习外设的使用(有其他单片机经验的,应该不难)。
第四部:组建小系统,利用自己的知识驱动一些外部的设备,比如SD卡,液晶显示器。
第五步:高端应用,研究一下操作系统的移值等。
STM32学习笔记(初学者快速入门
STM32学习笔记(初学者快速入门STM32 学习笔记从51 开始单片机玩了很长时间了有51PICAVR 等等早就想跟潮流玩玩ARM 但一直没有开始原因-----不知道玩了ARM 可以做什么对我自己而言如果为学习而学习肯定学不好然后cortex-m3 出来了据说这东西可以替代单片机于是马上开始关注也在第一时间开始学习可惜一开始就有点站错了队选错了型仍是对我自己而言我希望这种芯片应该是满大街都是随便哪里都可以买得到但我选的第一种显然做不到为此大概浪费了一年多时间吧现在回到对我来说是正确的道路上来啦边学边写点东西这里写的是我的学习的过程显然很多时候会是不全面的不系统的感悟式的甚至有时会是错误的有些做法会是不专业的那么为什么我还要写呢这是一个有趣的问题它甚至涉及到博客为什么要存在的问题显然博客里面的写的东西其正确性权威性大多没法和书比可为什么博客会存在呢理由很多我非专家只说我的感慨我们读武侠小说总会有一些创出独门功夫的宗师功夫极高然后他的弟子则基本上无法超越他我在想这位宗师在创造他自己的独门功夫时必然会有很多的次的曲折弯路甚至失败会浪费他的很多时间而他教给弟子时则已去掉了这些曲折和弯路当然更不会把失败教给弟子按理说效率应该更高可是没用弟子大都不如师为什么呢也许知识本身并不是最重要的获取知识的过程才是最重要的也许所谓的知识并不仅仅是一条条的结论而是附带着很多说不清道不明的东西如植物的根一条主根上必带有大量的小小的触须闲话多了些就权当前言了下面准备开始一条件的准备我的习惯第一步是先搭建一个学习的平台原来学51PICAVR 时都是想方设法自己做些工具实验板之类现在人懒了直接购买成品了硬件电路板火牛板软件有keil 和iar 可供选择网上的口水仗不少我选keil理由很简单这个我熟目前要学的知识中软硬件我都不熟所以找一个我有点熟的东西就很重要在我相当熟练之前肯定不会用到IAR如果真的有一天不得不用IAR 相信学起来也很容易因为这个时候硬件部分我肯定很熟了再加上有keil 的基础所以应该很容易学会了调试工具JLINK V8 这个不多说了价格便宜又好用就是它了二热身网上选购的付了款就是等了拿到包裹端详良久起身沐浴更衣焚香总得先吃晚饭洗澡再点个电蚊香什么的吧拆包细细端详做工精良尤其那上面的32 吋屏越看越喜欢接下来就是一阵折腾了装JLINK 软件给板子通电先试试JLINK 能不能与电脑和板子通信上了真顺一点问题也没有于是准备将附带的程序一个一个地写进去试一试一检查大部分例子的HEX 文件并没有给出这要下一步自己生成但是几个大工程的例子都有HEX 文件如MP3如UCCGI 测试等写完以后观察程序运行的效果因为之前也做过彩屏的东西知道那玩艺代码量很大要流畅地显示并不容当时是用AVR 做的在18 吋屏上显示一幅画要有一段时间现在看起来用STM32 做的驱动显示出来的画面还是很快的不过这里显示的大部分是自画图并没有完整地显示一整幅的照片所以到底快到什么程度还不好说看来不久以后这可以作为一个学习点的一个晚上过去了下一篇就是要开始keil 软件的学习了STM32 学习笔记2本想着偷点懒的没想到竞被加了精没办法啦只能勤快点啦硬件调通后就要开始编程了编程的方法有两种一种是用st 提供的库另一种是从最底层开始编程网上关于使用哪种方法编程的讨论很多据说用库的效率要低一些但是用库编程非常方便所以我还是从库开始啦库是ST 提供的怎么说也不会差到哪里再说了用32 位ARM 的话开发的观念也要随之改变一点了说说我怎么学的吧找个例子如GPIO可以看到其结构如下SOURCE 文件夹- APP 文件夹-CMSIS 文件夹-STM32F10x_StdPeriph_Driver 文件夹Lis 文件夹OBJ 文件夹其中SOURCE 中保存的是应用程序其中又有好多子文件夹而CMSIS 文件夹中和STM32F10x_StdPeriph_Driver 文件夹中是ST 提供的库这样如果要做新的工程只要将这个文件夹整个复制过来就行其中APP 中保存自己的代码因为我们用51 单片机时一般比较简单有时就一个文件所以通常不设置专门的输出文件夹而这里做开发通常会有很多个文件加入一个工程中编译过程中会产生很多中间文件因此设置专门的文件夹LIS 和OBJ 用来保存中间文件下面就将设置简单描述一下将复到过来的GPIO 根目录下的所有文件删除因为我们要学着自己建立工程用菜单Project-- New uVision Porject建立新的工程选择目标器件为STM32103VC这个过程与建立51 单片机的工程没有什么区别这里就偷点懒不上图了接下来看一看怎么设置点那个品字形打开对话框这里就给个图了相信有一定操作基础的人应该会用顺便提一下原来用VC或者IAR 时总觉得它们的一个功能就是建立一个是Debug 组和Release 组这个功能挺好的从这个图可在Keil 里也是一样可以建的将刚才那个文件夹图中CMSIS 中的文件加入CMSIS 组一共3 个其中\Source\CMSIS\Core\CM3 有两个C 语言源程序文件全部加入另外还有一个在\Source\CMSIS\Core\CM3\startup\arm 文件夹中这个文件夹中有4 个s 文件我们选择其中的startup_stm32f10x_hds 文件这是根据项目所用CPU 来选择的我们用的CPU 是103VC 的属于高密度的芯片所以选这个至于LIB 中的文件就在这儿\Source\STM32F10x_StdPeriph_Driver\src 啦这里有很多个文件把什么文件加进去呢怕麻烦的话把所有文件全部加进去这并不会增加编译后的代码量但会增加很多的编译时间接下来设定目标输出文件夹上面这个图怎么出来的就不说啦单击Select Foler for Objects在弹出来的对话框中选择OBJ 文件夹同样方法选择List 文件的输出文件夹设置好后如果直接编译是不行的会出错还需要提供头文件所在位置单击cC标签页第一次进入时Include Paths 文本框中是空白的点击其后的按钮打开对话框增加相应的路径这样路径就设好了单击OK回到上一界面然后再单击OK退出设置即可编译链接下一会要试一试新的312 版的库效果如何了STM32 学习笔记3升级库光盘中所带的例子是310 的另外还有一个312 的我试着将312 的库替代原来的库还真有问题下面就简述问题及解决方法1将库文件解压库文件名是stm32f10x_stdperiph_libzip解压后放在任意一个文件夹中2 由于原作者做了很好的规划每一个项目中都分成三个文件夹并且在source 文件夹中又做了3 个文件夹其中APP 文件夹是放自己写的文件的其他的两个是从库中复制过来的因此想当com 版本中相同的两个文件夹CMSIS 和STM32F10x_StdPeriph_Driver 直接复制过来以为一切OK结果一编译出来一堆错误其中有错误Source\App\mainc 7 error 20 identifier "GPIO_InitTypeDef" is undefined还有大量的警告Source\STM32F10x_StdPeriph_Driver\src\stm32f10x_flashc 130 warning 223-D function "assert_param" declared implicitly看了看在APP 文件夹中还有一些不属于自己的东西stm32f10x_confhstm32f10x_ithstm32f10x_itc打开一看果然是310版本的没说的换找到STM32F10x_StdPeriph_Licom\Project\Template 文件夹用里面的同样的文件替换掉这几个文件这回应该万事大吉了吧再一看依然如故没办法了只好细细研究了通过观察发现原来可以编译通过的工程在mainc 下面挂满了h 文件而这个通不过的则少得很这是编译能通过的工程这是编译通不过的工程显然有些文件没有被包含进来一点一点跟踪发现大部分的头文件都包含在stm32f10x_confh 中而这个文件又出现在stm32f10xh 中其中有这样的一行ifdef USE_STDPERIPH_DRIVERinclude "stm32f10x_confh"endif看来是这个USE_STDPERIPH_DRIVER 没有被定义啊于是人为地去掉条件ifdef USE_STDPERIPH_DRIVERinclude "stm32f10x_confh"endif再次编译果然就OK 了可是可是也不能就这么去掉啊怎么办呢万能的网啊一搜果然就有了到设置 CC页面在那个define 中加入USE_STDPERIPH_DRIVERSTM32F10X_HD当然去掉条件编译前面的注释回到原样再次编译一切顺利可是原来的工程例子也没有加这个啊怎么回事呢再次打开原来的例子找到stm32f10xh可以看到有这么一行而新的stm32f10xh 中则是这样的原com 版的stm32f10xh 被人为地修改了一下所以不在define 中定义也不要紧而新com 则不行了至此简单的升级搞定本文见于好多地方但查询后未能确定其原始出处及作者故这里说明是转贴但作者和原始出处信息就无法提供了如果原作者看到请跟贴说明知情者也请跟贴说明ARM 中的RORW 和ZI DATA一直以来对于ARM 体系中所描述的RORW 和ZI 数据存在似是而非的理解这段时间对其仔细了解了一番发现了一些规律理解了一些以前书本上有的但是不理解的东西我想应该有不少人也有和我同样的困惑因此将我的一些关于RORW 和ZI 的理解写出来希望能对大家有所帮助要了解RORW 和ZI 需要首先了解以下知识ARM 程序的组成此处所说的ARM 程序是指在ARM 系统中正在执行的程序而非保存在ROM中的bin 映像image文件这一点清注意区别一个ARM 程序包含3 部分RORW 和ZIRO 是程序中的指令和常量RW 是程序中的已初始化变量ZI 是程序中的未初始化的变量由以上3 点说明可以理解为RO 就是readonlyRW 就是readwriteZI 就是zeroARM 映像文件的组成所谓ARM 映像文件就是指烧录到ROM 中的bin 文件也称为image 文件以下用Image 文件来称呼它Image 文件包含了RO 和RW 数据之所以Image 文件不包含ZI 数据是因为ZI 数据都是0没必要包含只要程序运行之前将ZI 数据所在的区域一律清零即可包含进去反而浪费存储空间Q为什么Image 中必须包含RO 和RWA 因为RO 中的指令和常量以及RW 中初始化过的变量是不能像ZI 那样无中生有的ARM 程序的执行过程从以上两点可以知道烧录到ROM 中的image 文件与实际运行时的ARM 程序之间并不是完全一样的因此就有必要了解ARM 程序是如何从ROM 中的image到达实际运行状态的实际上RO 中的指令至少应该有这样的功能1 将RW 从ROM 中搬到RAM 中因为RW 是变量变量不能存在ROM 中2 将ZI 所在的RAM 区域全部清零因为ZI 区域并不在Image 中所以需要程序根据编译器给出的ZI 地址及大小来将相应得RAM 区域清零ZI 中也是变量同理变量不能存在ROM 中在程序运行的最初阶段RO 中的指令完成了这两项工作后 C 程序才能正常访问变量否则只能运行不含变量的代码说了上面的可能还是有些迷糊RORW 和ZI 到底是什么下面我将给出几个例子最直观的来说明RORWZI 在C 中是什么意思1 RO看下面两段程序他们之间差了一条语句这条语句就是声明一个字符常量因此按照我们之前说的他们之间应该只会在RO 数据中相差一个字节字符常量为1 字节Prog1includevoid main voidProg2includeconst char a 5 void main voidProg1 编译出来后的信息如下Code RO Data RW Data ZI Data Debug948 60 0 96 0 Grand TotalsTotal RO Size Code RO Data1008 098kBTotal RW Size RW Data ZI Data 96 009kBTotal ROM Size Code RO Data RW Data 1008098kBProg2 编译出来后的信息如下Code RO Data RW Data ZI Data Debug948 61 0 96 0Grand TotalsTotal RO Size Code RO Data 1009 099kBTotal RW Size RW Data ZI Data 96 009kBTotal ROM Size Code RO Data RW Data 1009 099kB以上两个程序编译出来后的信息可以看出Prog1 和Prog2 的RO 包含了Code 和RO Data 两类数据他们的唯一区别就是Prog2 的RO Data 比Prog1 多了1 个字节这正和之前的推测一致如果增加的是一条指令而不是一个常量则结果应该是Code 数据大小有差别2 RW同样再看两个程序他们之间只相差一个已初始化的变量按照之前所讲的已初始化的变量应该是算在RW 中的所以两个程序之间应该是RW 大小有区别Prog3includevoid main voidProg4includechar a 5 void main voidProg3 编译出来后的信息如下Code RO Data RW Data ZI DataDebug948 60 0 96 0 Grand TotalsTotal RO Size Code RO Data 1008 098kBTotal RW Size RW Data ZI Data 96009kBTotal ROM Size Code RO Data RW Data 1008098kBProg4 编译出来后的信息如下Code RO Data RW Data ZI Data Debug948 60 1 96 0 GrandTotalsTotal RO Size Code RO Data 1008 098kBTotal RW Size RW Data ZI Data 97 009kBTotal ROM Size Code RO Data RW Data 1009 099kB可以看出Prog3 和Prog4 之间确实只有RW Data 之间相差了1个字节这个字节正是被初始化过的一个字符型变量a所引起的3 ZI再看两个程序他们之间的差别是一个未初始化的变量a从之前的了解中应该可以推测这两个程序之间应该只有ZI 大小有差别Prog3includevoid main voidProg4includevoid main voidProg3 编译出来后的信息如下Code RO Data RW Data ZI Data Debug948 60 0 96 0 GrandTotal RO Size Code RO Data 1008 098kBTotal RW Size RW Data ZI Data 96 009kBTotal ROM Size Code RO Data RW Data 1008 098kBProg4 编译出来后的信息如下Code RO Data RW Data ZI Data Debug948 60 0 97 0 GrandTotalsTotal RO Size Code RO Data 1008 098kBTotal RW Size RW Data ZI Data 97009kBTotal ROM Size Code RO Data RW Data 1008098kB编译的结果完全符合推测只有ZI 数据相差了1 个字节这个字节正是未初始化的一个字符型变量a所引起的注意如果一个变量被初始化为0则该变量的处理方法与未初始化华变量一样放在ZI 区域即ARM C 程序中所有的未初始化变量都会被自动初始化为0总结1 C 中的指令以及常量被编译后是RO 类型数据2 C 中的未被初始化或初始化为0 的变量编译后是ZI 类型数据3 C 中的已被初始化成非0 值的变量编译后市RW 类型数据附程序的编译命令假定C 程序名为tstcarmcc -c -o tsto tstcarmlink -noremove -elf -nodebug -info totals -info sizes -map -list aamap-o tstelf tsto编译后的信息就在aamap 文件中ROM 主要指NAND FlashNor FlashRAM 主要指PSRAMSDRAMSRAMDDRAM继续学习中先把开发板自带一个例子做了些精简以免看得吓人就是这个让PORTD 上接的4 个LED 分别点亮开始研究代码int main voidInit_All_Periph看到这一行开始跟踪于是又看到了下面的内容void Init_All_Periph voidRCC_Configuration继续跟踪void RCC_Configuration voidSystemInit这行代码在system_stm32f10xc 中找到了void SystemInit voidReset the RCC clock configuration to the default reset state fordebug purposeSet HSION bitRCC- CR uint32_t 0x00000001Reset SW HPRE PPRE1 PPRE2 ADCPRE and MCO bits ifndef STM32F10X_CLRCC- CFGR uint32_t 0xF8FF0000elseRCC- CFGR uint32_t 0xF0FF0000endif STM32F10X_CLReset HSEON CSSON and PLLON bitsRCC- CR uint32_t 0xFEF6FFFFReset HSEBYP bitRCC- CR uint32_t 0xFFFBFFFFReset PLLSRC PLLXTPRE PLLMUL and USBPREOTGFSPRE bits RCC- CFGR uint32_t 0xFF80FFFFifndef STM32F10X_CLDisable all interrupts and clear pending bits RCC- CIR 0x009F0000elseReset PLL2ON and PLL3ON bitsRCC- CR uint32_t 0xEBFFFFFFDisable all interrupts and clear pending bits RCC- CIR 0x00FF0000Reset CFGR2 registerRCC- CFGR2 0x00000000endif STM32F10X_CLConfigure the System clock frequency HCLK PCLK2 and PCLK1 prescalersConfigure the Flash Latency cycles and enable prefetch bufferSetSysClock这一长串的又是什么如何来用呢看来偷懒是不成的了只能回过头去研究STM32 的时钟构成了相当的复杂系统的时钟可以有3 个来源内部时钟HSI外部时钟HSE或者PLL 锁相环模块的输出它们由RCC_CFGR 寄存器中的SW 来选择SW 10系统时钟切换由软件置1或清0来选择系统时钟源在从停止或待机模式中返回时或直接或间接作为系统时钟的HSE 出现故障时由硬件强制选择HSI 作为系统时钟如果时钟安全系统已经启动00HSI 作为系统时钟01HSE 作为系统时钟10PLL 输出作为系统时钟11不可用PLL 的输出直接送到USB 模块经过适当的分频后得到48M 的频率供USB 模块使用系统时钟的一路被直接送到I2S 模块另一路经过AHB 分频后送出送往各个系统其中直接送往SDIFMSCAHB 总线8 分频后作为系统定时器时钟经过APB1 分频分别控制PLK1定时器TIM2TIM7经过APB2 分频分别控制PLK2定时器TIM1TIM8再经分频控制ADC由此可知STM32F10x 芯片的时钟比之于51AVRPIC 等8 位机要复杂复多因此我们立足于对着芯片手册来解读程序力求知道这些程序代码如何使用为何这么样使用如果自己要改可以修改哪些部分以便自己使用时可以得心应手单步执行看一看哪些代码被执行了Reset the RCC clock configuration to the default reset state fordebug purposeSet HSION bitRCC- CR uint32_t 0x00000001这是RCC_CR 寄存器由图可见HSION 是其bit 0 位HSION内部高速时钟使能由软件置1或清零当从待机和停止模式返回或用作系统时钟的外部4-25MHz 时钟发生故障时该位由硬件置1来启动内部8MHz 的RC 振荡器当内部8MHz 时钟被直接或间接地用作或被选择将要作为系统时钟时该位不能被清零0内部8MHz 时钟关闭1内部8MHz 时钟开启Reset SW HPRE PPRE1 PPRE2 ADCPRE and MCO bitsifndef STM32F10X_CLRCC- CFGR uint32_t 0xF8FF0000这是RCC_CFGR 寄存器该行程序清零了MC0[20]这三位和ADCPRE[10]ppre2[20]PPRE1 〔20〕HPRE 〔30〕SWS 〔10〕和SW 〔10〕这16 位MCO 微控制器时钟输出由软件置1或清零0xx没有时钟输出100系统时钟 SYSCLK 输出101内部8MHz 的RC 振荡器时钟输出110外部4-25MHz 振荡器时钟输出111PLL 时钟2 分频后输出Reset HSEON CSSON and PLLON bitsRCC- CR uint32_t 0xFEF6FFFF清零了PLLONHSEBYPHSERDY 这3 位Reset HSEBYP bitRCC- CR uint32_t 0xFFFBFFFF清零了HSEBYP 位为什么不一次写HSEBYP外部高速时钟旁路在调试模式下由软件置1或清零来旁路外部晶体振荡器只有在外部4-25MHz 振荡器关闭的情况下才能写入该位0外部4-25MHz 振荡器没有旁路1外部4-25MHz 外部晶体振荡器被旁路所以要先清HSEON 位再清该位Reset PLLSRC PLLXTPRE PLLMUL and USBPREOTGFSPRE bitsRCC- CFGR uint32_t 0xFF80FFFF清零了USBPREPLLMULPLLXTPRPLLSRC 共7 位Disable all interrupts and clear pending bitsRCC- CIR 0x009F0000这个暂不解读SetSysClock跟踪进入该函数可见一连串的条件编译单步运行执行的是elif defined SYSCLK_FREQ_72MHzSetSysClockTo72为何执行该行呢找到SYSCLK_PREQ_的相关定义如下图所示这样就得到了我们所要的一个结论如果要更改系统工作频率只需要在这里更改就可以了可以继续跟踪进入这个函数来观察如何将工作频率设定为72MHz 的static void SetSysClockTo72 void。
嵌入式STM32入门总结及学习步骤
嵌入式STM32入门总结及学习步骤一、入门总结1. STM32是一款基于ARM Cortex-M内核的嵌入式微控制器,具有高性能、低功耗、丰富的外设等特点。
2.学习嵌入式STM32需要掌握C语言、汇编语言以及微控制器的相关知识。
3.学习嵌入式STM32的过程中,最好选择一款开发板,如STM32F407VET6开发板,作为学习的实验平台。
4.学习嵌入式STM32需要动手实践,通过编写代码并在开发板上运行,来理解嵌入式系统的工作原理。
5. 学习嵌入式STM32可以参考ST官方提供的开发工具和资料,如STM32CubeMX、STM32Cube软件包等。
二、学习步骤1.准备工作a.学习C语言和计算机基础知识,包括变量、数据类型、运算符等基本概念。
b.学习汇编语言,了解汇编指令、寄存器、内存等相关知识。
c.了解嵌入式系统的基本概念,包括处理器、存储器、外设等。
d.购买一款合适的开发板,如STM32F407VET6开发板。
f.确定学习的目标,如掌握GPIO、UART、SPI、I2C等常用外设的使用。
2.环境搭建a. 打开STM32CubeMX,根据开发板的型号,选择合适的芯片,并配置时钟、外设等。
b. 生成项目代码,并导入Keil MDK。
3.实验练习a.学习GPIO的使用,包括输入和输出模式的配置、输入和输出的控制。
b.学习中断的使用,包括外部中断和定时器中断等。
c.学习串口通信的使用,包括配置串口参数、发送和接收数据。
d.学习SPI和I2C总线的使用,包括配置外设参数、发送和接收数据。
4.深入学习a.学习时序控制,包括定时器和PWM的使用。
b.学习模拟输入输出,包括ADC和DAC的使用。
c. 学习通信协议,如CAN和Ethernet等。
d. 学习操作系统的使用,如FreeRTOS等。
e.学习低功耗和节能技术,如休眠模式和时钟管理等。
5.实战项目a.根据自己的兴趣和需求,选择一个具体的项目,如小型智能家居控制器、智能车、温湿度监测器等。
STM32相关知识点总结讲解
STM32相关知识点总结讲解STM32是由意法半导体公司(STMicroelectronics)推出的一款32位单片机系列产品。
STM32系列单片机具有高性能、低功耗、丰富的外设资源和易于开发的特点,被广泛应用于工业控制、消费电子、通信设备等领域。
以下是STM32相关的知识点总结:1.STM32系列单片机的特点:- 采用ARM Cortex-M内核,性能强大,运算速度快。
-丰富的外设资源,包括通用输入输出引脚(GPIO)、通用串行总线(USART、SPI、I2C)、模拟数字转换器(ADC)、定时器等。
-低功耗设计,能够在低电压、低功耗模式下运行。
- 丰富的开发工具和软件支持,包括开发板、开发环境(如Keil、IAR)和编程软件。
2.STM32系列单片机的分类:根据不同的特性和功能,STM32系列单片机分为多个系列,包括STM32F0、STM32F1、STM32F2、STM32F3、STM32F4、STM32F7、STM32L0、STM32L1、STM32L4等系列。
3.STM32的时钟系统:STM32的时钟系统包括主时钟、系统时钟、外设时钟与内核时钟。
主时钟源可以是外部晶体振荡器(HSE)或内部RC振荡器(HSI),系统时钟源可以由主PLL或内部RC振荡器(HSI)提供。
外设时钟与内核时钟可以选择不同的分频系数。
4.引脚和GPIO:5.中断和中断向量表:6.存储器管理:7.定时器和计数器:8.串口通信:9.ADC和DAC:10.低功耗模式:以上是对STM32相关知识点的简要总结和讲解。
由于STM32系列单片机功能丰富、应用广泛,还涉及到更多的知识点和应用场景,需要从事者进一步深入学习和实践。
STM32学习教程
1、一共24个库,不可能都学,都学也没用。
按照我的工作需求必须学的有16个,这16个也不是全学。
主要学习来源是各种例程代码、“固件函数库用户手册”和“参考手册”。
具体学习方法是通读不同来源的程序,在程序中找到相关的函数库的应用,然后再阅读相关文档,有条件的实验。
对于内容的选择方面,根据入门内容和未来应用,将所涉及的范围精简到最低,但是对所选择的部分的学习则力求明确。
以下是我按照自己的需求对程序库函数排列的学习顺序:a) 绝大部分程序都要涉及到的库——flash,lib,nvic,rcc,只学基础的跟最简单应用相关必用的部分,其他部分后期再返回头学。
b) 各种程序通用但不必用的库——exti,MDA,systic,只通读理解其作用。
c) DEMO板拥有的外设库——gpio,usart,编写代码实验。
d) 未来需要用到的外设的库——tim,tim1,adc,i2c,spi,先理解等待有条件后实验。
e) 开发可靠性相关库——bkp,iwdg,wwdg,pwr,参考其他例程的做法。
f) 其他,根据兴趣来学。
STM32学前班教程之六:这些代码大家都用得到注:下面是一些常用的代码,网上很多但是大多注释不全。
高手看没问题,对于我们这些新手就费劲了……所以我把这些代码集中,进行了逐句注释,希望对新手们有价值。
1、阅读flash:芯片内部存储器flash操作函数我的理解——对芯片内部flash进行操作的函数,包括读取,状态,擦除,写入等等,可以允许程序去操作flash上的数据。
基础应用1,FLASH时序延迟几个周期,等待总线同步操作。
推荐按照单片机系统运行频率,0—24MHz时,取Latency=0;24—48MHz时,取Latency=1;48~72MHz 时,取Latency=2。
所有程序中必须的用法:FLASH_SetLatency(FLASH_Latency_2);位置:RCC初始化子函数里面,时钟起振之后。
STM32_深入浅出(新手必看)
STM32学前班教程之一:为什么是它经过几天的学习,基本掌握了STM32的调试环境和一些基本知识。
想拿出来与大家共享,笨教程本着最大限度简化删减STM32入门的过程的思想,会把我的整个入门前的工作推荐给大家。
就算是给网上的众多教程、笔记的一种补充吧,所以叫学前班教程。
其中涉及产品一律隐去来源和品牌,以防广告之嫌。
全部汉字内容为个人笔记。
所有相关参考资料也全部列出。
:lol教程会分几篇,因为太长啦。
今天先来说说为什么是它——我选择STM32的原因。
我对未来的规划是以功能性为主的,在功能和面积之间做以平衡是我的首要选择,而把运算放在第二位,这根我的专业有关系。
里面的运算其实并不复杂,在入门阶段想尽量减少所接触的东西。
不过说实话,对DSP的外设并和开发环境不满意,这是为什么STM32一出就转向的原因。
下面是我自己做过的两块DSP28的全功能最小系统板,在做这两块板子的过程中发现要想尽力缩小DSP的面积实在不容易(目前只能达到50mm×45mm,这还是没有其他器件的情况下),尤其是双电源的供电方式和1.9V的电源让人很头疼。
后来因为一个项目,接触了LPC2148并做了一块板子,发现小型的ARM7在外设够用的情况下其实很不错,于是开始搜集相关芯片资料,也同时对小面积的AVR和51都进行了大致的比较,这个时候发现了CortexM3的STM32,比2148拥有更丰富和灵活的外设,性能几乎是2148两倍(按照MIPS值计算)。
正好2148我还没上手,就直接转了这款STM32F103。
与2811相比较(核心1.8V供电情况下),135MHz×1MIPS。
现在用STM32F103,72MHz×1.25MIPS,性能是DSP的66%,STM32F103R型(64管脚)芯片面积只有2811的51%,STM32F103C型(48管脚)面积是2811的25%,最大功耗是DSP的20%,单片价格是DSP的30%。
STM32入门
STM32入门STM32入门目录第一章笔者的入门总结1.1为什么要把时间花在“犹豫”上?1.2看资料需要计划、耐心和速度1.3学STM32必备开发板1.4熟悉开发板并试图写程序第二章STM32入门方法谈2.1拿到开发板我该做什么?2.2我的时间如何安排2.3碰到问题怎么办?第三章STM32学习步骤3.1关于STM32文档学习3.2 30天上手STM32计划3.2.1第1步:熟悉调试软件3.2.2第2步:GPIO编程3.2.3开始全新的STM32深入研究STM32入门第一章笔者的入门总结1.1为什么要把时间花在“犹豫”上?每当我们在入门之前(ARM是这样,DSP也一样),总会会有很多疑问,会有很多顾虑。
我们渴望知道学习STM32前景如何?需要啥基础?难不难?适不适合我?但是什么时候能心潮澎湃地、相当着急地开始学STM32?日子在一天一天过去!你开始行动了吗?没有行动的思索,永远都不可能入门!把这些时间用来看书吧,效果能好一万倍。
大家可能是从51单片机过来的,回想一下,我们之前学单片机时如何入门呢?实际上都是先看书(理论),再玩板子(实践)。
严格地说,应该是模仿实验。
熟悉之后才会自己写程序代码实现某个功能。
因此,如果你正在咨询STM32;如果你正对STM32心潮澎湃;如果你想入门STM32;那么,从现在开始,不要犹豫了,不要想再详细地了解STM32的前景了。
做一个可能影响你一生的决定吧!不用咨询,不用兴奋,开始看书籍(文档)吧!!每个人都是这么走过来的。
1.2看资料需要计划、耐心和速度这里所谓的“资料”包括STM32书籍、文档。
因为STM32有个特点,datasheet很多都是中文的,有些同学就没有去买书籍,直接看STM32的用户手册,也是可以的。
但是不管看书籍还是文档,我们是需要计划的。
不是今天看3页,明天看5页。
一本书看了两个月,还在磨蹭。
请记住,你学的不是寂寞,是STM32!看书或文档不是用来消遣时间的。
零死角玩转STM32系统篇
t y w藏书友情提示t y w藏书《零死角玩转STM32》系列教程由初级篇、中级篇、高级篇、系统篇、四个部分组成,根据野火STM32开发板旧版教程升级而来,且经过重新深入编写,重新排版,更适合初学者,步步为营,从入门到精通,从裸奔到系统,让您零死角玩转STM32。
M3的世界,与野火同行,乐意惬无边。
另外,野火团队历时一年精心打造的《STM32库开发实战指南》将于今年10月份由机械工业出版社出版,该书的排版更适于纸质书本阅读以及更有利于查阅资料。
内容上会给你带来更多的惊喜。
是一本学习STM32必备的工具书。
敬请期待!前言uC/OS是一个微型的实时操作系统,包括了一个操作系统最基本的一些特性,如任务调度、任务通信、内存管理、中断管理、定时管理等。
而且这是一个代码完全开放的实时操作系统,简单明了的结构和严谨的代码风格,非常适合初涉嵌入式操作系统的人士学习。
很多人在学习STM32中,都想亲自移植一下uC/OS,而不是总是用别人已经移植好的。
在我学习uC/OS的过程中,查找了很多资料,也看过很多关于如何移植uC/OS到STM32处理器上的教程,但都不尽人意,主要是写得太随意了,思路很乱,读者看到最后还是不确定该怎样移植。
为此,我决定写这个教程,让广大读者真正了解怎样移植。
学前建议:C语言 + 数据结构Wildfire Team2011年11月3日1、官方源代码介绍首先我们下载源代码,官方下载地址:/page/downloads/ports/st/stm32(下载资料需要注册帐号)或者网盘下载:/c0jnhmfxcp我们需要下载的就是下面这个,因为我用到的开发板芯片是STM32F103VET6注意:下载的源代码开发环境是IAR编译器的。
我们使用的uCOS是2.86版本。
下载解压后可以看到Micrium含有三个文件夹:文件名说明AppNote s 包含uCOS-II的说明文件,其中文件Micrium\AppNotes\AN1xxx-RTOS\AN1018-uCOS-II-Cortex-M3\AN-1018.pdf是很重要的。
STM32入门系列-学习STM32要掌握的内容
STM32⼊门系列-学习STM32要掌握的内容STM32芯⽚架构STM32F103系列芯⽚的系统架构如下:STM32芯⽚基于ARM公司的Cortex-M3内核,由ST公司设计⽣产,内核与总线矩阵之间有I(指令)、S(系统)、D(数据)三条信号线。
内核通过总线矩阵与FLASH、SRAM、外设连接。
⽽外设包括GPIO、USART、I2C、SPI等。
STM32芯⽚系统结构STM32F103 系列芯⽚(不包含互联⽹型)的系统结构如下:从上图可以看出,在⼩容量、中容量和⼤容量产品中,主系统由以下部分构成:四个驱动单元:Cortex-M3 内核 DCode 总线(D-bus)Cortex-M3 内核系统总线(S-bus)通⽤ DMA1通⽤ DMA2四个被动单元:内部 SRAM内部闪存存储器FLASHFSMCAHB 到 APB 的桥(AHB2APBx),它连接所有的 APB 设备这些都是通过⼀个多级的 AHB 总线构架相互连接的。
下⾯我们看看它们各⾃的功能:ICode 总线该总线将 Cortex-M3 内核的指令总线与闪存指令接⼝相连接。
指令预取在此总线上完成。
DCode 总线该总线将 Cortex-M3 内核的 DCode 总线与闪存存储器的数据接⼝相连接(常量加载和调试访问)。
系统总线此总线连接 Cortex-M3 内核的系统总线(外设总线)到总线矩阵,总线矩阵协调着内核和 DMA 间的访问。
DMA 总线此总线将DMA的AHB主控接⼝与总线矩阵相联,总线矩阵协调着CPU的DCode和 DMA 到 SRAM、闪存和外设的访问。
总线矩阵总线矩阵协调内核系统总线和 DMA 主控总线之间的访问仲裁,仲裁利⽤轮换算法。
在互联型产品中,总线矩阵包含 5 个驱动部件(CPU 的 DCode、系统总线、以太⽹ DMA、 DMA1 总线和 DMA2 总线)和 3 个从部件(闪存存储器接⼝(FLITF)、SRAM 和 AHB2APB 桥)。
稀里糊涂学斯stm322
我的家乡梅山作文
我的家乡梅山作文
我的家乡梅山。
梅山是一个风光明媚、物产丰富、空气新鲜的好地方!
梅山有一个大地标,那就是“梅山玉虚宫”,节假日总会吸引络绎不绝的香客来烧香拜佛,祈求家人平安。
梅山有一座“梅山公园”。
早上起床到公园,就会发现许多的`老人家很早就到公园运动,冬天的时候,是来公园的最好的时机,因为那是梅花盛开的季节,一大片一大片的花海,染白了整个山头,好像是一场精采的选美比赛,大家争奇斗艳,热闹极了;夏天的时候,不管是小朋友,还是大人都会来公园散步或玩耍,走在小道上,绿意盎然,枝头上小鸟吱吱喳喳。
提到梅山,绝不能错过这里的名产-蜜饯和茶叶。
梅山的蜜饯酸甜可口,保证让您垂涎三尺。
至于茶叶那就更不得了了,因为,梅山位于高海拔,茶叶不但香气怡人、喉韵甘醇、口齿留香,是爱茶人士的最爱,您也绝对不能错过喔!
梅山,不但空气新鲜,人情味也特别的浓,假日时,欢迎大家来梅山走一走,呼吸新鲜的空气,冬天的时候,更能欣赏到美丽的景色和满山遍野的梅花,还能品尝梅子大餐,喝好茶,保证能让你的身、心、灵得到安顿,顿时舒活一整天哟!。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
జ ၚ ॡ࣯ࢠ ॡ࣯ࢠक ࣯ ࢠऋˣॡ࣯ ç qƲ670 Nj Ʊ8 ࣯ÝŪ ऋÝŪ ࢹ Ū âၚqƲ¹ /ؽҗ ͽ %- ܼ$ L ̵ )670 &RUWH[ 0 #&RUWH[ 0 ǟ $50Y 0 8 ሓ )Ȗၘȋ ƽ) bơ0 ) #0 0 ࡙ $50Ƒ 0 # 0 ᇍס $50 2(ȑ #) 8࡚ ęѤ 3 δ . (Ǯ)Ƽ- ֧ δ 8ȑb qƲ İ - /ȩ Ȗࡘ࡛ ̵ύ Č Ȗ-ࣣ -ּ ࣣ -ּ670 ༫ę " $ ࣣ -ּ / ) ࣣ -ּ670 q দ ǎ Ʀ ᆼ 670 0) Ρę ҵ ቱූҮp ࡙ - ȩ ࡘ࡛ ̵-# ֨ ) ˣµ-670 )-1 პ -Dž - ȏ ͪ Ҕ+ ĎٕĎ ډ ĩNj ል) ҵȒ(ܾ C ܤ - ࣣ%- (0స ) ĵ (ርˑ/ ͷW ܖ µ - d /ʼnऴq670 e$%$% " - ܖ Үp ළ" ȏ ༫ę 8'0$ Ƣ cࣣ q̤ G>1" 3 ˫ $+% ඥ- ௭ܖ ၠ ඥ Ƒ ந $+%"Nj $3% $3% ÅP Ʀܖ ၠ ၘȋ Č ! 8ȑ $ $3% Ӑǎ2-ၠ #$3% ӐǎȊ-ၠ.1" (-ơ v 670 " ܖ 8 ͪ)ŝ ˷v bϤ 50 670 ) [[[Ϥ#µ˸Ƒ 9 ) 670 ᆿ ֽӀ " ̵ĩ . 5HJ K # - 0$7 ; K - ؽ ሓ 670 Ʊ ҈ %3 Ş ҈ ၠ d K ed670 ) [B6WG3HULSKB/LEB9 eƑ LQF̤-/ / ༐Č 0) 670 ᆿ ֻ< ֻ - Ȗ) - % ჸ +- Ǯ) ֻ> ֻ / -Č Ҕɢ ŝŝሓ ၠ၏670 t " நJ ܖ )- >- .ֻ )8 t)ķķ ę ̤ - Nj ֻ */ - -࡛ -% +) ֻ ŞČ % - Čħ 2 ֻ9 ෪a- ǎ ǎࢨ aൗ µ˸ ֻ \ t a· c") ħ 2 - ۈ tµ $.$>ֻ< ˫ $33/,&$7,21127( '$7$6+((7 67tළ ᇇ Jȏ KWWS ZZZ VW FRP LQWHUQHW PFX FODVV MVSO Ȓᇇ9 ֻ ܼ̤VWP I [BVWGSHULSKBOLEBXP FKPᇇƑ ę9 ֻµ˸ ( $ ֻ µ˸ .( ܄ᇇ670 ) ;Ϥ#µ˸Ƒ ę - ę 9ᇇ")9.(,/0'. #ȩ 0'.O ࡀ # \ ܖ ȑ . ࣣ " tO -OLQN #8/LQN #Ʊ ȩ ,63 ቅ O 86%ᆼƖ(ҿ๛ $պWȖ # $Ѥγ˫ǎ ͵# q q Ҕၕ) q Ҕၕ + # )µ˸ J )ʼnऴ) ()ၚ & ᄣ- ) $҈ ܖ ) ҈ Ȓ ࡙ 670 ҈ qƲؽ c ၘ# /-࡛) ̤0 ˷ ༫ę Ď # ĩ 3 Ǝ q$ ܖּ 00ֻ ቅ))Ȗ - ҈ ) ֻa Ȗ b 3c࡙ČύѤ 670 ҈Iµ˸!cJቱ $/,(17(.0LQL670 JҔ t ֻ Ȓ 3 q# ၒ( - ַ - Nj ֻˣ Үp 2ֻ "- " ܖ P -- ඪ γ ĵ% ҈ ּ Ȓ c µ˸ ࡛࡛+ > ĵ-జ Č 3 Jܖ Ď ˷ ȉ౧ "_Nj # Ꮐ ) 8 ࣣ ܾ dz $% t § $8 ቅ µ ҈ Č $ּ Ӏᆿ ȻưǎజnjӀ t) cజ Ӏ ˫ ֻ ҈ 8 Ȗ ȩ ֻ ቅ)Ȗ VWP I [ KƑ Үp <" ȏ t) Үp Ȓ # ֻ Ȼ జ ӀƑ "t)3 . - ) ǟ ˫ "" " VWP I [ K 8 5HJ + ໘/ t)-༫ę ńc ၠ ˣ- # -> .1"L QFOXG H FRU H BF P K $5 ˤ (- O ˷ .L QFOXG H V\VWHP B VWP I [ K ࣣ' aL QFOXG H VW G L Q W K! ") c˷.Ϥ/ń t)ˣ Nj t)- . /ń < ၠ ˫ " ȏ ၠ / ) c .L QFOXG H VWP I [BFRQ I K ˫ ၚG HIL Q H$(%B%,% 5(* %,% 5(* _ %,% .$5 Ƒ ȉ Ȓt)G HIL Q H&/($5B%,% 5(* %,% 5(* a %,%G HIL Q H5($'B%,% 5(* %,% 5(* %,%G HIL Q H&/($5B5(* 5(* 5(* [G HIL Q H:5,%(B5(* 5(* 9$/ 5(* 9$/G HIL Q H5($'B5(* 5(* 5(*G HIL Q H 2',)<B5(* 5(* &/($5 $$. $(% $$. :5,%(B5(* 5(*5($'B5(* 5(* a &/($5 $$. _ $(% $$.˫ǎVWP I [BFRQ I KƲ̤ ˫Ȓ ̵ ̤ ቅ > ˫ 0 8ȑ> ˫ JҔ ǟà ȩ γ #ᆿ Ӏ " Ƒ 333 ;ҵ ˫ ቅ. K< F--/ $% ᆿ " ܖ- -$ JҔ VWP I [ K γ - - ኞ >3-. Ƒ- W ሓȖ ĩ Nj 3 $% W . ) Ȗb- ( G0L3- 3 ˬᄙ ሓ WNj 8ȑ-Ȓ L QF/ܼ ̤ - +ؖ ))ܼ W Ʊ /$% ) [B$W G3H U L S K B/L EB9 ?/L EUDU LHV?& $,$?& ?'H Y L F H$XSSRU W?$%?$% ) [ܝ +ؖ Ȗ- ܼ̤- -ࣣ ֽၚ҈ ) )ƲLWȖ ƲǮ),W 670 Ƒ - ĵ ֻ ) -ࣣ ̤ Nj - +ؖ ܼ̤ ˫˷v670 ) [B6WG3HULSKB/LEB9 ?3URMHFW?670 ) [B6WG3HULSKB7HPSODWHđ ᆿ " ĵ ύ 8 ȩ ֻ ቅ) ĵ ൗ 8 - -Ғ% ቅ) Ʋ µJƑ ) d /,%e - % ܖ ֻ Ƒ F ֻ Jȏ 1"̤ % ͪd VWP I [BOLE K e ந - )# $ ͪ F <ؿ K ĵሓ . ၠ " ) )ڣ) ඩƲజ ၚ ॡ ந "ȏந - Z . ʼn $% Ӏ ˣ R ܖպW ) ඩƲ ޖ%ƿ ၘȋ %ƿ # đ݂ 0 ĵ) ၘజnjၚঠঠ "ᎰG ()#ၒ( d ě* ě* -W -W -ě˷. ̓t e - )/ Č ǎ ၚ / Č dě* -W e Č d-W e 670 Ʊ -Wঠঠ " ĜtၚqƲV¹ /Č җ ͽ$ "670 ҈ ȏ ၚƑ - " cֻ "1 " 5&& ȉ ÅP ҈ 670 ࡛)4) " "ੑ ) - ސ dঠe3 Č )Nj ě* -W -W - X3Ƒ v ȏந dঠeγ 670 ႋ Ƒ-/) %227 - Jȏᆿ W VWDUWXS V ǟ ၚ)ந Ρ1"+6( . ȏ )ݯ ໘- 0µ˸Ƒ ̤& ( a 0]´ . 2 ᇰ 0+] 62&B,1 $ᇗˣ ၣ26&B287ڐİ+6, ࡚ ˷. 0+] 5&ݯཟ / Ȓ( " Ȓ( 3//ᇗˣ/6( N+] Ȋ- . ȏ )ݯ ҅(Ҕ #J t ͩ$8 Ȋͩ# ঠ/6,5& ݫ Ȋͩ# ঠ ༆ ҅ ɶ <ؗ - ( ĵ <%W ኞΡˍ 8 /6, ħ ś N+] N+]< N+]) ࡚) ɢ 6<6&/. +6, +6( 3// ቱූҮp 5&&B&)*5 Ƒ 0&2> @ȉÅP .0&2 $ᇗ Ȓ( ࡛ሓ-- ၒƣ ˫ ҮpÅPҮp 5&&B&5 ቱූҮp 5&&B&)*5$3% ၠ ȉҮp 5&&B$3% 5675 $3% ၠ ȉҮp 5&&B$3% 5675 $+% ၠ ȩ$Үp 5&&B$+%(15 $3% ၠ ȩ$Үp 5&&B$3% (15 $3% ၠ ȩ$Үp 5&&B$3% (15 $+% ၠ ȉҮp 5&&B$+%5675. ֻּUFF F Ȓ5&&B'H,QLW ၠ5&&Үp /ၠ(Ş ɢ5&&B+6(&RQILJ ၠූ .2- ݯ +6(5&&B+6,&PG ȩ$ # $˷.2- ݯ +6,5&&B3//&RQILJ ၠූ3// ঠc5&&B3//&PG ȩ$ # $3//5&&B6<6&/.&RQILJ ၠූ " 6<6&/.5&&B+&/.&RQILJ ၠූ$+% +&/.5&&B3&/. &RQILJ ၠූȊ-$+% 3&/.5&&B3&/. &RQILJ ၠූ2-$+% 3&/.5&&B/6(&RQILJ ၠූ .Ȋ- ݯ /6(5&&B/6,&PG ȩ$ # $˷.Ȋ- ݯ /6,5&&B*HW&ORF N V)UHT - ę ħ5&&B$+%3HULSK&ORF N&PG ȩ$ # $$+% ၠ5&&B$3% 3HULSK&ORF N&PG ȩ$ # $$3% ၠ5&&B$3% 3HULSK&ORF N&PG ȩ$ # $$3% ၠ5&&B0&2&RQILJ - 0&2౧$ ᇗ ঠ-. ̤ 5&&ֻ Ď . ᇗˣϤ/ Jȏ Ϥ UFF KƑ .ҋ# )8 Ȗ - ቱූ35&& ȩ ᇍ@ ͨ # ȩ) - d6\VWHP,QLW e ȉǎV\VWHPBVWP I [ FV\VWHPBVWP I [ F ၠූ( 0+] c ŝ - ౧ 11&RUWH[ 0 స&RUWH[ 0 ˷ Ƒ 6\V7LFN 6\V7LFN( ȉ- ၏ 6\V7LFN ၠt ɢ ȩ$ "Nj " ၏ ɢҵ ၏ ̤ 6\V7LFN၏ %W/ ɢ ""၏ ˷. &2817)/$* ූȉ Ƒ 8 Ƒ ȩ$670 ּ Ƒ ȩ &RUWH[ 0 ˷ 6\V7LFNȒ(t ၠt / Ƒ Ƒ / 1 'HOD\ 1 Ƒ ç1 ( ( - ķؗ &( ˫ 6\V7LFN - - " ħ9 ę ֻ స Ɯ7 IҾ /7LPLQJ'HOD\ؿ t)(YRODWLOH% !*3,2ܖ خÅP . ᇗˣᇗ # - ᇗˣ ᇗ ܖ) ܼ̤ÅP - ÅP ÅP - ȉ ÅP ) .ÅP JƑ ͩ$ቱූc- ቱූȉ Ƒ ໘ ) " Ϥ# ֻ " ȏƑt) జ" ȏΡˍ Ƒ ǟ)Ҕ " ĜČᇗˣҔ ÅPƑ ˫ - wĜ % #) ƑŮĜ ٝ ƣए ܄ cᇗ ᎵW γdz$-Nj౧$ऋˣę˷ ᇗˣ $ ½Ʋ̤ ºZቱȒ! दİᇗˣ Ʋ Ρ γǮ). µ 0ȏ ּ $$2 $Ȋ - ҵ 3) " ȑ̕0ȏ v ໘" ½ᇗˣ"γ" # ½ #ၒ(Ʋ̤ cிt Ȓ 8$ཡ$ ½ᇗˣ8γ83 ½ ࡚ ᇗˣ ½ ˫ȩ$ ༫ę ˷. . ½ ၣᇗˣ (" ᇗ ǎ ౧ ̤ᇗ 2 ֧ ½ &ᇗȊ ֧ ऋ$V Ϥ ᇰ ౧$ #)༫ę ᇗ ֧%Åݷᇗ # ˫ ঠ p + ࣣͶ ҵ- ˫ ঠ༐ ɿ$ {{ && Ʋ ( ຨᇗ ' [ ౧ !( ǒÅP ȩ - ࡘ ໘ Zቱ_ # 2 ᎵW$V 670 ƑĎ (-2JᎵW$V#ၠt! " ! ǎ ౧$ జnjͩ$#Jȏ ̤˹) 8ȩ Ɩ ҵ ၠ( Jȏ ! Åݷቱූ Ϥ Ϥ#µ˸)% * % %% ၠ ቱූˏ ƣ໘ +Ƒ 8 + ڐİķ ǎ2 ֧ ( njᇕ + ȏ ౧ + njᇕ ֧ҵ ᇗˣ ̤ njᇕ% ֧,-) (- ၣ + Ȓ ၠ၏ ҵ ᇗˣ ͪ-࡙ɯූ ܖ +ᇗˣ ڐİ >2 ֧ᇗˣˋƢڐİ ύ + +ڐİ $ ந ࡙ ڣ̕ (ڐİ ȩ ȉ t ࡙ njᇕ˫ ڐİ ᇗˣ º2 ֦ܴ ȩ +/ )WȒ # Ʊ ȩ ּ - ௭ᇗˣ !( !( ᇗˣ º 2 Ӏ &ᇗˣ p ऋ ҵ / 2 _ %ȩ . Ӏ ௭ ࡚ ໘.ͪ ݖ + ௭- Üƣ ލ ܖ ȩ ࡘ ܣ J _ Ʋ Nj_ ௭% + ঠ _ ၘ $¹ ȩ ݖnj ౧ Njऋ#ލ +ᇗ $< ঠ Ʊ $< ᇗ ś ౧ҵ Njऋ#ލ- " < ) ᇗ $ ฬƲ ȩ v - ᇗ ś ౧ Njऋ#ލ7=ၠ - / ࡘ 0% 0 Array˫ඥ ໔ / ໔v Ȋ -+ / ऋ $ % ލ tᇗ ֧ 2 Ȋ ࡚ ඥnjᇕ˫̓ ȩ "- ) )) % # p +ළ პ 77/ ֧ &026 ֧ Z2 ֧ Ȋ ֧֧ ᇰ̤+ᇗ 2 ֧ś( #ᇗ Ȋ ֧ś(+ ȩ ᇗˣ $ڐİ - njᇕ ƽ+ ȩ ᇗˣ ڐİ(2 ֧+ ঠ _ ᇍ & ˷ # ঠ ࢨ +ቅ ֧ ҵ ˮvnj ֧ ֧ ໘( + ঠ _ + ঠ _ ໘֧ $ + ֧ ލ + ࡚ $ǒ ˮv Z ቱ֧ Oᇗᇗˣᇗ Ȋ ֧ ǎ 2 ֧ ǎ ᇗˣ Ȋǎ ҵၒ( 2ǎ ҵၒ(֧ O # ˏ ֧#ᆼᇗᇗˣ& ) ඩƲజnjၚঠঠ " ¹ 5&& ȩ)#q ȩ ֻ ቱූ670 670 " Ӏ R $ ඩި ቱූ *3,2- Ρ ܖպW ) ඩƲ ޖ%ƿ ၚ " % ĵ Ƒ ၠt " స Ȓ( ȩ % " స ÅP Ǣੑ' ) ၘ0123456789&'()*+,-./0123456789:;2<=>78?2=@ABCDEF2GHIJKL4M NOP7QR234567S T U V W X Y Z [2\]^_F`2abc.defgL7hi j k l m n o\]pN2l m o q rs t\]>78uvw2xyzpab5{|cfg 2}|c~g MY \] Mn ; \] \] M2\]7f H ] eo. 2o. opNM j k l m n e o\] 2 ¡>¢7j k l m n op=£¤M q r s t X q W ¥¦W §r W ¨¦©ªW §s «¦W ªª¬¦t ©«¦ª©V V W ªZ ®®®®®®®®¯°±²\]³´µ27l m ¶·o vw2c¯°g7|·K¸e ¯°2¹º»¼½{¾2AB¿e8ÀÁÂÃÄ @LÅÅÌ®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®Î ÎÏÎ ÐÑÒ Ó Ôo\]. ¿ ]ÕÖo×NOØ\]NOÄ ÅÅÙ]Ó ÚÃ2ÛÜ\]¯°M Í ÝÎ ÏÐÞ^Ò Ó Ôßàoáâã2ÑÚà Ôo\] äÚÃåæ^Ò Ó Ôßàoáâã2Q~eçÚà Ô\]¢^ 2ÑÚà Ôo\]HèéêäÚÃoçÚÃÔ\] ëìíî5}ïÚÃÅÅðÙ]ÓÚÃX 35¯°Z M0123456789123456789:;<=>?+,-@A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A AB C D E F GHI*JKL+,-MN1OPH Q R S T ULVW1MXY3ZL[\1] M^_`_aHb,+,-cd+,-@2Y3457&Y3efLghij k l m n o o p q mU o r s o r m t R n u r v m n o v w xyz{45Lb,|+,-}d+,-@]=3ghi4B C D E F~ 3 yz+,- s o m n A D E< H 1 B C D E F ~ H @ 9A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A L 1 L x X 1¡ X¢1+,-:£¤_GH¥¦ L§|1 X¨©ª«c¬L®¯x¢1¬§|&H>? &'°±1²>?³´ µ¶·¸¢¹H1b,|+,cd+, ¥¦ :º ?¬_GH»¼1»¼½¾³¿^ÀÁ , µÂÃÄL Q R S T UxžµÂÆ1ÇÈÉ/1ÊÉOPG+,M Q R S T UË1Ì Í:_aÎ)*+,-1Ï) *|+,-1ÐÑÒÓLÔÕÖ×Ø]b,|+,-ÙKLÚÛ^1Ü)*+,-L45+ ,:)*Ý]b,|+,-ÙKLÚÛ^1 &Þ)*+,-45ß]àá1Ü)*+, -L459âã·:)*LÞ)*+,-45àáäåÆÓæçè)*ééêë5|)* j Jæìíw@î0123456789& "()*+,-./012345,-6789:;<=>?@A3BCDEFGHIJKL0123456789&'()*+,-.(/0123456789:;4<=.>?@A234BCDE FGHIJ47KL4MN*O7PQ(/RS4TU+,9*7VWXYYZ[\ ]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]A^@_`*a bQ c?defghij k c l^*Oa mnMN*OCa Q o p3*Oa q k c l^r]o s7tumvnwd4r]o pdxyz7{|r}{|o~ 4k c l^*Otujk ^c r7 k ^c o xz {|r}{ r F k ^c r a bgh 4 H xn*O 7 7MN*O4r] ~ 4*O 7s] D o r]o s ( x bg &*O¡0*¢-Q k ^c s c£¤¥¦ §¨ ©ª« k ^c o s o r c£¤¥¦ §¨ ©ª«¬4*O¡0x 57z ®¯.*O7X°±²F 3k c l^³´4 µ F¶·¸¹*Oº»¼[½O4.7¾¿7o p3k c l^eF 47ÀF s] a o r]o sÏËÕ .*OÁv¡0ÂÃÄÅÆ*a fÇ ÈÉ ÊËÌÍÎ ÌËÏ É ÊËÌÍ ÐÑÒÓÔ ÑÖ½OF×F c l k s³´4*Oxâ~ Ø¡0Ù*O7¾ÚÛÜ Ý È ÞßÍ! È à4á ! ! àâ]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] Q &ÅÆ*Xã <äÅÆ®¯*O7 GHXãP*Oº»¼i¼7ÂA^@_`åæ.( çèé4êëì7qí*Oîïêëì7ðgñØ¡0òó\ÊËÌÍÎ ÏôÌ õ É ÊËÌÍ ÝÑö¡0÷ø4ù F7z k c l^_úi.ûü4*Oêëì Áv¡07ý þ'ÿ0( k c l^_*Ox ]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]0123456789&'()*+),-)./01*2-).34'+),-).56*789:;<=3>'?@A@B'C D E'F G H I J G K L B-).MNO PQRS:;-).T UVWXYZ['\]-).*7W^XY_`a`bcdef g&g4:;hijklm Zn n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n opqrs&'C t E u v u w x y z{K H G B z w x O|w z I T}}~ qr:; :;-).3 `a : r-). s)+-).h -).C t E u v H z w H z B H w K u w x y z{6 E? S C t E u v E x z B B H K B K H@g C t E u v E? u G x x@Lr C t E u v E? u G x x@L: )+-).C t E u v E x z B B H K B K H@g C t E u v E? u G x x@L H@@¡ B z w x H z w H z Br C t E u v E? u G x x@L: -).C t E u v E x z B B H K B K H@g C t E u v E? u G x x@L K¢H z w H z Br :;£ ¤ C t E u v E x z B B H K B K H@g C t E u v E? u G x x@L u¡I 4' E¥v u w x y z{K H G B z w x O|w z I T}}~ qr:;£ 3 ¦§ W`a : ¨© E¥ª«~¬§:;®¯ E¥v°±²E³z x@u w x y z{¨© ´ §®¯°±²E v E x z B B H K B K H@g°±²E v³z x@r µ ®¯ ¶, ·p :; °±²E v E x z B B H K B K H@g°±²E v D w I@ r µ ®¯ ¸¹º»°±²E v E x z B B H K B K H@g°±²E v²H z{{@H~¼6½¨:®¯ ¾¿À °±²E v E x z B B H K B K H@g°±²E v³z x@u¡I>'Á~A B¡>4y&ÂÃv z B g :ÄÅ:;Æ£0123456789&'()*+,-./012)345+67089:;<=>?+@ABCD&'+ EF0GHI,-JKL+MNOP(QRST(U V W X0&'1YZ[\]^J_`ab&'cd<efghQijk0l m n o;p+hqrstuvwxyz{|}~ | X X X Xbw E+ W ¡ ¡ ¢ ¡¢ n £¢ £¡ ¤ E}~¥¦=+§¨©§ W ¡ ¡ ¢ ¡¢ n ª « ¬¡ ®wA¯+°±©§² W ¡ ¡ ¢ ¡¢ n ¡ ¡³®w´µ¶· W ¡ ¡ ¢ ¡¢ n £ ¡¸¹º»¼½¶·{|¾( | W ¡ ¡ ¢ ¡¢ n £ ¿£ À¿X ¡Áw{|}~ |A¯Â¥¦¶· W ¡ ¡ ¢ ¡¢ n ÃlÄ&'+Å WÆÇD bÈÉÊ Ë _ ÌÊÉÅ WÆ W ¡ ¡ ¢ ¡¢ nÅ WÆ ÍÅ WÆ ËÎÅ WÆ W ¡ ¡ ¢ ¡¢ nÅ WÆ ÍÅ WÆ Ïoà ÐÎÅ WÆ W ¡ ¡ ¢ ¡¢ nÅ WÆ Ã ÍÅ WÆ Ã À ÎÉÉÑÒEFÓ ÔÅ WÆ W ¡ÕÅ WÆ Ö×Å WÆ W ¡ ¡ ¢ ¡¢ ØÎÉÊ _o _ ÌÊÉÅ WÆ W ¡ ¡ ¢ ¡¢ nÅ WÆ ÍÅ WÆ _oÎÅ WÆ W ¡ ¡ ¢ ¡¢ nÅ WÆ Ã ÍÅ WÆ Ã W U À«Æ W UÅÎÉÉÙÚEÛÓ ÔÅ WÆ W ¡ÕÅ WÆ Ö×Å WÆ W ¡ ¡ ¢ ¡¢ ØÎ0123456789&'()*+,-./0123456789:;<=>?34567@A B C D E F G H I4I J K D I K J L M34567@A B C D E NO2P4Q A RSTU89VWXYZ34567@A B C D E F G H I4I J K D I K J L M34567@A[\Q NO2P4Q A RSTU89VWX]^34567@A B C D E F G H I4I J K D I K J L M34567@A[_5 `4A Q RSTUVWabcdXefghi34567@A B C D E F G H I4I J K D I K J L M34567@Q j k I l H I m'[37A]no pqrstuvwx[J H G I y z{|}~) ? g} ) O [K I D} ) 34567 @[K I k o J G *- |*- '*-&0123456789&'()*+,-./0*+1-.22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222223456789:;*<=>?@A B C D E*<=>+FGHI+JK?LMNOPQ R STU;VWXYZ[\?]^_`aIabc d e f g B h ijk?lm*<aInopq?r st:uvwx?yz{|+}~ R u + N.0123456789&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&。