当前位置:文档之家› STM32 学习笔记

STM32 学习笔记

STM32 学习笔记
STM32 学习笔记

2011年1月15日星期六

SysTick 是MDK定义了的一个结构体(在stm32f10x_map.里面),里面包含CTRL、LOAD、VAL、CALIB 等4 个寄存器,

我自己理解为要是使用systick时钟是肯定要对这个寄存器进行设置的。具体到什么事寄存器什么为什么内部会是这个样子,那我就不得而知了但是我懂得这个是配置必须的东西而且这个寄存器是被mdk定义为了一个结构体stm32f10x_map

今天算是又学到了一招

利用mdk 里边右键里面有一个go to definition 可以跟踪到这个元素的初始的位置,就相当于是找到它最为原始的定义。

然后找到了一些个

U8 u16 u32 等等的含义哈哈原来STM32就是如此的简单当然群里的威力也是很大的。

typedef signed long s32;

typedef signed short s16;

typedef signed char s8;

typedef signed long const sc32; /* Read Only */

typedef signed short const sc16; /* Read Only */

typedef signed char const sc8; /* Read Only */

typedef volatile signed long vs32;

typedef volatile signed short vs16;

typedef volatile signed char vs8;

typedef volatile signed long const vsc32; /* Read Only */

typedef volatile signed short const vsc16; /* Read Only */

typedef volatile signed char const vsc8; /* Read Only */

typedef unsigned long u32;

typedef unsigned short u16;

typedef unsigned char u8;

typedef unsigned long const uc32; /* Read Only */

typedef unsigned short const uc16; /* Read Only */

typedef unsigned char const uc8; /* Read Only */

typedef volatile unsigned long vu32;

typedef volatile unsigned short vu16;

typedef volatile unsigned char vu8;

typedef volatile unsigned long const vuc32; /* Read Only */

typedef volatile unsigned short const vuc16; /* Read Only */

typedef volatile unsigned char const vuc8; /* Read Only */

2011年1月16日星期日

void delay_us(u32 nus)

{

u32 temp;

SysTick->LOAD=nus*fac_us; //时间加载

SysTick->VAL=0x00; //清空计数器

SysTick->CTRL=0x01 ; //开始倒数

do

{

temp=SysTick->CTRL;

}

while(temp&0x01&&!(temp&(1<<16)));//等待时间到达

SysTick->CTRL=0x00; //关闭计数器

SysTick->VAL =0X00; //清空计数器

}

我现在有点不明白CTRL之前设置的有相应的选择,为什么这个地方只要第0位置位就行了,而不需要相应的其他设置了,比较郁闷

但是后便的不难理解,首先do-while语句就是先执行do{}内的内容,再判断while{}内的内容,如果while中的内容为非0,则再返回do{}内执行,再判断while{},直到while{}内部条件按为0,跳出循环。、

就目前来说的话delay int 就是初始化那块的话,就是一个瞬间的设置,可以理解为像是12864那个液晶一样,进行的一个初始化,之后就不用再去处理了,它应该会一直选择外部时钟。

现在是下午的14点53分,我今天也是到论坛上去请教了高手,现在我真正的明白了,首先第一个对CTRL初始化设置,SysTick->CTRL&=0xfffffffb;//bit2 清空,选择外部时

钟 HCLK/8 这一步因为用到的是&方式,也就是只是把bit2清空了,也就是选择了外部时钟STCLK。

接着下边的演示程序中,所用到的对CTRL寄存器的设置中,开启定时器的设置方式最好为:SysTick->CTRL|=0x0001 ;因为这样的话不会影响到其他的配置。

同理关闭计数器SysTick->CTRL&=0xFFFE;这样比较合适。

下边是我在论坛上高手帮助我的回答。

第一个问题:

SysTick->CTRL&=0xfffffffb;//bit2 清空,选择外部时钟 HCLK/8 此处是将CTRL寄存器设置为外部时钟,其余项都是置位状态

这里你看看SysTick->CTRL的默认值就知道了,SysTick->CTRL在复位后的状态为0X0000,也就是全零。这里我的SysTick->CTRL&=0xfffffffb;//bit2 清空,其实只是清空bit2,其他位,原来是什么状况,在执行这句之后,还是什么状况。注意这里用的是&。

第二个问题:

SysTick->CTRL=0x01 ; //开始倒数 而在这一步当中又把CTRL寄存器的相当于 只是把第0位开启了,也就是开启了倒数,而其他的位全部不都是变为了0么?这一点不会对相应的前面的设置造成影响么? 比如CTRL的16位,2位,1位造不成影响么?

这里,其实我的设置真是有不妥的,只是在使用的时候,恰好不影响之前的设置(bit2,本来就该设置为1)。所以结果是正确的。但是这样设置是不妥的。最好就是

SysTick->CTRL|=0x0001 ; 这样,就完美了。

同样,在结束延时之后:

SysTick->CTRL=0x00; //关闭计数器

应该改为:

SysTick->CTRL&=0xFFFE; //关闭计数器

15::31

现在学习的是板子上边一些I/o口的设置内容,请教了高手,问他们用不用把相关的包括位带操作理解掉,结果高手说不用,确实之前我也看了,但是着实不好理解啊。我去啊!!!云里雾里的。

2011年1月17日星期一

刚看到了STM32的倍频函数,这个东西的具体如何设置的,我现在还不能很好的理解,但是我知道倍频的范围2-16倍

void Sys_Soft_Reset(void)

{

SCB->AIRCR =0X05FA0000|(u32)0x04;

}

在Sys_Soft_Reset 函数里面,我们只是对SCB-> AIRCR 进行了一次操作,即实现了STM32 的软复位。AIRCR 寄存器的个位定义如下图所示:

从上面的位定义可以看出,要实现STM32 的软复位,只要置位BIT2,这样就可以请求一次软复位。这里要注意bit31~16 的访问钥匙,要将访问钥匙0X05FA0000与我们要进行的操作相或,然后写入AIRCR,这样才被CM3 接受。

今天主要是看了一些关于STM32的库函数,首先我了解到,STM32的这种库函数方式都是基于对寄存器的操作,之所以要设计这些库函数,也是为了方便开发者对这块处理器的使用,就像是51这块处理器吧,它的寄存器设计,我们几乎都不是很了解,但是会用是肯定的,可能这些东西当真正达到需要了解他们内部的时候,早就已经过时了吧,这只是我个人的理解。

再者,我了解到,STM32处理I/O口很多,并且可以灵活的象51一样读和写,虽然说都是ST公司设计好的库函数,目前要是让我对这部分库函数来分析的话,肯定不能够完全理解,因为C语言的水平包括硬件的理解,还远远不够。

NVIC这个东西很神奇,到现在我不能够理解他的意义,初步的来看的话就是它可以控制中断的等级

Stm32_Clock_Init函数这个东西,我感觉是一个比较常用的函数吧,它基本上用来设置倍频,具体的咋实现的,而且包括倍频是个啥东西,我现在还不能理解,也就刚刚理解到它可以提高处理速度。

MYRCC_DeInit基本上不是很理解,

Sys_SleepDeep函数,这个函数来说的话,基本上算是个调节STM32的功耗模式,这个也是相对于51它所先进的功能吧。

2011年1月18日星期二

CM3 内核支持256 个中断,其中包含了16 个内核中断和240 个外部中断,并且具有256 级的可编程中断设置。但STM32 并没有使用CM3 内核的全部东西,而是只用了它的一部分。STM32有76个中断,包括16 个内核中断和60 个可屏蔽中断,具有16 级可编程的中断优先级。

到目前来说的话,我看到了Interrupt Priority Registers,是一个中断优先级控制的寄存器组。这个东西我深深的感觉到了有点绕,其实在51的学习中也是,直到后期我才真正明白中断的优先级有什么用,因为到后期做一些东西的时候,我用到了他们的时候才知道,中断的优先级是咋回事情,现在我对于IPR这个寄存器组,还不能很好的理解,希望晚上能理解他,

至少是知道这是个啥情况。

2011年1月19日星期三

今天最大的收获就是知道了RCC的重要性,因为貌似在STM32中不像是51那样它对时序的要求并不是像是51单片机那样只要有外部的晶振就能随意的控制每一个外设了,但是这个东西每干一件事情之前都要使能一下时钟,也就是RCC这个东西。

这也就是为什么每一个STM32的程序在开始之前都需要有一个clackint 时钟设置函数了,而这个函数,具体到如何操作,每个人的方法都不同。

2011年1月20日星期四

我今天刚刚在看RCC这个东西,也就是时钟了,每一个CPU都会有自己的时钟,里面的每一个所谓的控制器,我认为都需要时钟去支持,因为这样它才能正常的去按照次序工作,刚刚主要是在看时钟树,我的目的就是想看一看,牵扯到DPIO的所有时钟都有哪些,而这些时钟肯定来说的话我们以后都会用到,用他们在STM32中无非是这几个步骤,第一使能它,第二配置它,第三配置成功没,如果成功了,就用它们。

我发现GPIO的RCC是

APB2 来控制的,那么我想点亮板子上的一个是PA8,另一个是PD2。硬件上边显示的为输出低电平就亮。

刚看了看时钟树,现在我要做的是用外部的那个8M晶振来去弄,

1.打开它

2.倍频打开,设置好,我看了好多程序基本上都是谁知为9倍频,也就是后边说的如果

2011年1月21日星期五

通过了这6天的学习,我感觉通过配置寄存器的方式编程方式更适合我自己,所以决定走寄存器之路。深知这个不是很容易理解,但是它有的好处就是一旦入门就可灵活的应用STM32。加油了!

今天我还要继续弄懂控制一个GPIO的方法,下面是分析的过程:

1.复位所有的RCC时钟。

其中包括:

A.APB1还有APB2中的所有外设的时钟复位,通过查看所有的寄存器,我发现APB1,还有APB2都有专用的复位寄存器,只需要简单的写入0x0000 0000就能复位,这个其实在以后的运用过程中,完全能用到。V10版65页

B. RCC->AHBENR = 0x00000014; 这个是外设时钟使能寄存器AHBENR,但是为什么要在

复位的时候还是要保留SRAM还有FLASH,我还要接着研究,我对V10手册进行了搜索,直接就是搜索的SRAM,结果发现这个东西贯穿了整个STM32这个系统。所以真的值得研究一下,一遍更好的理解。

刚刚看到STM32的启动方式方面,首先在硬件方面:

BOOT1和BOOT0的电平,决定了芯片的启动方式,在这三种启动方式中,有两条启动方式都有牵扯到主闪存,还有内置SRAM,看到这里我再想一下,为什么AHB在复位的时候不是把所有的相关的寄存器都设置为0,而唯独留下SRAM还有FLASH。目前来说我只能想这么多,具体对不对,到后面我再慢慢理解。

C. 分别关闭RCC_APB2ENR还有RCC_APB1ENR使能寄存器,和复位的值一样都是0x0000

0000.

D.在分析到这里的时候我又遇到了一个问题,不知道为什么在复位RCC_CR的还有RCC_CFGR的时候要使能内部高速时钟,还有就是为什么在复位化他们的时候还要分开来初始化。

今天遇到的问题&高手对问题的解答:

void MYRCC_DeInit(void)

{

RCC->APB1RSTR = 0x00000000;//复位结束

RCC->APB2RSTR = 0x00000000;

RCC->AHBENR = 0x00000014; //睡眠模式闪存和SRAM时钟使能.其他关闭.

RCC->APB2ENR = 0x00000000; //外设时钟关闭.

RCC->APB1ENR = 0x00000000;

RCC->CR |= 0x00000001; //使能内部高速时钟HSION 问题一:请问为什么要使能内部高速时

钟?

RCC->CFGR &= 0xF8FF0000; //复位

SW[1:0],HPRE[3:0],PPRE1[2:0],PPRE2[2:0],ADCPRE[1:0],MCO[2:0]

RCC->CR &= 0xFEF6FFFF; //复位HSEON,CSSON,PLLON

RCC->CR &= 0xFFFBFFFF; //复位HSEBYP

RCC->CFGR &= 0xFF80FFFF; //复位PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE

RCC->CIR = 0x00000000; //关闭所有中断

//配置向量表

#ifdef VECT_TAB_RAM

MY_NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);

#else

MY_NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);

#endif

问题二:我自己认为在这个配置向量的表的作用,就相当于是给STM32 选择一个内存空间,并且就相对于

指针一样,让它从0x0开始启动。紧接着数据就会从这个地址往里边进行相应的读写之类的操作吧。请问

我理解的对不对?如果不对或者说有更好的理解,请大家帮忙写写。

问题三:我看到下边对寄存器RCC_CFGR还有RCC_CR的复位为什么不直接一次就复位全部需要复位的东西,

而是要分开来复位?

原子的回答:

问题1:使能内部时钟, 是因为这个时候,外部时钟还没开启,这里设置使用内部8M的RC时钟来作为系统时

钟源.从而执行代码.这里我估计不要也是可以的,因为系统默认的时钟,就是内部8M的RC时钟.你可以去掉

这句,再试验一下. //本人经过试验已经很好的说明了不启动内部时钟也依然能够很好的工作。

问题2:你的理解没错,其实STM32内部所有的寄存器,都有地址的,这些地址在某个值的基础上偏移,这里的

配置向量表,其实就是给内部的寄存器等配置一个基址,让他们在这个基址上执行. 当使用sram调试的时候,

这点就非常重要了.

问题3:这里可以一次复位,不过这样写,看起来比较舒服,知道那几个位对应的是复位什么外设. 当然你熟悉

之后,可以一次复位所有外设.

2.配置RCC 各种时钟:

对照时钟树来看,使用外部高速时钟时候的配置方式,都需要我们配置些什么,我通过前几天的学习吧,发现了基本上配置时钟的寄存器仅仅有两个,一个是RCC_CR,一个是RCC_CFGR,所以我们就来对对照着时钟树,来看一看我们控制GPIO都需要对哪些个东西配置时钟。

2011年1月22日星期六

首先查找到GPIO的时钟是有APB2,前几天查了的,跟它相连的有AHB分频器,SYSCLK,SW,其余的话,我只能根据经验来搞,首先一般来说的话,我看到基本上都用的是外部的高速时钟来最为整个STM32这个系统的时钟源,但是具体到如何分频什么的,就是要根据不同的寄存器来控制了,在SW之前的话,应该是首先使能一下外部时钟HSE,使能PLLXTPRE,再使能PLLSRC,使能PLLMUL最后就跟SW衔接上边了。我不知道自己的想法对不对,但是试验就可以了。

如果成功的配置好了RCC_GPIO的时钟的话,那么下边要做的工作应该就是配置一下GPIO 的工作,我现在去看一下参考手册。应该会有GPIO的介绍。

我想的是,可以直接像是库函数那样写一点通用的代码,直接就把相应的功能写成子函数,到时候配置好时钟以后就能直接调用函数,就像是51当中的命令方式一样,直接就是P1^0=0,这样的话比较好用一点。

刚看到了这个东西,感觉挺有必要看的,首先是APB1的速度限于36M,还有就是必须使能外设的时钟,才能使用外设。这也就是为什么必须要先设置时钟,再设置外设的工作方式的原因了吧,我想。

19:30

我看到了GPIO的功能描述,还有几个相关的寄存器,但是现在为止的话我还看不懂,那个

端口位功能图,不是很会分析,我只能慢慢看了,哎……要是有老师在就好了呢。

2011年1月23日星期日

今天主要是学习的配置GPIO的方式和相关的寄存器,我看到基本上配置GPIO会牵扯到三个量,

1.管脚

2.方式

3.频率速度

2011年1月24日星期一

今天终于把灯点着了!收获就是点了个灯。哈哈哈!

STM32 IIC 学习笔记总结

STM32系列IIC学习笔记经验总结一、各寄存器内容与组织:控制、地址匹配、数据、状态、时钟控制、上升沿控制

二、IIC协议及STM32的master实现 EVENT后的第一个符号表示事件发生后对应的标志位的状态,着重看7位地址的通信;

三、基础知识(主要讨论起主机模式,从机模式的配置与使用可类比) 1.默认工作在从机模式,产生起始信号后自动转为主机模式,产生终止信号或仲裁失权后自动转为从机模式;起止信号由主 机模式下的软件实现,地址也只能由主机发送,响应信号由接收器发出(软件实现),要注意区别主机、从机、发送机、接收机; 2.数据通信的直接通道,SDA LineShift RegisterDRMemory(数据寄存器与存储器直接的数据交换发生在DMA模式, 另外若从机在SDA接收到的是地址则直接会与地址寄存器比较,而不会送入数据寄存器) 3.主机产生时钟信号,一串数据总是以起始于start信号,终止于stop信号,一旦SDA线上产生start位信号,主机模 式便被选中;9个寄存器的功能分配简单明了:I2C_CR2主要配置时钟与模块中断及DMA使能位,I2C_CR1则主要产生Start等控制信号,I2C_SR2主要是MSL、TRA和BUSY标志位,I2C_SR1则是其他事件的标志位,接下来就是存储数据的I2C_DR,时钟设置的I2C_CC4R和I2C_TRISE,地址匹配的I2C_OAR1和I2C_OAR2; 4.主机模式必要操作序列:外围时钟输入最少2M(标准模式)、4M(快速模式) 1)配置I2C_CR2寄存器以产生正确时序; 2)配置时钟控制寄存器I2C_CCR; 3)配置上升时间寄存器I2C_TRISE; 4)配置I2C_CR1寄存器以使能接口电路; 5)配置I2C_CR1寄存器,置位START位以产生起始信号; 5.时序具体解析 1)Start信号,置位I2C_CR1的START位以产生起始信号(在总线空闲时,即I2C_SR2的BUSY清零),使转为主机模式(置位I2C_SR2的MSL);在主机模式下,置位START位会在当前字节传输完成后产生一个重启ReStart信号;一旦Start信号送出,I2C_SR1的SB位会由硬件置位并产生中断(前提是ITEVFEN位被置位,貌似文档有误,我认为应是IC2_SR2的ITEVTEN位),然后需要读SR1和写DR以清零SB(这也符合操作时序); 2)从机地址发送,7位模式下,地址字节一旦送出,I2C_SR1的ADDR位会由硬件置位并产生中断(前提是ITEVFEN 置位),然后主机等待读取SR1和SR2以清零ADDR(稍微符合,读SR2貌似饶了一步);7位模式下,地址字节最低位若是0则说明主机要进入发送模式,若是1则是接收模式;I2C_SR2的TRA表示主机在发送模式还是接收模式; 3)主机发送模式,地址送出且ADDR清零后,主机会将DR中数据发送到SDA line(当然经过Shift Register),主机会等到第一个数据写入DR(EV8_1阶段),若收到响应脉冲,SR1中的TxE位会置位(前提是ITEVFEN和ITBUFEN已置位);在最后一个字节传输结束前的传输过程中,若TxE置位且某数据字节没有写入DR,BTF会置位直到(硬件清零)该数据字节被写入到DR,这个过程中SCL会一直被拉低; 4)主机发送模式关闭通信,最后一个字节被写入DR,CR1的STOP位要由软件置位而产生停止信号,接口自动转为从机模式(MSL清零);置位Stop位即对应于EV8_2事件; 5)主机接收模式,地址送出且ADDR清零后,主机会进入接收模式,接口会从SDA line中读数据到DR中(同样经过Shift Register);每个字节接收后的操作序列为,产生应答信号(前提是CR1的ACK位置位),RxNE位置位并产生中断(前提是SR2的ITEVFEN和ITBUFEN置位);在最后一个字节传输结束前的传输过程中,若RxNE 置位且某数据未从DR中读取,BTF会置位直到(硬件清零)该数据字节被读出,这个过程SCL会一直被拉低; 6)主机接收模式关闭通信,收到最后一个字节后会发送NACK信号给从机,从机收到NACK会释放总线(SDA和SCL),此时主机便可发送一个Stop或Restart信号;在读完倒数第二个字节后(RxNE中断后),要清零ACK 位以产生NACK应答,要置位STOP/START位以产生Stop/Restart信号;在单字节数据接收状况,NACK 要在ADDR清零前(EV6)设置,STOP信号要在ADDR清零后配置;Stop信号产生后,主机自动进入从机模式(SR2的MSL清零); 7)最后一字节数据接收的ACK响应前若RxNE清零(ACK清零与Stop请求)没有完成,则建议采取以下步骤以确保ACK位在最后一字节数据接收前被清零,STOP位在最后一字节数据接受完后(没有附加数据)被置位: (1)2字节的数据接收:等到ADDR=1;清零ACK,置位POS;清零ADDR;等到BTF=1(数据1在DR,

STM32学习笔记

STM32学习笔记整理 端口复用配置过程 引脚具体可以复用为啥功能,参考芯片手册STM32F103ZET6.Pdf 具体每个引脚配置成什么模式,参考STM32中文参考手册,第八章,通用IO和复用。NVIC中断

假定设置中断优先级组为2,然后设置 中断3(RTC中断)的抢占优先级为2,响应优先级为1。中断6(外部中断0)的抢占优先级为3,响应优先级为0。中断7(外部中断1)的抢占优先级为2,响应优先级为0。 那么这3个中断的优先级顺序为:中断7>中断3>中断6 特别说明: 一般情况下,系统代码执行过程中,只设置一次中断优先级分组,比如分组2,设置好分组之后一般不会再改变分组。随意改变分组会导致中断管理混乱,程序出现意想不到的执行结果。 首先,系统运行后先设置中断优先级分组。调用函数: void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup); 整个系统执行过程中,只设置一次中断分组。 然后,中断初始化函数 NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 抢占优先级为1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子优先级位2 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据上面指定的参数初始化NVIC寄存器 结构体内容NVIC_InitTypeDef typedef struct {

MINI-STM32 开发板入门教程.

MINI-STM32 开发板入门教程(一) 开发环境建立及其应用 我们常用的 STM32 开发编译环境为 Keil 公司的 MDK (Microcontroller Development Kit) 和 IAR 公司的 EWARM. 在这里我们提供了比较稳定的新版本编译软件下载: MDK3.50 点击此处下载 EWARM 5.40 点击此处下载 限于篇幅, 在我们的教程里面将先以 MDK 下的一个例子来介绍如何使用 MDK 进行嵌入式 应用开发. MDK 安装与配置: 基于 MDK 下的开发中基本的过程: (1) 创建工程; (2) 配置工程; (3) 用 C/C++ 或者汇编语言编写源文件; (4) 编译目标应用程序 (5) 修改源程序中的错误 (6) 测试链接应用程序 ---------------------------------------------------------------- (1) 创建一个工程: 在 uVision 3 主界面中选择 "Project" -> "New uVision Project" 菜单项, 打开一个标准对话框选择好你电脑中的保存目录后, 输入一个你的工程名字后点确认.我们的工程中建了一个名字叫 "NewProject" 的工程. 从设备库中选择目标芯片, 我们的 MINI-STM32 开发板使用的是 STM32F103V8T6, 因此选 中 STMicrocontroller 下对应的芯片: ARM 32-bit Cortex-M3 Microcontroller, 72MHz, 64kB Flash, 20kB SRAM, PLL, Embedded Internal RC 8MHz and 32kHz, Real-Time Clock, Nested Interrupt Controller, Power Saving Modes, JTAG and SWD,

STM32学习笔记

输入模式初始化GPIOE2,3,4 ①IO口初始化:GPIO_InitTypeDef GPIO_InitStructure; ②使能PORTA,PORTE时钟: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE); ③PE.2.3.4端口配置:GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4; ④设置成(上拉)输入:GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; ⑤GPIO_Init(GPIOE, &GPIO_InitStructure); 输出模式初始化 ①IO口初始化:GPIO_InitTypeDef GPIO_InitStructure; ②使能PB,PE端口时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); ③3LED0-->PB.5 端口配置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; ④设置(推挽)输出模式GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; ⑤设置IO口速度为50MHz GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; ⑥说明初始化哪个端口GPIO_Init(GPIOB, &GPIO_InitStructure); 在LED灯试验中初始为高电平灭GPIO_SetBits(GPIOB,GPIO_Pin_5); 再初始化相同发输出模式时③④⑤可省略例如(经实验初始化恰好为不同IO口相同IO序号③可省略,应该不规范吧) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1-->PE.5 端口配置, 推挽输出GPIO_Init(GPIOE, &GPIO_InitStructure); //推挽输出,IO口速度为50MHz GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE.5 输出高 1,头文件可以定义所用的函数列表,方便查阅你可以调用的函数; 2,头文件可以定义很多宏定义,就是一些全局静态变量的定义,在这样的情况下,只要修改头文件的内容,程序就可以做相应的修改,不用亲自跑到繁琐的代码内去搜索。 3,头文件只是声明,不占内存空间,要知道其执行过程,要看你头文件所申明的函数是在哪个.c文件里定义的,才知道。 4,他并不是C自带的,可以不用。 5,调用了头文件,就等于赋予了调用某些函数的权限,如果你要算一个数的N次方,就要调用Pow()函数,而这个函数是定义在math.c里面的,要用这个函数,就必需调用math.h 这个头文件。

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的出现就是一种趋势,一种潮流,我们要做的就是搭上这趟快车,让自己的技术更有竞争力。 1.1.151与STM32架构的区别 我们先普及一个概念,单片机(即MCU)里面有什么。一个人最重要的是大脑,身体的各个部分都在大脑的指挥下工作。MCU跟人体很像,简单来说是由一个最重要的内核加其他外设组成,内核就相当于人的大脑,外设就如人体的各个功能器官。 下面我们来简单介绍下51和STM32的结构。 1.51系统结构 51系统结构框图

stm32的GPIO学习笔记讲课教案

s t m32的G P I O学习 笔记

I/O口工作模式: 1.高阻输入 输入模式的结构比较简单,就是一个带有施密特触发输入(Schmitt-triggered input)的三态缓冲器(U1),并具有很高的阻抗。施密特触发输入的作用是能将缓慢变化的或者是畸变的输入脉冲信号整形成比较理想的矩形脉冲信号。 执行 GPIO管脚读操作时,在读脉冲(Read Pulse)的作用下会把管脚(Pin)的当前电平状态读到内部总线上(Internal Bus)。 2.推挽输出 推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高. 在推挽输出模式下,GPIO还具有回读功能,实现回读功能的是一个简单的三态门 U2。注意:执行回读功能时,读到的是管脚的输出锁存状态,而不是外部管脚 Pin的状态。 3.开漏输出 开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以改变传输电平,比如加上上拉电阻就可以提供TTL/CMOS电平输出等。

开漏输出和推挽输出相比结构基本相同,但只有下拉晶体管 T1而没有上拉晶体管。同样,T1实际上也是多组可编程选择的晶体管。开漏输出的实际作用就是一个开关,输出“1”时断开、输出“0”时连接到 GND(有一定内阻) 开漏输出和推挽输出相比结构基本相同,但只有下拉晶体管 T1而没有上拉晶体管。同样,T1实际上也是多组可编程选择的晶体管。开漏输出的实际作用就是一个开关,输出“1”时断开、输出“0”时连接到 GND(有一定内阻). 4.钳位二级管 其作用是防止从外部管脚 Pin输入的电压过高或者过低。 提高输出电压一种简单的做法:是先在 GPIO管脚上串联一只二极管(如 1N4148),然后再接上拉电阻。 ///////////////////////////////////////////////////////////////////////////////////////////////////////// STM32的GPIO管脚深入分析: 概述:STM23的每个GPIO引脚都可以由软件配置成输出(推挽或开漏),输入(带或不带上拉或下拉)或复用的外设功能端口。多数GPIO引脚与数字或模拟的复用外设共用;除了具有模拟输入(ADC)功能的管脚之外,其他的GPIO引脚都有大电流通过能力。 tip:每个IO口可以自由编程,单IO口寄存器必须要按32位bit被访问。 STM32的每个IO端口都有7个寄存器来控制 一.具体如下8种模式:

用STM32一步一步点亮led灯

STM32之一步一步点亮led (2011-05-09 19:40) 标签: stm32led v3.4MDK 4.12入门分类:stm32 入手stm32以来,一直想快速上手,所以在各大论坛闲逛,各个达人的blog 上学习,正所谓欲速则不达,心急是吃不了热豆腐的!有木有? 最终决定使用st官网的库开发,据大侠们写道使用库可以快速上手,貌似的确如此,一个个教程写的那么好,直接拿过来用就是了。可是那么多个库,聪明的你请告诉到底选择哪一个啊?My God!实话实说,我被这些库折腾了个够!好吧,我最后还是承认最后用的是v3.4的库,是很方便! 切入正题,点亮LED。 硬件:红牛开发板,STM32F103ZET6(144封装). 软件:RealView MDK 4.12 stm32固件库:v3.4 附上自己整理后的库: V3.4_clean.rar 根据官网库自己整理了下,新建了工程模板如下图:(主要参考文章《在 Keil MDK+环境下使用STM32 V3.4库.pdf》)在KeilMDK+环境下使用STM32V3.4库.pdf 入图所示:新建一个目录01_ProLed,建议放在英文路径下,避免不必要的麻烦。将上面的库v3.4解压到此目录,再新建一个project目录,存放工程。 说明: CMSIS:最底层接口。StartUp:系统启动文件。StdPeriph_Lib:stm32外围设

备驱动文件。Project:工程文件。User:用户文件。新建工程步骤:此处略去300字。 简单说明: 1.core_cm3.c/core_cm3.h 该文件是内核访问层的源文件和头文件,查看其中的代码多半是使用汇编语言编写的。在线不甚了解。--摘自《在Keil MDK+环境下使用STM32 V3.4库》 2.stm32f10x.h 该文件是外设访问层的头文件,该文件是最重要的头文件之一。就像51里面的reg51.h一样。例如定义了 CPU是哪种容量的 CPU,中断向量等等。除了这些该头文件还定义了和外设寄存器相关的结构体,例如: 1.typedef struct

STM32各模块学习笔记

STM32 中断优先级和开关总中断 一,中断优先级: STM32(Cortex-M3) 中的优先级概念 STM32(Cortex-M3) 中有两个优先级的概念 —— 抢占式优先级和响应优先级,有人把响应优 先级称作 '亚优先级 '或 '副优先级 ',每个中断源都需要被指定这两种优先级。 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应, 即中断嵌 套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。 当两个中断源的抢占式优先级相同时, 这两个中断将没有嵌套关系, 当一个中断到来后, 如 果正在处理另一个中断, 这个后到来的中断就要等到前一个中断处理完之后才能被处理。 如 果这两个中断同时到达, 则中断控制器根据他们的响应优先级高低来决定先处理哪一个; 如 果他们的抢占式优先级和响应优先级都相等, 则根据他们在中断表中的排位顺序决定先处理 哪一个。 既然每个中断源都需要被指定这两种优先级, 就需要有相应的寄存器位记录每个中断的优先 级;在 Cortex-M3 中定义了 8 个比特位用于设置中断源的优先级,这 8 个比特位可以有 8 种分配方式,如下: 这就是优先级分组的概念。 Cortex-M3 允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此 STM32 把指定中断优先级的寄存器位减少到 4 位,这 4个寄存器位的分组方式如下: 第 0 组:所有 4 位用于指定响应优先级 第 1 组:最高 1 位用于指定抢占式优先级,最低 第 2 组:最高 2 位用于指定抢占式优先级,最低 第 3 组:最高 3 位用于指定抢占式优先级,最低 第 4 组:所有 4 位用于指定抢占式优先级 所有 8 位用于指定响应优先级 最 高 1 位用于指定抢占式优先级, 最高 2 位用于指定抢占式优先级, 最高 3 位用于指定抢占式优先级, 最高 4 位用于指定抢占式优先级, 最高 5 位用于指定抢占式优先级, 最高 6 位用于指定抢占式优先级, 最高 7 位用于指定最低 7 位用于指定响应优先级 最低 6 位用于指定响应优先级 最低 5 位用于指定响应优先级 最低 4 位用于指定响应优先级 最低 3 位用于指定响应优先级 最低 2 位用于指定响应优先级 最低 1 位用于指定响应优先级 3 位用于指定响应优先 级 2 位用于指定响应优先 级

STM32入门基本知识

STM32学前班教程之一:选择他的理由 经过几天的学习,基本掌握了STM32的调试环境和一些基本知识。想拿出来与大家共享,笨教程本着最大限度简化删减STM32入门的过程的思想,会把我的整个入门前的工作推荐给大家。就算是给网上的众多教程、笔记的一种补充吧,所以叫学前班教程。其中涉及产品一律隐去来源和品牌,以防广告之嫌。全部汉字内容为个人笔记。所有相关参考资料也全部列出。:lol 教程会分几篇,因为太长啦。今天先来说说为什么是它——我选择STM32的原因。 我对未来的规划是以功能性为主的,在功能和面积之间做以平衡是我的首要选择,而把运算放在第二位,这根我的专业有关系。里面的运算其实并不复杂,在入门阶段想尽量减少所接触的东西。 不过说实话,对DSP的外设并和开发环境不满意,这是为什么STM32一出就转向的原因。下面是我自己做过的两块DSP28的全功能最小系统板,在做这两块板子的过程中发现要想尽力缩小DSP的面积实在不容易(目前只能达到50mm×45mm,这还是没有其他器件的情况下),尤其是双电源的供电方式和的电源让人很头疼。 后来因为一个项目,接触了LPC2148并做了一块板子,发现小型的ARM7在外设够用的情况下其实很不错,于是开始搜集相关芯片资料,也同时对小面积的AVR和51都进行了大致的比较,这个时候发现了CortexM3的STM32,比2148拥有更丰富和灵活的外设,性能几乎是2148两倍(按照MIPS值计算)。正好2148我还没上手,就直接转了这款STM32F103。 与2811相比较(核心供电情况下),135MHz×1MIPS。现在用STM32F103,72MHz×,性能是DSP的66%,STM32F103R型(64管脚)芯片面积只有2811的51%,STM32F103C型(48管脚)面积是2811的25%,最大功耗是DSP的20%,单片价格是DSP的30%。且有更多的串口,CAP和PWM,这是有用的。高端型号有SDIO,理论上比SPI速度快。 由以上比较,准备将未来的拥有操作系统的高端应用交给DSP的新型浮点型单片机28335,而将所有紧凑型小型、微型应用交给STM32。 STM32学前班教程:怎么开发 sw笨笨的STM32学前班教程之二:怎么开发目前手头的入门阶段使用的开发器概述 该产品为简易STM32调试器和DEMO板一体化的调试学习设备,价格在一百多块。 2、硬件配置

stm32pwm输入捕捉模式学习笔记

stm32 pwm输入捕捉模式学习笔记 (本文来自:android_chunhui的博客) PWM输入是输入捕获的一个特殊应用,输入捕获就是当连接到定时器的引脚上产生电平变化时对应的捕获装置会立即将当前计数值复制到另一个寄存器中。你可以开启捕获中断然后在中断处理函数中读出保存的计数值。主要用于读取pwm的频率和占空比。 与输入捕获不同的是PWM输入模式时,用到两个通道(一般用TIMx_CH1或TIMx_CH2),只给其中一个通道分配gpio时钟即可,另一个在内部使用。给一个通道分配gpio时钟后,需要设置另一个为从机且复位模式。(例如使用ch2,ch1就得设置成从机模式)。当一个输入信号(TI1或TI2)来临时,主通道捕获上升沿,从机捕获下降沿。 假设pwm从低电平开始触发,当上升沿来临时,两个通道TIM_CNT均复位开始计数,下一个下降沿来临,从机读取TIM_CNT中的值,记为CCR1,下一个上升沿来临,主通道读取TIM_CNT的值,记为CCR2。所以CCR2/f,为pwm周期,倒数即频率。CCR1/CCR2就是占空比。 下面是pwm捕获模式下的配置: void Tim2_PWMIC_Init(void) { TIM_ICInitTypeDef TIM_ICInitStructure; TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; //***通道选择,通道一为从机TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿触发 TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //管脚与寄存器对应关系TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //输入预分频。意思是控制在多少个输入周期做一次捕获,如果 //输入的信号频率没有变,测得的周期也不会变。比如选择4分频,则每四个输入周期才做一次捕获,这样在输入信号变化不频繁的情况下, //可以减少软件被不断中断的次数。 TIM_ICInitStructure.TIM_ICFilter = 0x0; //滤波设置,经历几个周期跳变认定波形稳定0x0~0xF TIM_PWMIConfig(TIM2, &TIM_ICInitStructure); //根据参数配置TIM外设信息TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2); //选择IC2为始终触发源 TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);//TIM从模式:触发信号的上升沿重新初始化计数器和触发寄存器的更新事件 TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable); //启动定时器的被动触发 TIM_Cmd(TIM2,ENABLE); //启动TIM2 TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE); //打开中断 } //中断服务函数

STM32F103RCT6使用说明

STM32开发板使用手册 风帆 STM32开发板是风帆电子为初学者学习STM32 Cortex M3 系列ARM 而设计的学习板。以STM32F103RCT6芯片为核心,配套2.4/2.8寸彩色TFT屏模块,板载UART、USB、ADC电压调节、按键、JTAG接口、彩屏接口、流水灯、SD卡接口、IO引出口等多种硬件资源。

JTAG 口 2个LED 灯 GPIOA 引出1O USB 串口1 DS10B20预留 HS0038红外接收头 红外温度传感器连接头 GPIOB@C 引出IO OLED@LCD 共用接口 STM32F103RCT6 2.4/2.8寸LCD 接口 485芯片 RS485接口 1:A; 3:B NRF24L01 模块接口 W25Q1 6 FLASH 芯片 SD 卡接口(在背面) JF24C 模块预留接口 GPIO C@D 引出IO 蜂鸣器跳线 PS/2鼠标键盘接口 三个按 键: WAKEUP KEY0 KEY1 RESET 按键 Rs232接口 电源开关 USB 接口 电源指示灯 自恢复保险丝 MAX232 电源芯片 24c02 3.3V 、5V 电 源输出; 线序为: GND/3.3V GND/5V BOOT 设置 线序为: GND /GND BOOT1/BOOT0 3.3V/3.3V

此板子不管硬件还是软件完全无缝接兼容正点原子的MINSTM32,并对MINSTM32进行了完美的升级,让我们用最少的钱做更多的事,具体升级的部分包括: 1、C PU的升级 利用ST意法半导体的CPU兼容性强的优点,此板采用比 STM32F103RBT6性能更强、且完全兼容的的STM32F103RCT6升级 CPU,把完美的MINNI STM板子的功能发挥到极致,具体2个CPU 的主要资源对比如下: 可以看出,FLASH增加了一倍,达到256K,RAM也增加了1倍,让 我们不用再为FLASH\RAM小而烦恼,使我们的存储空间更为强大; 增加了一个16位普通IC/OC/PWM),2个16位基本(IC/OC/PWM),1个STI,2个USART,这里比STM32F103RB还多了一个DAC通 道,这个STM32F103RB是没有的

STM32学习笔记之二_中断

STM32中中断的理解 一、什么是中断 中断是指在计算机执行程序的过程中,当出现异常情况或者特殊请求时,计算机停止现行的程序的运行,转而对这些异常处理或者特殊请求的处理,处理结束后再返回到现行程序的中断处,继续执行原程序。 中断处理过程: (1)保护被中断进程现场。为了在中断处理结束后能够使进程准确地返回到中断点,系统必须保存当前处理机程序状态字PSW和程序计数器PC等的值。 (2)分析中断原因,转去执行相应的中断处理程序。在多个中断请求同时发生时,处理优先级最高的中断源发出的中断请求。 (3)恢复被中断进程的现场,CPU继续执行原来被中断的进程。 二、什么是中断服务程序 处理中断事件的程序被称为中断服务程序。 三、什么是中断向量 中断向量就是中断服务程序的入口地址。 四、什么是中断向量号 中断号也叫中断类型号,或者中断请求号。 中断是指在CPU运行期间,被CPU内部或外部事件所打断、暂停当前程序的执行而转去执行一段特定的处理内部或外部时间程序的过程。外部设备进行I/O操作时,会随机产生中断请求信号。这个信号中会有特定的标志,使计算机能够判断是哪个设备提出中断请求,这个信号就叫做中断号。 五、什么是中断向量地址 中断向量地址就是内存中存放中断服务程序入口地址的地址。 六、什么是中断向量表 CPU是根据中断向量号获取中断向量值,即对应中断服务程序的入口地址值。因此为了让CPU由中断向量号查找到对应的中断向量,就需要在内存中建立一张查询表,即中断向量表。 七、STM32中中断发生时系统找到对应中断服务执行的过程 (1)根据中断设发生备确定对应的中断向量号。

(3)执行中断服务程序。 以ALIENTEK Mini STM32开发板范例代码中的定时器中断实验为例来说明。 (1)根据中断设发生备确定对应的中断向量号。 在main.c中: TIM3_Int_Init(4999,7199); 在timer.c中: void TIM3_Int_Init(u16 arr,u16 psc) { . . . NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断号 . . . } 在stm32f10x.h中: typedef enum IRQn { . . . TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ . . . } 根据以上三个文件可以确定,定时器TIM3对应的中断向量号为TIM3_IRQn,而TIM3_IRQn = 29,所以,定时器TIM3对应的中断向量号为29。

STM32教程(1)

第一部分开发板介绍 1.1 STM32开发板简介 开发板配置: ●CPU主芯片是STM32F103VCT6,主频72MHz,256KB FLASH ,48KB RAM; ●3个按键,可实现中断或查询方式判断是否有键按下; ●4个发光二极管LED,可进行流水灯或花样显示; ●1个无源蜂鸣器,可用PWM驱动; ●1个电位器,可配合内部AD进行AD转换; ●1个RS232串行通信接口,可使开发板与PC机进行通信; ●1个基于SPI串行总线的触摸屏转换接口芯片,可进行触屏操作; ●1个基于IIC串行总线的EEPROM,可进行数据存储; ●1个基于CPU片内SDIO的TF卡接口,可进行数据读写; ●1个FSMC控制的2.83英寸TFT液晶屏,可进行图片文字显示; ●1个蓝牙模块,可使开发板与PC机进行通信; ●1个USBmin2.0接口为开发板供电; ●所有I/O口引出,可通过跳线自行配置和自制外围模块连接;

下面介绍一下STN32开发板的各个部分。 1、LED灯 STM32开发板有4个LED灯,它们在开发板上的标号分别为LED1、LED2、LED3、LED4。在调试代码的时候,使用LED来指示程序状态,是非常不错的辅助调试方法。 2、按键 STM32开发板有三个普通按键,它们在开发板上的标号分别为KEY1、KEY2、KEY3。可以用于人机交互的输入,三个按键通过跳线帽连接到STM32的开发板的IO口上。 3、电源指示灯 开发板上有一个蓝色电源指示灯,它在开发板上的标号为LED5(POWER)。用于指示电源状态。该开发板通过USB供电,在该电源开启的情况下,指示灯亮,否则不亮。通过这个LED灯判断开发板的上电情况。 4、蓝牙 开发板上有一个蓝牙模块,它在开发板上的标号为Bluetooth。用于开发板与电脑进行无线通讯。 5、SD卡接口 SD卡接口在开发板上的标号为TF_Card。SD卡是最常见的存储设备,是很多数码设备的存储媒介,比如数码相框、数码相机、MP5等。STM32开发板自带了SD卡接口,可用于SD卡试验,方便大家学习SD卡。 6、AT24C01 EEPROM EEPROM型号为A T24C01,用于掉电数据保存。因为STM32内部没有EEPROM,所以开发板外扩了24C01,用于存储重要的数据,也可以用来做IIC实验,及其他应用。 7、RS232接口 RS232在开发板上的标号为J2。用于与电脑进行通信,也可以用来做USART实验。 8、滑动变阻器 滑动变阻器在开发板上的标号为ADJ_RES。通过调节滑动变阻器来改变电压值,可以用来做AD转换的实验。 9、蜂鸣器 蜂鸣器在开发板上的标号为Buzzer。通过调节定时器产生的PWM波的占空比来改变蜂鸣器的声音,可以用来做PWM实验,及其他应用。 10、液晶屏 触摸屏在开发板上的标号为TFT。用来显示一些图片和汉字。可以用来学习触摸屏的一些实验。触摸屏都需要一个AD转换器,STM32开发板触摸屏控制芯片为TSC2046。 11、引出IO口 开发板有很多引出IO口,可以通过跳线帽选择是连接各部分的功能模块还是用作引出IO 口,引出的IO口方便大家使用,可以连接外部器件。 1.2 STM32开发板硬件详解 本节介绍STM32开发板的各部分硬件,让大家对开发板的各部分硬件原理有个了解。

详细的STM32单片机学习笔记

详细的STM32单片机学习笔记 STM32单片机学习笔记 1、AHB系统总线分为APB1(36MHz)和APB2(72MHz),其中21,意思是APB2接高速设备 2、Stm32f10x.h相当于reg52.h(里面有基本的位操作定义),另一个为stm32f10x_conf.h 专门控制外围器件的配置,也就是开关头文件的作用 3、HSE Osc(High Speed External Oscillator)高速外部晶振,一般为8MHz,HSI RC(High Speed InternalRC)高速内部RC,8MHz 4、LSE Osc(Low Speed External Oscillator)低速外部晶振,一般为32.768KHz,LSI RC (Low Speed InternalRC)低速内部晶振,大概为40KHz左右,提供看门狗时钟和自动唤醒单元时钟源 5、SYSCLK时钟源有三个来源:HSI RC、HSE OSC、PLL 6、MCO[2:0]可以提供4源不同的时钟同步信号,PA8 7、GPIO口貌似有两个反向串联的二极管用作钳位二极管。 8、总线矩阵采用轮换算法对系统总线和DMA进行仲裁 9、ICode总线,DCode总线、系统总线、DMA总线、总线矩阵、AHB/APB桥 10、在使用一个外设之前,必须设置寄存器RCC_AHBENR来打开该外设的时钟 11、数据字节以小端存储形式保存在存储器中 12、内存映射区分为8个大块,每个块为512MB 13、FLASH的一页为1K(小容量和中容量),大容量是2K。 14、系统存储区(SystemMemory)为ST公司出厂配置锁死,用户无法编辑,用于对FLASH 区域进行重新编程。所以我们烧写程序务必选择BOOT1 = 0,这样通过内嵌的自举程序对

芯达STM32入门系列教程之三《如何使用J-Flash调试》

STM32入门系列教程如何使用J-Flash调试 Revision0.01 (2010-04-12)

对初学者来说,要进行STM32的程序下载调试,一般有三种方法: (1)使用SEGGER J-Flash(J-Link)下载程序到闪存中运行; (2)使用串口ISP来下载HEX文件到CPU中运行; (3)J-Link+MDK组合,来在线调试程序(可下载、调试)。 本文档讲述如何在芯达STM32开发板上使用SEGGER J-Flash下载HEX文件。而其他两种方法,我们将在文档《如何使用MDK+J-Link调试》、以及《如何使用STM32-ISP下载调试》中详细说明。 先来解释SEGGER。实际上,大家更为熟悉的ARM仿真器J-Link,就是由SEGGER公司开发的。J-Link是SEGGER为支持仿真ARM内核芯片推出的JTAG 仿真器。 不管什么CPU的仿真器,都需要安装其相应的驱动后才能使用。J-Link也不例外,它的驱动软件可以去官方网站:https://www.doczj.com/doc/063949788.html,下载最新版本。这里使用的驱动软件版本是V4.08l,该驱动的安装非常简单,请参考文档《如何安装J-Link驱动软件》。 安装完毕,会出现如下两个图标: 现在开始我们的工作吧! 步骤一先进行设备连接操作。芯达STM开发板的JTAG口(开发板面朝上,最顶端有一个JTAG20pin的插口),与J-Link V8仿真器的输出排线连接,J-Link另一头的USB插口则插在电脑的USB口上。这时,J-Link的指示灯开始闪烁,并保持“点亮”的状态。 注意:大家购买J-Link仿真器的时候,JTAG接口要求是标准的20pin的2.54间距的针座。否则需要转接卡进行JTAG接口的转换。 步骤二进入PC的桌面,点击上图左边的图标:J-Flash ARM V4.081,出现如下界面:

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倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器2、3、4使用。

(完整版)STM32F103通用教程

STM32F103_使用心得 IO端口输入输出模式设置:...........; Delay延时函数:..............; IO端口使用总结:...............; IO口时钟配置:................; 初始化IO口参数:...............; 注意:时钟使能之后操作IO口才有效!......; IO端口输出高低电平函数:...........; IO的输入 IO端口输入输出模式设置: (1) Delay延时函数: (2) IO端口使用总结: (2) IO口时钟配置: (2) 初始化IO口参数: (2) 注意:时钟使能之后操作IO口才有效! (2) IO端口输出高低电平函数: (2) IO的输入和输出宏定义方式: (3) 读取某个IO的电平函数: (3) IO口方向切换成双向 (3) IO 口外部中断的一般步骤: (3) 内部ADC使用总结: (4) LCDTFT函数使用大全 (5) TFTLCD使用注意点: (5)

IO端口宏定义和使用方法: (6) Keil使用心得: (6) ucGUI移植 (6) DDS AD9850测试程序: (6) ADC 使用小结: (7) ADC测试程序: (9) DAC—tlv5638测试程序 (9) 红外测试程序: (9) DMA使用心得: (9) 通用定时器使用: (9) BUG发现: (10) 编程总结: (10) 时钟总结: (10) 汉字显示(外部SD卡字库): (11) 字符、汉字显示(内部FLASH) (12) 图片显示: (16) 触摸屏: (17) 引脚连接: (19) IO端口输入输出模式设置: Delay延时函数: delay_ms(u16 nms); delay_us(u32 nus); IO端口使用总结: 1)使能IO 口时钟。调用函数为RCC_APB2PeriphClockCmd()。 2)初始化IO 参数。调用函数GPIO_Init();

相关主题
相关文档 最新文档