stm32学习笔记

stm32学习笔记
stm32学习笔记

目录

Stm32学习笔记—C语言基础部分 (2)

Stm32学习笔记—GPIO部分 (4)

Stm32学习笔记—RCC部分 (6)

Stm32学习笔记—AD部分 (7)

Stm32学习笔记—CAN部分 (8)

Stm32学习笔记—TIM部分 (8)

Stm32学习笔记—USART部分 (11)

Stm32学习笔记—超声波测距部分 (14)

Stm32学习笔记—程序调试部分 (20)

Stm32学习笔记—C语言基础部分

1、C语言运算符优先级详细列表

优先级运算符名称或含义使用形式结合方向说明

1 [] 数组下标数组名[常量表达式] 左到右

() 圆括号(表达式)/函数名(形

参表)

. 成员选择(对象)对象.成员名

-> 成员选择(指针)对象指针->成员名

2 - 负号运算符-表达式右到左单目运算符

(类型) 强制类型转换(数据类型)表达式

++ 自增运算符++变量名/变量名++ 单目运算符

-- 自减运算符--变量名/变量名-- 单目运算符

* 取值运算符*指针变量单目运算符

& 取地址运算符&变量名单目运算符

! 逻辑非运算符!表达式单目运算符

~ 按位取反运算符~表达式单目运算符

sizeof 长度运算符sizeof(表达式)

3 / 除表达式/表达式左到右双目运算符

* 乘表达式*表达式双目运算符

% 余数(取模)整型表达式/整型表达

双目运算符

4 + 加表达式+表达式左到右双目运算符

- 减表达式-表达式双目运算符

5 << 左移变量<<表达式左到右双目运算符

>> 右移变量>>表达式双目运算符6 > 大于表达式>表达式左到右双目运算符

>= 大于等于表达式>=表达式双目运算符

< 小于表达式<表达式双目运算符

<= 小于等于表达式<=表达式双目运算符7 == 等于表达式==表达式左到右双目运算符

!= 不等于表达式!= 表达式双目运算符

8 & 按位与表达式&表达式左到右双目运算符

9 ^ 按位异或表达式^表达式左到右双目运算符

10 | 按位或表达式|表达式左到右双目运算符

11 && 逻辑与表达式&&表达式左到右双目运算符

12 || 逻辑或表达式||表达式左到右双目运算符

13 ?: 条件运算符表达式1? 表达式2: 表

右到左三目运算符

达式3

14 = 赋值运算符变量=表达式右到左

/= 除后赋值变量/=表达式

*= 乘后赋值变量*=表达式

%= 取模后赋值变量%=表达式

+= 加后赋值变量+=表达式

-= 减后赋值变量-=表达式

<<= 左移后赋值变量<<=表达式

>>= 右移后赋值变量>>=表达式

&= 按位与后赋值变量&=表达式

^= 按位异或后赋值变量^=表达式

|= 按位或后赋值变量|=表达式

15 , 逗号运算符表达式,表达式,…左到右从左向右顺

序运算

2、数组:在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。

3、在C语言中,字符常量有以下特点:

1) 字符常量只能用单引号括起来,不能用双引号或者是括号

2) 字符常量只能是单个字符,不能是字符串。

3) 字符可以是字符集中任意字符。但数字被定义为字符之后就不能够参与运算。如'5'和5 是不同的。'5'是字符常量,不能参与运算。

Stm32学习笔记—GPIO部分

1、函数名GPIO_ReadInputDataBit 功能描述读取指定端口管脚的输入

2、对于GPIO的配置种类有8种之多:

(1)GPIO_Mode_AIN 模拟输入

(2)GPIO_Mode_IN_FLOATING 浮空输入

(3)GPIO_Mode_IPD 下拉输入

(4)GPIO_Mode_IPU 上拉输入

(5)GPIO_Mode_Out_OD 开漏输出

(6)GPIO_Mode_Out_PP 推挽输出

(7)GPIO_Mode_AF_OD 复用开漏输出

(8)GPIO_Mode_AF_PP 复用推挽输出

3、推挽输出:可以输出高,低电平,连接数字器件; 推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源低定。推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。

4、如图所示,推挽放大器的输出级有两个“臂”(两组放大元件),一个“臂”的电流增加时,另一个“臂”的电流则减小,二者的状态轮流转换。对负载而言,好像是一个“臂”在推,一个“臂”在拉,共同完成电流输出任务。当输出高电平时,也就是下级负载门输入高电平时,输出端的电流将是下级门从本级电源经VT3拉出。这样一来,输出高低电平时,VT3 一路和VT5 一路将交替工作,从而减低了功耗,提高了每个管的承受能力。又由于不论走哪一路,管子导通电阻都很小,使RC常数很小,转变速度很快。因此,推拉式输出级既提高电路的负载能力,又提高开关速度。

5、开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内).

开漏形式的电路有以下几个特点:

利用外部电路的驱动能力,减少IC内部的驱动。当IC内部MOSFET导通时,驱动电流是

从外部的VCC流经R pull-up ,MOSFET到GND。IC内部仅需很下的栅极驱动电流。一般来说,开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以改变传输电平。比如加上上拉电阻就可以提供TTL/CMOS电平输出等。(上拉电阻的阻值决定了逻辑电平转换的沿的速度。阻值越大,速度越低功耗越小,所以负载电阻的选择要兼顾功耗和速度。)

6、3. OPEN-DRAIN提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时。因为上升沿是通过外接上拉无源电阻对负载充电,所以当电阻选择小时延时就小,但功耗大;反之延时大功耗小。所以如果对延时有要求,则建议用下降沿输出。

7、4. 可以将多个开漏输出的Pin,连接到一条线上。通过一只上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系。这也是I2C,SMBus等总线判断总线占用状态的原理。补充:什么是“线与”?:

8、在一个结点(线)上, 连接一个上拉电阻到电源VCC 或VDD 和n 个NPN 或NMOS 晶体管的集电极C 或漏极D, 这些晶体管的发射极E 或源极S 都接到地线上, 只要有

一个晶体管饱和, 这个结点(线)就被拉到地线电平上. 因为这些晶体管的基极注入电流(NPN)或栅极加上高电平(NMOS),晶体管就会饱和, 所以这些基极或栅极对这个结点(线)的关系是或非NOR 逻辑. 如果这个结点后面加一个反相器, 就是或OR 逻辑.

9、

10、其实可以简单的理解为:在所有引脚连在一起时,外接一上拉电阻,如果有一个引脚输出为逻辑0,相当于接地,与之并联的回路“相当于被一根导线短路”,所以外电路逻辑电平便为0,只有都为高电平时,与的结果才为逻辑1。

11、关于推挽输出和开漏输出,最后用一幅最简单的图形来概括:

12、该图中左边的便是推挽输出模式,其中比较器输出高电平时下面的PNP三极管截止,而上面NPN三极管导通,输出电平VS+;当比较器输出低电平时则恰恰相反,PNP三极管导通,输出和地相连,为低电平。右边的则可以理解为开漏输出形式,需要接上拉。

13、

14、浮空输入:对于浮空输入,一直没找到很权威的解释,只好从以下图中去理解了

15、由于浮空输入一般多用于外部按键输入,结合图上的输入部分电路,我理解为浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。

16、上拉输入/下拉输入/模拟输入:这几个概念很好理解,从字面便能轻易读懂。

17、复用开漏输出、复用推挽输出:可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)

18、最后总结下使用情况:

19、在STM32中选用IO模式

(1)浮空输入_IN_FLOATING ——浮空输入,可以做KEY识别,RX1

(2)带上拉输入_IPU——IO内部上拉电阻输入

(3)带下拉输入_IPD——IO内部下拉电阻输入

(4)模拟输入_AIN ——应用ADC模拟输入,或者低功耗下省电

(5)开漏输出_OUT_OD ——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现C51的IO双向功能

(6)推挽输出_OUT_PP ——IO输出0-接GND,IO输出1 -接VCC,读输入值是未知的

(7)复用功能的推挽输出_AF_PP ——片内外设功能(I2C的SCL,SDA)

(8)复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)

20、STM32设置实例:

(1)模拟I2C使用开漏输出_OUT_OD,接上拉电阻,能够正确输出0和1;读值时先GPIO_SetBits(GPIOB, GPIO_Pin_0);拉高,然后可以读IO的值;使用

GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0);

(2)如果是无上拉电阻,IO默认是高电平;需要读取IO的值,可以使用带上拉输入_IPU 和浮空输入_IN_FLOATING和开漏输出_OUT_OD;

Stm32学习笔记—RCC部分

1、RCC有多种用途,包括时钟设置,外设复位和时钟管理。

2、RTC时钟:系统时钟:简单的说,就是芯片系统内部的时钟,程序运行的速度是由它来决定的。RTC:实时时钟,如果供电,它会按照自己的精确等级运行的,主要用来做日期时间的显示用。

3、时钟树

4、配置时钟树的方法:

(1)定义一个定义一个定义一个ErrorStatu 类型的变量HSEStartUpStatus

(2)将时钟树复位至默认设置

(3)开启HSE 晶振;

(4)等待HSE 晶振起振稳定,并将起结果保存HSEStartUpStatus 变量中;

(5)判断HSE 晶振是否起成功

(6)设置HCLKHCLK 时钟为时钟为SYSCL的分频

(7)设置PLCK2 时钟为时钟为SYSCLK的分频;

(8)设置PLCK1 时钟为时钟为SYSCLK的分频;

Stm32学习笔记—AD部分

1、采样保持器:计算机系统模拟量输入通道中的一种模拟量存储装置。它是连接采样器和模数转换器的中间环节。采样器是一种开关电路或装置,它在固定时间点上取出被处理信号的值。采样保持器则把这个信号值放大后存储起来,保持一段时间,以供模数转换器转换,直到下一个采样时间再取出一个模拟信号值来代替原来的值。在模数转换器工作期间采样保持器一直保持着转换开始时的输入值,因而能抑制由放大器干扰带来的转换噪声,降低模数转换器的孔径时间,提高模数转换器的精确度和消除转换时间的不准确性。一般生产过程控制计算机的模拟量输入可能是每秒几十点、几百点,对于大型系统甚至上千点,往往需要高速采样(如5000~10000点/秒)。为使这些模拟量信号逐个地送到模数转换器,而不至降低被测信号的真实性,必须采用采样保持器。在低速系统中一般可以省略这种装置。

原理采样保持电路由模拟开关、存储元件和缓冲放大器A组成。在采样时刻,加到模拟开关上的数字信号为低电平,此时模拟开关被接通,使存储元件(通常是电容器)两端的电压UB随被采样信号UA变化。当采样间隔终止时,D变为高电平,模拟开关断开,UB则保持在断开瞬间的值不变。缓冲放大器的作用是放大采样信号,它在电路中的连接方式有两种基本类型:一种是将信号先放大再存储,另一是先存储再放大。对理想的采样保持电路,要求开关没有偏移并能随控制信号快速动作,断开的阻抗要无限大,同时还要求存储元件的电压能无延迟地跟踪模拟信号的电压,并可在任意长的时间内保持数值不变。

2、采样频率英文名称:sampling frequency 定义:在模数转换器中采样时间间隔的倒数。

3、Ad转换器的分类

4、Ad转换器的技术指标:转换时间和转换速率分辨率量化误差转换精度

5、Ad位数的选择

6、Ad转换速率的确定

7、工作电压和基准电压

8、Ad的工作模式:

(1)独立模式:分为单通道单次转换模式、多通道(扫描)单次转换模式、单通道连续转换模式、多通道连续转换模式、注入转换模式

单次转换模式下,ADC只执行一次转换。

在连续转换模式中,当前面ADC转换一结束马上就启动另一次转换。

扫描模式,此模式用来扫描一组模拟通道。

注入转换模式:当触发方式为软件出发或者外部出发方式时,可以使用此模式。

(2)双adc模式:分为同时为规则模式、快速交替模式、慢速交替模式、交替触发模式、混合同步注入及+交替模式

9、规则通道和注入通道的区别:

STM32的每个ADC模块通过内部的模拟多路开关,可以切换到不同的输入通道并进行转换。STM32特别地加入了多种成组转换的模式,可以由程序设置好之后,对多个模拟通道自动地进行逐个地采样转换。

有2种划分转换组的方式:规则通道组和注入通道组。通常规则通道组中可以安排最多16个通道,而注入通道组可以安排最多4个通道。

在执行规则通道组扫描转换时,如有例外处理则可启用注入通道组的转换。一个不太恰当的比喻是:规则通道组的转换好比是程序的正常执行,而注入通道组的转换则好比是程序正常执行之外的一个中断处理程序。

从系统设计上,测量并显示室内温度的过程中断了测量并显示室外温度的过程,但程序

设计上可以在初始化阶段分别设置好不同的转换组,系统运行中不必再变更循环转换的配置,从而达到两个任务互不干扰和快速切换的结果。可以设想一下,如果没有规则组和注入组的划分,当你按下按钮后,需要从新配置AD循环扫描的通道,然后在施放按钮后需再次配置AD循环扫描的通道。

10、SRAM

SRAM是英文Static RAM的缩写,即静态随机存储器。它是一种具有静止存取功能的内存,不需要刷新电路即能保存它内部存储的数据。

11、DMA原理:DMA(Direct Memory Access,直接内存存取) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依于CPU 的大量中断负载。否则,CPU 需要从来源把每一片段的资料复制到暂存器,然后把它们再次写回到新的地方。在这个时间中,CPU 对于其他的工作来说就无法使用。

Stm32学习笔记—CAN部分

1、bxCAN主要特点

支持CAN协议2.0A和2.0B主动模式

波特率最高可达1兆位/秒

支持时间触发通信功能

发送

3个发送邮箱,发送报文的优先级特性可软件配置,发送SOF时刻的时间戳

接收

3级深度的2个接收FIFO,14个位宽可变的过滤器组

标识符列表

FIFO溢出处理方式可配置,记录接收SOF时刻的时间戳,时间触发通信模式,禁止自动重传模式,16位自由运行定时器,可在最后2个数据字节发送时间戳

管理

中断可屏蔽,邮箱占用单独1块地址空间,便于提高软件效率

2、

Stm32学习笔记—TIM部分

1、通用定时器(TIM)

通用定时器是一个通过可编程预分频器驱动的16 位自动装载计数器构成。它适用于多种场合,包括测量输入信号的脉冲长度(输入采集)或者产生输出波形(输出比较和PWM)。使用定时器预分频器和RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。定时器是完全独立的,而且没有互相共享任何资源。

2、SCB是MDK库文件里面定义的一个结构体,subsystem control block子系统管理模块

3、TIMER主要是由三部分组成:时基单元、输入捕获、输出比较,还有两种模式控制功能:从模式控制和主模式控制。

4、定时器的计数模式:

向上计数模式,

向下计数模式,在向下模式中,计数器从自动装入的值(TIMx_ARR计数器的值)开始向下计数到0,然后从自动装入的值重新开始并且产生一个计数器向下溢出事件。

每次计数器溢出时可以产生更新事件,在TIMx_EGR寄存器中设置UG位(通过软件方式或者使用从模式控制器)也同样可以产生一个更新事件。

设置TIMx_CR1寄存器的UDIS位可以禁止UEV事件。这样可以避免向预装载寄存器中写入新值时更新影子寄存器。因此UDIS位被清为0之前不会产生更新事件。然而,计数器仍会从当前自动加载值重新开始计数,同时预分频器的计数器重新从0开始(但预分频器的速率不能被修改)。

此外,如果设置了TIMx_CR1寄存器中的URS位(选择更新请求) ,设置UG位将产生一个更新事件UEV但不设置UIF标志(因此不产生中断和DMA请求),这是为了避免在发生捕获事件并清除计数器时,同时产生更新和捕获中断。

当发生更新事件时,所有的寄存器都被更新,并且(根据URS位的设置)更新标志位(TIMx_SR寄存器中的UIF位)也被设置。

中央对齐模式,

5、时基单元包含:

计数器寄存器(TIMx_CNT)

预分频器寄存器(TIMx_PSC),预分频器可以将计数器的时钟频率按1到65536之间的任意值分频。

自动装载寄存器(TIMx_ARR),自动装载寄存器是预先装载的,写或读自动重装载寄存器将访问预装载寄存器。根据在TIMX_CR1寄存器中的自动装载预装载使能位(ARPE)的设置,预装载寄存器的内容被立即或在每次的更新事件UEV时传送到影子寄存器。

6.可设置时长的定时器的方法

设置计数器的时钟频率。

设置计数器的计数初值。

打开计数器开始计数。开启中断。

执行中断服务程序

7、通用定时器的时钟来源:

内部时钟(CK_INT)

外部时钟模式1:外部输入脚(TIx)

外部时钟模式2:外部触发输入(ETR)

内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。

8、计数器时钟频率的计算方法

9、从库函数角度设置定时时间

(1)Timx时钟使能:通用定时器挂在APB1下,通过APB1总线的使能函数来使能,函数为RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,enable)

(2)初始化定时器参数:设置自动重装值、分频系数和计数方式等,函数原形为:TIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct) 功能描述:根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位,输入参数1,TIMx:x可以是2,3或者4,来选择TIM外设;输入参数2TIM-TimeBase_InitStruct:指

向结构TIM_TimeBaseInitTypeDef的指针,包含了TIMx时间基数单位的配置信息。TIM_TimeBaseInitTypeDef定义于文件“stm32f10x_tim.h”:

typedef struct

{

u16 TIM_Period;

u16 TIM_Prescaler;

u8 TIM_ClockDivision;

u16 TIM_CounterMode;

} TIM_TimeBaseInitTypeDef;

TIM_Period设置了在下一个更新事件装入活动的自动重装载寄存器周期的值。它的取值必须在0x0000和0xFFFF之间。

TIM_Prescaler

TIM_Prescaler设置了用来作为TIMx时钟频率除数的预分频值。它的取值必须在0x0000和0xFFFF之间。

TIM_ClockDivision

TIM_ClockDivision设置了时钟分割

(3)设置timx-dier允许更新中断:函数原形void TIM_ITConfig(TIM_TypeDef* TIMx, u16 TIM_IT, FunctionalState NewState)功能描述,使能或者失能指定的TIM中断,输入参数1TIMx:x可以是2,3或者4,来选择TIM外设;输入参数2,TIM_IT:待使能或者失能的TIM 中断源,输入参数3NewState:TIMx中断的新状态,这个参数可以取:ENABLE或者DISABLE 输入参数TIM_IT使能或者失能TIM的中断。可以取下表的一个或者多个取值的组合作为该参数的值。TIM_IT_Update TIM中断源,TIM_IT_CC1 TIM捕获/比较1中断源,TIM_IT_CC2 TIM捕获/比较2中断源,TIM_IT_CC3,TIM捕获/比较3中断源TIM_IT_CC4 TIM捕获/比较4中断源,TIM_IT_Trigger TIM触发中断源

(4)设置中断优先级,在nvic的寄存器中设置

(5)使能timx

(6)编写中断服务函数

10、TIM_ClearFlag 函数原形void TIM_ClearFlag(TIM_TypeDef* TIMx, u32 TIM_FLAG)

功能描述,清除TIMx的待处理标志位,输入参数1,TIMx:x可以是2,3或者4,来选择TIM 外设,输入参数2,TIM_FLAG:待清除的TIM标志位

TIM_FLAG值:

TIM_FLAG_Update TIM更新标志位

TIM_FLAG_CC1 TIM捕获/比较1标志位

TIM_FLAG_CC2 TIM捕获/比较2标志位

TIM_FLAG_CC3 TIM捕获/比较3标志位

TIM_FLAG_CC4 TIM捕获/比较4标志位

TIM_FLAG_Trigger TIM触发标志位

TIM_FLAG_CC1OF TIM捕获/比较1溢出标志位

TIM_FLAG_CC2OF TIM捕获/比较2溢出标志位

TIM_FLAG_CC3OF TIM捕获/比较3溢出标志位

TIM_FLAG_CC4OF TIM捕获/比较4溢出标志位

11、函数名:TIM_GetCounter

函数原形:u16 TIM_GetCounter(TIM_TypeDef* TIMx)

功能描述:获得TIMx计数器的值

输入参数:TIMx:x可以是2,3或者4,来选择TIM外设

12、函数名TIM_ GetITStatus

函数原形TIM_GetITStatus(TIM_TypeDef* TIMx, u16 TIM_IT)

功能描述检查指定的TIM中断发生与否

输入参数1TIMx:x可以是2,3或者4,来选择TIM外设

输入参数2TIM_IT:待检查的TIM中断源

13、函数名TIM_ITConfig

函数原形void TIM_ITConfig(TIM_TypeDef* TIMx, u16 TIM_IT, FunctionalState NewState) 功能描述使能或者失能指定的TIM中断

输入参数1TIMx:x可以是2,3或者4,来选择TIM外设

输入参数2TIM_IT:待使能或者失能的TIM中断源

输入参数3NewState:TIMx中断的新状态

这个参数可以取:ENABLE或者DISABLE

TIM_IT

TIM_IT_UpdateTIM中断源

TIM_IT_CC1TIM捕获/比较1中断源

TIM_IT_CC2TIM捕获/比较2中断源

TIM_IT_CC3TIM捕获/比较3中断源

TIM_IT_CC4TIM捕获/比较4中断源

TIM_IT_TriggerTIM触发中断源

14、函数名TIM_ ClearITPendingBit

函数原形void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, u16 TIM_IT)

功能描述清除TIMx的中断待处理位

输入参数1TIMx:x可以是2,3或者4,来选择TIM外设

输入参数2TIM_IT:待检查的TIM中断待处理位

15、STM32中有多达8个定时器,其中TIM1和TIM8是能够产生三对PWM互补输出的高级定时器,常用于三相电机的驱动,它们的时钟由APB2的输出产生。其它6个为普通定时器,时钟由APB1的输出产生。

Stm32学习笔记—USART部分

1、简单的define定义

#define MAXTIME 1000

一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写

if(i

编译器在处理这个代码之前会对MAXTIME进行处理替换为1000。

这样的定义看起来类似于普通的常量定义CONST,但也有着不同,因为define的定义更像是简单的文本替换,而不是作为一个量来使用,这个问题在下面反映的尤为突出。

2、常见的头文件

#include //定义输入/输出函数

#include //定义杂项函数及内存分配函数

#include //字符串处理

#include //定义关于时间的函数

#include //定义输入/输出函数

#include //字符处理

#include //中断优先级分组

#include数学函数库包含一些数学计算的公式

3、UART:universal asynchronous receiver and transmitter通用异步收发器

USART:universal synchronous asynchronous receiver and transmitter通用同步异步收发器

都是指单片机的串口通讯,工作方式不一样而已!

4、USART主要特性

●全双工的,异步通信

●NRZ标准格式

●分数波特率发生器系统─发送和接收共用的可编程波特率,最高达4.5Mbits/s

●可编程数据字长度(8位或9位)

●可配置的停止位-支持1或2个停止位

●可配置的使用DMA的多缓冲器通信

─在SRAM里利用集中式DMA缓冲接收/发送字节

●单独的发送器和接收器使能位

●检测标志─接收缓冲器满─发送缓冲器空─传输结束标志

●校验控制─发送校验位─对接收数据进行校验

5、异步串行通信协议需要定义以下5个内容:

起始位、数据位、奇偶校捡位、停止位、波特率设置

6、应用场合:芯片之间近距离,与PC机之间的通信和模块之间远距离通信

7、串口通信(Serial Communication),是指外设和计算机间,通过数据信号线、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。

8、PC的串口就是COM口,TxD和RxD和GND就是包括在COM口中。接口通过三个引脚与其他设备连接在一起(见图236)。任何USART双向通信至少需要两个脚:接收数据输入(RX)和发送数据输出(TX)。

9、函数USART_SendData,,函数原形void USART_SendData(USART_TypeDef* USARTx, u8 Data),功能描述通过外设USARTx发送单个数据,USARTx:x可以是1,2或者3,来选择USART外设,输入参数2,Data: 待发送的数据

10、函数USART_ReceiveData,函数原形u8 USART_ReceiveData(USART_TypeDef* USARTx),功能描述,返回USARTx最近接收到的数据输入参数,USARTx:x可以是1,2或者3,来选择USART外设

11、USART_GetFlagStatus,函数原形FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, u16 USART_FLAG) ,功能描述,检查指定的USART标志位设置与否,输入参数1 USARTx:x可以是1,2或者3,来选择USART外设,输入参数2 ,USART_FLAG:待检查的USART标志位

12、USART_FLAG值

USART_FLAG_CTS CTS标志位

USART_FLAG_LBD LIN中断检测标志位

USART_FLAG_TXE 发送数据寄存器空标志位

USART_FLAG_TC 发送完成标志位

USART_FLAG_RXNE 接收数据寄存器非空标志位

USART_FLAG_IDLE 空闲总线标志位

USART_FLAG_ORE 溢出错误标志位

USART_FLAG_NE 噪声错误标志位

USART_FLAG_FE 帧错误标志位

USART_FLAG_PE 奇偶错误标志位

13、USART_ ClearFlag函数原形void USART_ClearFlag(USART_TypeDef* USARTx, u16 USART_FLAG)功能描述,清除USARTx的待处理标志位,输入参数1,USARTx:x可以是1,2或者3,来选择USART外设,输入参数2,USART_FLAG:待清除的USART标志位。

14、USART_ITConfig,函数名函数原形void USART_ITConfig(USART_TypeDef* USARTx, u16 USART_IT, FunctionalState NewState)功能描述,使能或者失能指定的USART中断,输入参数1,USARTx:x可以是1,2或者3,来选择USART外设,输入参数2,USART_IT:待使能或者失能的USART中断源,输入参数3,NewState:USARTx中断的新状态,这个参数可以取:ENABLE或者DISABLE

USART_IT值

USART_IT_PE 奇偶错误中断

USART_IT_TXE 发送中断

USART_IT_TC 传输完成中断

USART_IT_RXNE 接收中断

USART_IT_IDLE 空闲总线中断

USART_IT_LBD LIN中断检测中断

USART_IT_CTS CTS中断

USART_IT_ERR 错误中断

15、USART1重映像

STM32上有很多I/O口,也有很多的内置外设想I2C,ADC,ISP,USART等,为了节省引出管脚,这些内置外设基本上是与I/O口共用管脚的,也就是I/O管脚的复用功能。但是STM32还有一特别之处就是:很多复用内置的外设的I/O引脚可以通过重映射功能,从不同的I/O管脚引出,即复用功能的引脚是可通过程序改变的.读到这里相信大家都应该了解了端口重映射的一些概念了

16、串口是需要使用IO口来进行发送和接收的。

17函数名USART_ SendData

函数原形void USART_SendData(USART_TypeDef* USARTx, u8 Data)

功能描述通过外设USARTx发送单个数据

输入参数1 USARTx:x可以是1,2或者3,来选择USART外设

输入参数2 Data: 待发送的数据

Stm32学习笔记—超声波测距部分

1、程序目的:使用STM32控制超声波模块并使用USART显示

#include "stm32f10x.h"

#include "math.h"

#include "stdio.h"

#include "time.h"

void Tim2_Init(void);

void GPIO_Configuration(void);

void RCC_Configuration(void);

void USART_Configuration(void);

u16 Sensor_using(void);

void delay(void);

main()

{

u16 result=0;

u8 i;

FlagStatus Status;

/*system clock init*/

RCC_Configuration();

/*I\O init*/

GPIO_Configuration();

/*TIM初始化*/

USART_Configuration();

Tim2_Init();

while(1)

{

u16 m;

result=Sensor_using();

i=((u8)((result&0xff00)>>8)); // 输出高八位//

while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

USART_SendData(USART1,i);

i=((u8)result&0x00ff); //输出低八位//

while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)== RESET);

USART_SendData(USART1,i);

for(m=800;m>0;m--)

{

delay();

}

}

}

void RCC_Configuration(void)

{

ErrorStatus HSEStartUpStatus;

RCC_DeInit(); //时钟控制寄存器全部恢复默认值

RCC_HSEConfig(RCC_HSE_ON); //外部高速时钟源开启(8M晶振)HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待外部时钟就绪

if(HSEStartUpStatus == SUCCESS) //如果时钟启动成功

{

RCC_HCLKConfig(RCC_SYSCLK_Div1); //定义AHB设备时钟为系统时钟1分频

RCC_PCLK2Config(RCC_HCLK_Div1); //定义APB2设备时钟为HCLK时钟1分频

RCC_PCLK1Config(RCC_HCLK_Div2); //定义APB1设备时钟为HCLK时钟2分频

RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //配置PLL时钟为外部高速时钟的9倍频,8MHz * 9 = 72 MHz

RCC_PLLCmd(ENABLE); //使能PLL时钟

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) //等待PLL时钟设置完成准备就绪

{

}

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //使用PLL时钟作为系统时钟源

while(RCC_GetSYSCLKSource() != 0x08) //返回系统所用时钟源确认为外部高速晶振,8M晶振。

{

}

}

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOE , ENABLE);

}

void GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOB, ENABLE);

/*Echo pin define*/

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOE, &GPIO_InitStructure);

/*Trigle pin define*/

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOE, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;

GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA,&GPIO_InitStructure);

}

void USART_Configuration(void) //串口配置程序

{

USART_InitTypeDef USART_InitStructure;

USART_https://www.360docs.net/doc/ed16379751.html,ART_BaudRate =115200; //设置串口波特率USART_https://www.360docs.net/doc/ed16379751.html,ART_WordLength = USART_WordLength_8b; //设置数据长度为8位

USART_https://www.360docs.net/doc/ed16379751.html,ART_StopBits = USART_StopBits_1; //设置一个停止位USART_https://www.360docs.net/doc/ed16379751.html,ART_Parity = USART_Parity_No ; //无校验位

USART_https://www.360docs.net/doc/ed16379751.html,ART_HardwareFlowControl =

USART_HardwareFlowControl_None; //禁止硬件流控制模式USART_https://www.360docs.net/doc/ed16379751.html,ART_Mode =USART_Mode_Rx|USART_Mode_Tx; //打开串口的发送功能

USART_Init(USART1, &USART_InitStructure); //用以上参数初始化USART1 USART_ITConfig(USART1, USART_IT_RXNE, DISABLE); //打开接收中断USART_Cmd(USART1, ENABLE); //打开串口1

}

void Tim2_Init(void)

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

TIM_DeInit(TIM2);//复位TIM2定时器

TIM_TimeBaseStructure.TIM_Period=0xffff;

TIM_TimeBaseStructure.TIM_Prescaler=0;

TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;

TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

TIM_PrescalerConfig(TIM2,359,TIM_PSCReloadMode_Immediate);//时钟频率为

72MHz/(359+1)=200000

TIM_ARRPreloadConfig(TIM2, DISABLE);

TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);

}

/*返回值为毫米级*/

u16 Sensor_using(void)

{

u16 TIM;

GPIO_SetBits(GPIOE,GPIO_Pin_10);

delay();

GPIO_ResetBits(GPIOE,GPIO_Pin_10);

TIM2->CNT=0; //计数器清0//

while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_9)==0); //等待ECHO脚高电平// TIM_Cmd(TIM2, ENABLE);

while((GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_9)==1));

TIM=TIM_GetCounter(TIM2);//ECHO脚低电平后读取计数器的值,从而算出往返时间TIM_Cmd(TIM2, DISABLE);

return(TIM);

}

void delay(void)

{

u32 i;

i=10000;

while(i--);

}

51超声波测距程序如

下:

//Trig = P2^0

//Echo = P3^2

#include

#define uchar unsigned char

#define uint unsigned int//

void delay(uint z)

{

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

//

void delay_20us()

{

uchar a ;

for(a=0;a<100;a++);

}

//*************************************************************** //显示数据转换程序

void display(uint temp)

{

uchar ge,shi,bai;

bai=temp/100;

shi=(temp%100)/10;

ge=temp%10;

wela=1;

P0=0xf7;

wela=0;

dula=1;

P0=table[bai];

dula=0;

delay(1);

dula=1;

P0=0x00; //关位码

dula=0;

wela=1;

P0=0xef;

wela=0;

dula=1;

P0=table[shi];

dula=0;

delay(1);

dula=1;

P0=0x00; //关位码

dula=0;

dula=1;

P0=table[ge];

dula=0;

wela=1;

P0=0xdf;

delay(1);

dula=1;

P0=0x00; //关位码

dula=0;

}

//*************************************************************** void main()

{

uint distance;

test =0;

Trig=0; //首先拉低脉冲输入引脚

EA=1; //打开总中断0

TMOD=0x10; //定时器1,16位工作方式

while(1)

{

EA=0; //关总中断

Trig=1; //超声波输入端

delay_20us(); //延时20us

Trig=0; //产生一个20us的脉冲

while(Echo==0); //等待Echo回波引脚变高电平

succeed_flag=0; //清测量成功标志

EA=1;

EX0=1; //打开外部中断0

TH1=0; //定时器1清零

TL1=0; //定时器1清零

TF1=0; //计数溢出标志

TR1=1; //启动定时器1

delay(20); //等待测量的结果

TR1=0; //关闭定时器1

EX0=0; //关闭外部中断0

if(succeed_flag==1)

{

time=timeH*256+timeL;

distance=time*0.172; //厘米

display(distance);

}

if(succeed_flag==0)

{

distance=0; //没有回波则清零

test = !test; //测试灯变化

}

}

}

//*************************************************************** //外部中断0,用做判断回波电平

void exter() interrupt 0 // 外部中断0是0号

{

timeH =TH1; //取出定时器的值

timeL =TL1; //取出定时器的值

succeed_flag=1;//至成功测量的标志

EX0=0; //关闭外部中断

}

//**************************************************************** //定时器1中断,用做超声波测距计时

void timer1() interrupt 3 //

{

TH1=0;

TL1=0;

}

Stm32学习笔记—程序调试部分

1、关掉无关中断

2、Usart发送不了16位的数

3、注意GPIO几种输入和输出方式的区别

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入门教程

前言 一天入门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一步一步点亮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的调试环境和一些基本知识。想拿出来与大家共享,笨教程本着最大限度简化删减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、硬件配置

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教程(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入门系列教程之三《如何使用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.360docs.net/doc/ed16379751.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,出现如下界面:

(完整版)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();

STM32F103编程入门

STM32F103单片机编程入门 一款单片机入门,至少四样:时钟、端口、定时、串口、中断。 系统时钟 RCC 系统内部有8M_RC晶振和32678Hz_RC晶振有大约2%的温飘。当外部有8M 晶振时,自动选择外部晶振,失效时自动切换成内部。程序自动倍频成72M。 如果用于通信最好加个外部晶振。判断是否使用外部晶振的方法:短接外部晶 振引脚观察工作情况。 分为两个桥,对应不同的外设,每个外设又可以单独设定时钟。 初步学习,先不用单独设定,均选用系统时钟72M。可根据情况做一步分频。 用到某外设时,配置RCC(打开外设时钟),一般只有一句指令。一般临时查找。呵呵,我也没找到好办法。 GPIO:RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE); USART:RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); Timer2:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE); 端口GPIO 端口配置思路: 1,先定义一个结构体配置成员参数值, 类型是GPIO_InitTypeDef,下划线是结构体名;结构体名是GPIO_InitStructure:名称可以自定义。在后面利用参数初始化函数时要一致。 2,打开相对应的端口时钟RCC。 3,声明要配置的管脚,可以用“|”复选 4,配置模式,4种输入,4种输出 5,配置管脚频率,一般都是50Mhz 6,最后调用函数GPIO_Init(GPIOA, &GPIO_InitStructure);第2个参数是,结构体地址指针。 Eg: GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); 一、串口 USART 串口配置思路: 1,定义结构体,类型是USART_InitTypeDef; 2,打开串口时钟,可以选择和端口GPIO一起 3,设置波特率,—————省去了复杂的烦人的计算 4,设置字长。8位?9位? 5,设置停止位。1位?2位? 6,设置校验位,奇偶?无? 7,设置硬件流(调制解调器用)————用不到设None就行 8,串口工作模式:收?发?都有? 9,调用函数USART_Init(USART1, &USART_InitStructure); 配置串口 10,开启串口中断USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);或USART_IT_TXE, ENABLE);收发中断的使能。 11,中断响应函数void USART1_IRQHandler(void) 12,取出缓存数据data=USART_ReceiveData(USART1);读操作自动清零串口接 受标志位。 13,发送数据USART_SendData(USART2,FromScreen[Ua1])和 while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);等待发送 完成(寄存器非空)。 Eg: USART_InitTypeDef USART_InitStructure;

STM32快速入门教程

STM32快速入门教程 开发编译的软件:IAR EWARM 4.42A JTAG工具:ST-LINK2(开发板自带) 开发板:万利STM32EK(199元) 建议看的资料: 《STM32F10X-128K-EVAL MCU》ST公司STM32开发板的电路图 《STM32技术参考手册—RM0008.pdf 或STM32F103-CN.pdf 》 《Cortex-M3权威指南Cn.pdf》 《如何在IAR下使用STM库.pdf》 《STM32F10xxx_Library_Manual_ChineseV2.pdf》 《汉化STM32F的固件.rar》----网友: SUNKE9 《netjob的BLOG上的初学者笔记》 STM32 :把引脚BOOT1,BOOT0接地,3。3伏特供电,STM32就可以运行,无需外部接晶振。 芯片内部有复位电路。STM32上电后默认使用内部【精度8MHZ左右】晶振,如果外部接了8MHZ, 可以切换使用外部8MHZ,并最终PLL倍频到72MHZ. 软件开发上,我们可以从万利公司或ST公司给IAR公司写的STM32例子,首先一点,目前STM32软件开发都是使用ST公司STM32库,而我的BLOG 上例子不是使用STM32库。 我自己建立了STM32的头文件:stm32f103.h 原因是ST公司的STM32函数库太庞大复杂,效率低。而且会让开发人员不懂的如何操作STM32 的寄存器,不懂的CPU 是如何工作的。 一个STM32程序,有几个必要文件: 【 stm32f103.h 我自己定义的STM32头文件用来代替STM32函数库 cortexm3_macro.s 宏定义函数 stm32f10x_vector.c 中断初始化 stm32f10x_it.c 中断函数 main.c 主函数 】 //=================================================== // 完整例子:万利开发板上跑马灯程序 // 轮流点亮LED灯。 //===================================================

DL-STM32自学成才系列教程之十四《点亮LCD液晶屏》

STM32入门系列教程点亮LCD液晶屏 Revision0.01 (2011-09-28)

原想把本期《点亮LCD液晶屏》教程放在《GPIO编程》之后,以提高大家的兴趣,但考虑到可能网友学习STM32,是想更多地了解STM32内部工作机制,因此在之前的教程,我们先介绍了串口、外部中断、定时器等最基本的外设模块,有了这些基础,相信您再来学习LCD液晶,已经很轻松了。 我们使用的是芯达STM32配套的2.4寸TFT液晶触摸屏,它是山寨手机上的触摸液晶屏,内部驱动IC为ILI9325。我们操作LCD,实际上就是在操作ILI9325。有关该芯片的资料,请参考如下两个网址: ILI9325指令说明(中文):https://www.360docs.net/doc/ed16379751.html,/read.php?tid=142 考虑到“触摸”涉及到太多的原理,因此把触摸屏单独列出一期教程详细讲解。这里只讲述如何去点亮LCD液晶屏,如果您看完本期教程,能理解LCD驱动过程,那么笔者心满意足。 要驱动LCD,分两个部分讲解: 1、CPU内部模块支持的LCD接口(这里使用FSMC模块) 2、LCD控制电路 一、STM32的FSMC原理 如果是单片机,相信大家再熟悉不过了,直接拿P0或者P1口用作LCD数据总线,再另外拿出几个IO口用作控制信号线——一个LCD控制电路完成了。STM32相对于单片机,有啥过人之处呢? 对于STM32系列的CPU来说,有两种方法给LCD总线赋值。第一个方法,就是给对应的GPIOx_ODR寄存器赋值——这与单片机一样,单片机也是给P0-P3寄存器赋值,使得信号能从对应的IO端口输出。而STM32的另一种方法就是使用FSMC。FSMC全称“静态存储器控制器”。使用FSMC控制器后,我们可以把FSMC提供的FSMC_A[25:0]作为地址线,而把FSMC提供的FSMC_D[15:0]作为数据总线。 1、FSMC包括哪几个部分? FSMC包含以下四个模块: (1)AHB接口(包含FSMC配置寄存器) (2)NOR闪存和PSRAM控制器 (3)NAND闪存和PC卡控制器

STM32入门系列教程之十二《实时时钟RTC编程》

STM32入门系列教程实时时钟RTC编程 Revision0.01 (2010-04-27)

对于单片机转ARM的同学来说,RTC可能比较少接触。提到实时时钟,更经常想到的是DS1302。当然,在STM32里,自己一个CPU已经足够,不需要DS1302。 实际上,RTC就只一个定时器而已,掉电之后所有信息都会丢失,因此我们需要找一个地方来存储这些信息,于是就找到了备份寄存器。因为它掉电后仍然可以通过纽扣电池供电,所以能时刻保存这些数据。我们在本期教程中将详细讲述RTC原理及例程,以引导大家顺利进入RTC的世界。 1.STM32的RTC模块 RTC模块之所以具有实时时钟功能,是因为它内部维持了一个独立的定时器,通过配置,可以让它准确地每秒钟中断一次。下面就来看以下它的组成结构。 1.1RTC的组成 RTC由两个部分组成:APB1接口部分以及RTC核心部分(感觉说了等于没说,因为任何模块都会有接口部分和它自己的核心部分。请注意,权威的STM32系列手册是这么说的?)。笔者猜想原因可能是STM32所有的外设默认时钟无效,使用某个外设时,再开启时钟,用这样的方式来降低功耗。这里的RTC,APB1接口由APB1总线时钟来驱动。为了突出时钟吧?不过据说APB1接口部分还包括一组16位寄存器。 RTC核心部分又分为预分频模块和一个32位的可编程计数器。前者可使每个TR_CLK周期中RTC产生一个秒中断,后者可被初始化为当前系统时间。此后系统时间会按照TR_CLK周期进行累加,实现时钟功能。 1.2对RTC的操作 我们对RTC的访问,是通过APB1接口来进行的。注意,APB1刚被开启的时候(比如刚上电,或刚复位后),从APB1上读出来的RTC寄存器的第一个值有可能是被破坏了的(通常读到0)。这个不幸,STM32是如何预防的呢?我们在程序中,会先等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1,然后才开始读操作,这时候读出来的值就是OK的。 那么对RTC寄存器的写操作会不会有类似的情况呢?对于写操作,我们只要注意,每一次写操作,必须确保在前一次写操作完成后进行。这个“确保”,

STM32学习笔记

sw笨笨的STM32学前班教程之一:为什么是它 SW笨笨发表于2009年01月30日21:43 阅读(70) 评论(0) 分类:个人日记 举报 经过几天的学习,基本掌握了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%。且有更多的串口,CAP和PWM,这是有用的。高端型号有SDIO,理论上比SPI速度快。 由以上比较,准备将未来的拥有操作系统的高端应用交给DSP的新型浮点型单片机28335,而将所有紧凑型小型、微型应用交给STM32。 ——SW笨笨,2009年春节假期 sw笨笨的STM32学前班教程之二:怎么开发 SW笨笨发表于2009年01月30日22:03 阅读(89) 评论(0) 分类:个人日记 举报

STM32+指导教程

豆 皮 教 程 目 录: 名 称 作 者 页 码 01. LED跑马灯littleworm 2 13 02.按键 + 蜂鸣器littleworm 03. SysTick 定时器littleworm 20 24 04.串口通讯 UART littleworm 05.豆皮会唱歌littleworm 31 06.I2C--24Cxx枫仔37 07. ADC with DMA枫仔43 08.内部温度传感器littleworm 49 55 09. SPI实战,Nokia5110 LCD littleworm 10. RTC初探枫仔61 64 11. Unique Device ID littleworm 66 12. STM32 ISP下载littleworm 72 13.SPI模式读写SD卡littleworm 80 14.基于STM32 的 FAT16文件系统littleworm 87 15.串口中间件的使用littleworm 16.EEPROM三备份带CRC校验枫仔89 17. IAP 之串口篇枫仔91

豆皮 - STM32开发板入门教程(一)LED 跑马灯 littleworm 版权所有 STMFANS 原创,转载请保留出处 一步一步创建第一个 IAR 工程 (IAR442 + ST-LINKII) 首先创建项目目录,拷贝公共文件:将 STM32 软件库中 FWlib 目录中的 library 目录拷贝到所建项目的目录中 这个是库 FWLIB 文件夹 把 FWlib 目录中的 library 目录拷贝到所建项目的目录中 将软件库的 Examples 目录里的任一例程的 stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h 和main.c 拷贝到项目的目录中(这里选择的是 GPIO 目录下的 \FWLib\examples\GPIO\IOToggle)TOP

最新【设计教程大集合】STM32F3XX大全

STM32F3系列是意法半导体ARM? Cortex?-M4微控制器产品组合的入门级产品。经过市场检验的M4处理器内核可支持DSP指令,内置浮点单元(FPU),运行频率高达72MHz,若再搭配意法半导体独有的且基于内核耦合存储器(CCM-SRAM) 的程序加速(Routine Booster) 功能,其电机控制等例行程序的执行速度可比原来提升43%。STM32F3系列属于共有600余款产品的STM32产品家族,性能表现比STM32F1 Cortex-M3系列更加出色。STM32系列产品的软硬件具有广泛的共性,并提供简单易用的设计工具和开发生态系统。 基本资料 【产品新闻】意法半导体(ST)推出闪存容量高达512KB的STM32F3微控制器,大幅提升系统集成度 【数据手册】STM32F358xC、STM32F378xx、STM32F318、STM32F302、STM32F303等ARM Cortex-M4 32位内核 【硬件资源】STM32F3系列固件、软件、工具资源 【视频】意法半导体STM32F3系列探索套件(discovery kit)介绍 进阶设计 目前意法半导体针对智慧型手机Sensor Hub提供采用Cortex-M0核心开发的STM32F072、采用Cortex-M4核心开发的STM32F301和STM32F401,以及采用Cortex-M4核心开发的STM32F429,其中三星(Samsung)智慧型手机Note 3的Sensor Hub中,即搭载该公司STM32F401。 【STM32F303开发】+视觉姿态识别 对一个目标进行姿态识别,以简单的三角形为例,目标放置在一个旋转平台上,初始姿态位置,通过图像识别姿态,并将姿态数据传送给nucleo,nucleo驱动舵机进行角度调整。

STM32入门C语言详解

阅读flash:芯片内部存储器flash操作函数我的理解——对芯片内部flash进行操作的函数,包括读取,状态,擦除,写入等等,可以允许程序去操作flash上的数据。 基础应用1,FLASH时序延迟几个周期,等待总线同步操作。推荐按照单片机系统运行频率,0—24MHz时,取Latency=0;24—48MHz时,取Latency=1;48~72MHz时,取Latency=2。 所有程序中必须的 用法:FLASH_SetLatency(FLASH_Latency_2); 位置:RCC初始化子函数里面,时钟起振之后。 基础应用2,开启FLASH预读缓冲功能,加速FLASH的读取。 所有程序中必须的 用法:FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); 位置:RCC初始化子函数里面,时钟起振之后。 3、阅读lib:调试所有外设初始化的函数。 我的理解——不理解,也不需要理解。只要知道所有外设在调试的时候,EWRAM需要从这个函数里面获得调试所需信息的地址或者指针之类的信息。 基础应用1,只有一个函数debug。所有程序中必须的。 用法:#ifdef DEBUG debug(); #endif 位置:main函数开头,声明变量之后。 4、阅读nvic:系统中断管理。 我的理解——管理系统内部的中断,负责打开和关闭中断。 基础应用1,中断的初始化函数,包括设置中断向量表位置,和开启所需的中断两部分。 所有程序中必须的。 用法:void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; //中断管理恢复默认参数 #ifdef VECT_TAB_RAM //如果C/C++ Compiler\Preprocessor\Defined symbols中的定义了 VECT_TAB_RAM(见程序库更改内容的表格) NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); //则在RAM调试 #else //如果没有定义VECT_TAB_RAM NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);//则在Flash里调试 #endif //结束判断语句 //以下为中断的开启过程,不是所有程序必须的。 //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC优先级分组,方式。 //注:一共16个优先级,分为抢占式和响应式。两种优先级所占的数量由此代码确定, NVIC_PriorityGroup_x可以是0、1、2、3、4,分别代表抢占优先级有1、2、4、8、16个和响应优先级有16、8、4、2、1个。规定两种优先级的数量后,所有的中断级别必须在其中选择,抢占级别高的会打断其他中断优先执行,而响应级别高的会在其他中断执行完优先执行。 //NVIC_InitStructure.NVIC_IRQChannel = 中断通道名; //开中断,中断名称见函数库 //NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级 //NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级

STM32-开发入门教程

STM32 开发入门教程 (一) 开发环境建立及其应用 入门准备: 我们常用的STM32 开发编译环境为Keil 公司的MDK (Microcontroller Development Kit) 和IAR 公司的EWARM. 在这里我们提供了比较稳定的新版本编译软件下载: MDK4.10 限于篇幅, 在我们的教程里面将先以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, 3 Synch. 16-bit Timers with Input Capture, Output Compare and PWM, 16-bit 6-ch Advanced Timer, 2 16-bit Watchdog Timers, SysTick Timer, 2 SPI, 2 I2C, 3 USART, USB 2.0 Full Speed Interface, CAN 2.0B Active, 2 12-bit 16-ch A/D Converter, Fast I/O Ports

stm32f107_的学习(新手入门)

1,说明:为什么选择STM32: 经过几天的学习,基本掌握了STM32的调试环境和一些基本知识。想拿出来与大家共享,笨教程本着最大限度简化删减STM32入门的过程的思想,会把我的整个入门前的工作推荐给大家。就算是给网上的众多教程、笔记的一种补充吧,所以叫学前班教程。其中涉及产品一律隐去来源和品牌,以防广告之嫌。全部汉字内容为个人笔记。先来说说为什么是它——我选择STM32的原因。 我对未来的规划是以功能性为主的,在功能和面积之间做以平衡是我的首要选择,而把运算放在第二位,这根我的专业有关系。里面的运算其实并不复杂,在入门阶段想尽量减少所接触的东西。 不过说实话,对DSP的外设并和开发环境不满意,这是为什么STM32一出就转向的原因。下面是我自己做过的两块DSP28的全功能最小系统板,在做这两块板子的过程中发现要想尽力缩小DSP的面积实在不容易(目前只能达到50mm×45mm,这还是没有其他器件的情况下),尤其是双电源的供电方式和1.9V的电源让人很头疼。 后来因为一个项目,接触了LPC2148并做了一块板子,发现小型的ARM7在外设够用的情况下其实很不错,于是开始搜集相关芯片资料,也同时对小面积的A VR和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%。且有更多的串口,CAP和PWM,这是有用的。高端型号有SDIO,理论上比SPI速度快。 由以上比较,准备将未来的拥有操作系统的高端应用交给DSP的新型浮点型单片机28335,而将所有紧凑型小型、微型应用交给STM32。 2,首先:stm32f107vc和stm32f103vb的个区别 stm32f107vc和stm32f103vb有几个区别,都是芯片内部设备的区别,就像好电脑和差电脑的配置不同,但都用xp,win7系统,而且软件也是通用的。 首先看头几个字母“stm32”,这两个都是stm32芯片,是意法半导体为ARM M3内核出的用于自动控制领域的微处理器。F107是互联型接口和内部资源较多,F103是曾强型(比F101强),相比103,F107加入ieee以太网接口,2个i2s音频接口(做音频解码用),全部64kb 的SRAM缓存。 但是这两个芯片的开发方法和调用的库函数都是一样的,你看官方称他们为 STM32f10X就知道了,引脚也是兼容的。 你学习的话都是学习库函数,f107多出来的增强功能等你学完基本的stm32开发的时候很快上手的。送你一副图哦,看看吧。

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