搜档网
当前位置:搜档网 › STM32综合资料

STM32综合资料

STM32综合资料
STM32综合资料

在STM32的数据手册的管脚分配图中可以看到:PC14与OSC32_IN公用一个引脚,PC15与OSC32_OUT公用一个引脚,管脚配置如图1、图2、图3所示。它们的使用方法如下:

当LSE(低速外部时钟信号)开启时,这两个公用管脚的功能是OSC32_IN和OSC 32_OUT。

当LSE(低速外部时钟信号)关闭时这两个公用管脚的功能是PC14和PC15。

备用区域控制寄存器(RCC_BDCR)的LSEON用于控制LSE的开启或关闭。关于这个寄存器的用法请参看《STM3210x技术参考手册》。

STM32的时钟系统分析

发布: 2010-5-21 12:11 | 作者: hnrain | 查看: 130次

在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。

①、HSI是高速内部时钟,RC振荡器,频率为8MHz。

②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4 MHz~16MHz。

③、LSI是低速内部时钟,RC振荡器,频率为40kHz。

④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。

⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。

其中40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC 的时钟源。另外,实时时钟RTC的时钟源还可以选择LSE,或者是HSE的128分频。R TC的时钟源通过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使用。

⑤、送给APB2分频器。APB2分频器可选择1、2、4、8、16分频,其输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给定时器(Timer)1倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器1使用。另外,APB2分频器还有一路输出供ADC分频器使用,分频后送给ADC模块使用。ADC分频器可选择为2、4、6、8分频。

在以上的时钟输出中,有很多是带使能控制的,例如AHB总线时钟、内核时钟、各种APB1外设、APB2外设等等。当需要使用某模块时,记得一定要先使能对应的时钟。

需要注意的是定时器的倍频器,当APB的分频为1时,它的倍频值为1,否则它的倍频值就为2。连接在APB1(低速外设)上的设备有:电源接口、备份接口、CAN、USB、I 2C1、I2C2、UART2、UART3、SPI2、窗口看门狗、Timer2、Timer3、Timer4。注意USB模块虽然需要一个单独的48MHz时钟信号,但它应该不是供USB模块工作的时钟,而只是提供给串行接口引擎(SIE)使用的时钟。USB模块工作的时钟应该是由APB1提供

的。连接在APB2(高速外设)上的设备有:UART1、SPI1、Timer1、ADC1、ADC2、所有普通IO口(PA~PE)、第二功能IO口。

下图是STM32用户手册中的时钟系统结构图,通过该图可以从总体上掌握STM32的时钟系统。

前面用STM32的GPIO模拟液晶驱动时序时遇到一个问题,就是怎样产生一段较为精确的延时。通常产生一小段延时的方法就是利用一个递增或者递减循环进行软件延时。

例:

void delay(void)

{

int i="0x0ff";

while (i--)

;

}

我在使用MPLAB IDE进行PIC单片机的开发时,MPLAB提供了一个Watch(跑表)功能,可以很方便的查看一个函数或一段代码的运行时间,利用这个功能就可以很容易的编写能产生精确延时的代码。而据我目前了解的情况,不管是IAR 还是RealView MDK都没有提供类似的功能,这样就不能像上例那样来获得较为精确的延时了。

有人说了,可以用定时器中断的方法来产生精确延时,一点没错,不过在S TM32中还可以采用更简单的方法来产生精确延时,那就是利用Cortex系统定时器—SysTick。

在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。SysTick的最大使命,就是定期地产生异常请求,作为系统的时基。

SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。SysTick是一个24位的倒数定时器,当计数值减到0时,将从RELOAD寄存器中自动重装载定时初值,只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。SysTick定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹铃,用于测量时间等。

用SysTick产生精确延时的方法如下:

1、首先对SysTick进行设置

void SysTick_Configuration(void)

{

/* Configure HCLK clock as SysTick clock source */

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //系

统时钟8分频

/* SysTick interrupt each 1000 Hz with HCLK equal to 72MHz */

SysTick_SetReload(9000); //周期1ms

/* Enable the SysTick Interrupt */

SysTick_ITConfig(ENABLE); //打开中断

}

2、延时函数

void SysTick_Delay(u32 nTime)

{

/* Enable the SysTick Counter */

SysTick_CounterCmd(SysTick_Counter_Enable); //允许计数

TimingDelay = nTime;

while(TimingDelay != 0);

/* Disable SysTick Counter */

SysTick_CounterCmd(SysTick_Counter_Disable); //禁止计数

/* Clear SysTick Counter */

SysTick_CounterCmd(SysTick_Counter_Clear); //计数器清0

}

3.中断函数

void SysTickHandler(void)

{

TimingDelay_Decrement();

}

4.中断调用函数

void TimingDelay_Decrement(void)

{

if (TimingDelay != 0x00)

{

TimingDelay--;

}

}

利用以上几个函数就能产生精确延时了,使用时通过调用SysTick_Delay(u 32 nTime)函数来设置延时时间,这里提供一个产生秒延时的程序供大家参考。

chengxu.rar(4.84 KB)

附上效果图,大家看完不要忘了“顶一下”啊!

STM32与LPC系列ARM资源之比较

发布: 2009-5-20 16:02 | 作者: hnrain | 查看: 443次

由于有周立公开发板的影响,LPC系列的开发板在工程师心目中一般是入门的最好型号之一。这次刚好有STM32的竞赛,正好将两者的资源进行比较一下(L PC系列以LPC213X为例)。

LPC213X包括LPC2131、2132、2138等,是基于一个支持实时仿真和跟踪的16/32位ARM7TDMI-STM CPU,并带有32kB、64kB和512kB嵌入的高速Flash存储器。128位宽度的存储器接口和独特的加速结构使32位代码能够在最大时钟速率下运行。对代码规模有严格控制的应用可使用16位Thumb模式将代码规模降低超过30%,而性能的损失却很小。

而STM32则大致分为两类,一种是基本型,一种是增强型。这同51内核的单片机有点类似,51系列的单片机也有普通型和增强型。基本型STM32系列AR

M包括STM32F101x6、STM32F101x8、STM32F101xB等,它是32位基于ARM核心的带闪存微型控制器,有六个16位定时器、ADC、7个通信接口;而增强型STM 32系列的ARM包括STM32F103x6、STM32F103x8、STM32F103xB等,它是32位基于ARM核心的带闪存的、USB、CAN总线的微控制器,它有七个16位定时器、2个ADC、9个通信接口。

内核方面,LPC213X是ARM7TDMI-S内核,而STM32则是Cortex-M3?CPU

片内存储方面,LPC213X有8/16/32kB的片内静态RAM和32/64/512kB的片内Flash程序存储器。而STM32则有从32K字节至128K字节闪存程序存储器,从6K字节至16K字节SRAM。

LPC有如下特征:

??通过片内boot装载程序实现在系统编程/在应用编程(ISP/IAP)。单扇区或整片擦除时间为400ms。

256字节行编程时间为1ms。

?? EmbeddedICE?RT和嵌入式跟踪接口通过片内RealMonitorTM软件对代码进行实时调试和高速跟

踪。

?? 1个(LPC2131/2132)或2个(LPC2138)8路10位的A/D转换器,共提供16路模拟输入,每

个通道的转换时间低至2.44us。

1个10位的D/A转换器,可产生不同的模拟输出。(仅适用于LPC2132/2 138)

2个32位定时器/计数器(带4路捕获和4路比较通道)、PWM单元(6路输出)和看门狗。

实时时钟具有独立的电源和时钟,可在节电模式中极大地降低功耗。

多个串行接口,包括2个16C550工业标准UART、2个高速I2C接口(400 kbit/s)、SPITM和具有

缓冲作用和数据长度可变功能的SSP。

向量中断控制器。可配置优先级和向量地址。

小型的LQFP64封装上包含多达47个通用I/O口(可承受5V电压)。

多达9个边沿或电平触发的外部中断管脚。

通过片内PLL(100us的设置时间)可实现最大为60MHz的CPU操作频率。

片内晶振频率范围:1~30 MHz。

低功耗模式:空闲和掉电。

可通过个别使能/禁止外部功能和外围时钟分频来优化功耗。

通过外部中断将处理器从掉电模式中唤醒。

单电源,具有上电复位(POR)和掉电检测(BOD)电路:

CPU操作电压范围:3.0V~3.6 V (3.3 V±10﹪),I/O口可承受5V的电压。

STM32有如下特征:

■能够有单周期乘法和硬件除法

■存储器

从32K字节至128K字节闪存程序存储器

从6K字节至16K字节SRAM

■时钟、复位和供电管理

2.0至

3.6伏供电和I/O管脚

上电/断电复位(POR / PDR)、可编程电压监测器(PVD)

内嵌4至16MHz高速晶体振荡器

内嵌经出厂调校的8MHz RC振荡器

内部40kHz的RC振荡器

PLL供应CPU时钟

带校准的32kHz RTC振荡器

■低功耗

睡眠、停机和待机模式

VBAT为RTC和后备寄存器供电

■调试模式

串行线调试(SWD)和JTAG调试接口

■DMA

7通道DMA控制器

支持的外设:定时器、ADC、SPI、I2C和USART

■1个12位模数转换器,1us转换时间(16通道)

■多达80个快速I/O口

26/37/51/80个多功能双向5V兼容的I/O口

所有I/O口可以映像到16个外部中断

■多达6个定时器

多达3个16位定时器,每个定时器有多达4个用于输入捕获/输出比较/ P WM或脉冲计数的通道

2个16位看门狗定时器(独立的和窗口型的)

系统时间定时器:24位自减型

■多达7个通信接口

多达2个I2C接口(SMBus/PMBus)

多达3个USART接口,支持ISO7816,LIN,IrDA接口和调制解调控制

多达2个SPI同步串行接口(18兆位/秒)

STM32启动代码概述

发布: 2009-5-20 16:00 | 作者: hnrain | 查看: 1013次

一般嵌入式开发流程就是先建立一个工程,再编写源文件,然后进行编译,把所有的*.s文件和*.c文件编译成一个*.o文件,再对目标文件进行链接和定位,编译成功后会生成一个*.hex文件和调试文件,接下来要进行调试,如果成功的话,就可以将它固化到flash里面去。

启动代码是用来初始化电路以及用来为高级语言写的软件作好运行前准备

的一小段汇编语言,是任何处理器上电复位时的程序运行入口点。

比如,刚上电的过程中,PC机会对系统的一个运行频率进行锁定在一个固定的值,这个设计频率的过程就是在汇编源代码中进行的,也就是在启动代码中进行的。与此同时,设置完后,程序开始运行,注意,程序是在内存中运行的。这个时候,就需要把一些源文件从flash里面copy到内存中,又要对它们进行初始化读写,这又有频率的设置。这些都是初始化。

初始化完成后,我们又要设置一些堆栈,要跳到C语言的main函数里面运行。这就需要堆栈。对普通的ARM CPU有这样一个要求:在绝对地址为零的地方要放置一个异常向量表,但并不是所有的ARM CPU都留有这个一个空间,这就需要用到映射的功能。我们可以将其它地方的一些空间映射到绝对地址里面。当发生异常时,ARM核来读取异常中断表的时候,它会使用映射之后的那个表,这个就可以接着往下执行,否则在绝对地址零的地方找不到任何信息,程序就会死掉。这些运行的环境全部建立好后,程序就会跳转到我们的main函数里面。

总之,启动代码,就是对最小系统的初始化。包括晶振,CPU频率等。

启动代码的最小系统是:异常向量表的初始化–存储区分配–初始化堆栈–高级语言入口函数调用– main()函数。

程序的启动过程:

以下面这个例子为例,编译完后,DEBUG后,我们可以看到,光标指向绝对地址为零的地方,这里存放的就是一个异常向量表。

它对应在startup.s里的源文件如下:

单步运行后,马上跳转到初始化CPU的频率。即初始化锁相环,将其锁在一个固定的频率。具体代码如下:

; Setup PLL

IF PLL_SETUP <> 0

LDR R0, =PLL_BASE

MOV R1, #0xAA

MOV R2, #0x55

; Configure and Enable PLL

MOV R3, #PLLCFG_Val

STR R3, [R0, #PLLCFG_OFS]

MOV R3, #PLLCON_PLLE

STR R3, [R0, #PLLCON_OFS]

STR R1, [R0, #PLLFEED_OFS]

STR R2, [R0, #PLLFEED_OFS]

; Wait until PLL Locked

PLL_Loop LDR R3, [R0, #PLLSTAT_OFS]

ANDS R3, R3, #PLLSTAT_PLOCK

BEQ PLL_Loop

; Switch to PLL Clock

MOV R3, #(PLLCON_PLLE:OR:PLLCON_PLLC)

STR R3, [R0, #PLLCON_OFS]

STR R1, [R0, #PLLFEED_OFS]

STR R2, [R0, #PLLFEED_OFS]

ENDIF ; PLL_SETUP

然后再初始化每一种模式的堆栈,再进行单步运行的时候,下面我们可以看到,它自动跳转到main()函数:

; Enter the C code

IMPORT __main

LDR R0, =__main

BX R0

IF :DEF:__MICROLIB

EXPORT __heap_base

EXPORT __heap_limit

ELSE

这个时候,程序会运行各种scatterload函数,将我们的堆栈、全局变量等内容拷贝到内存中去。拷贝完后,就正式跳转到我们的main()函数中来执行了。

这就是启动代码执行的全过程,呵呵,平时我们看到以为只是执行main()函数就行了,是不是没有想到在执行 main() 函数后还有这么多学问呢?

STM32 GPIO的十大优越功能综述

发布: 2009-5-20 14:26 | 作者: hnrain | 查看: 239次

前几天Hotpower邀请大家讨论一下GPIO的功能、性能和优缺点,等了几天没见太多人发言,但综合来看提到了3点:1)真双向IO,2)速度快,3)寄存器功能重复。关于第3点有说好,有说多余的,见仁见智。

下面我就在做个抛砖引玉,根据ST手册上的内容,简单地综述一下GPIO的功能:

一、共有8种模式,可以通过编程选择:

1. 浮空输入

2. 带上拉输入

3. 带下拉输入

4. 模拟输入

5. 开漏输出——(此模式可实现hotpower说的真双向IO)

6. 推挽输出

7. 复用功能的推挽输出

8. 复用功能的开漏输出

模式7和模式8需根据具体的复用功能决定。

二、专门的寄存器(GPIOx_BSRR和GPIOx_BRR)实现对GPIO口的原子操作,即回避了设置或清除I/O端口时的“读-修改-写”操作,使得设置或清除I/O端口的操作不会被中断处理打断而造成误动作。

三、每个GPIO口都可以作为外部中断的输入,便于系统灵活设计。

四、I/O口的输出模式下,有3种输出速度可选(2MHz、10MHz和50MHz),这有利于噪声控制。

五、所有I/O口兼容CMOS和TTL,多数I/O口兼容5V电平。

六、大电流驱动能力:GPIO口在高低电平分别为0.4V和VDD-0.4V时,可以提供或吸收8mA电流;如果把输入输出电平分别放宽到1.3V和VDD-1.3V时,可以提供或吸收2 0mA电流。

七、具有独立的唤醒I/O口。

八、很多I/O口的复用功能可以重新映射。

九、GPIO口的配置具有上锁功能,当配置好GPIO口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。此功能非常有利于在程序跑飞的情况下保护系统中其他的设备,不会因为某些I/O口的配置被改变而损坏——如一个输入口变成输出口并输出电流。

十、输出模式下输入寄存器依然有效,在开漏配置模式下实现真正的双向I/O功能。

STM32学习笔记—之GPIO端口篇

发布: 2009-5-20 16:08 | 作者: hnrain | 查看: 503次

最近刚开始学习STM32,所以从最基本的GPIO开始学起;首先看看STM32的datashe et上对GPIO口的简单介绍:

每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。

GPIO端口的每个位可以由软件分别配置成多种模式。每个I/O端口位可以自由编程,然而I/0端口寄存器必须按32位字被访问(不允许半字或字节访问)。GPIOx_BSRR和GPIOx_ BRR寄存器允许对任何GPIO寄存器的读/更改的独立访问;这样,在读和更改访问之间产生IRQ时不会发生危险。

端口位配置CNFx[1:0]=xxb,MODEx[1:0]=xxb

再看GPIO功能很强大:

1.通用I/O(GPIO):最最基本的功能,可以驱动LED、可以产生PWM、可以驱动蜂鸣器等等;

2.单独的位设置或位清除:方便软体作业,程序简单。端口配置好以后只需GPIO_Set Bits(GPIOx, GPIO_Pin_x)就可以实现对GPIOx的pinx位为高电平;

3.外部中断/唤醒线:端口必须配置成输入模式时,所有端口都有外部中断能力;

4.复用功能(AF):复用功能的端口兼有IO功能等。复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式:(CNFx[1:0]=01b,MODEx[1:0]=00b)。

5.软件重新映射I/O复用功能:为了使不同器件封装的外设I/O功能的数量达到最优,可以把一些复用功能重新映射到其他一些脚上。这可以通过软件配置相应的寄存器来完成。这时,复用功能就不再映射到它们的原始引脚上了;

6.GPIO锁定机制:主要针对复位设定的,当某端口位lock后,复位后将不改变的此端口的位配置。

GPIO基本设置

GPIOMode_TypeDef GPIO mode定义及偏移地址

GPIO_Mode_AIN = 0x0, //模拟输入

GPIO_Mode_IN_FLOATING = 0x04, //悬空输入

GPIO_Mode_IPD = 0x28, //下拉输入

GPIO_Mode_IPU = 0x48, //上拉输入

GPIO_Mode_Out_OD = 0x14, //开漏输出

GPIO_Mode_Out_PP = 0x10, //推挽输出

GPIO_Mode_AF_OD = 0x1C, //开漏复用

GPIO_Mode_AF_PP = 0x18 //推挽复用

GPIO输入输出速度选择:

typedef enum

{

GPIO_Speed_10MHz = 1,

GPIO_Speed_2MHz,

GPIO_Speed_50MHz

}

GPIOSpeed_TypeDef;

#define IS_GPIO_SPEED(SPEED) ((SPEED == GPIO_Speed_10MHz) || (SPEED == GPI O_Speed_2MHz) || (SPEED == GPIO_Speed_50MHz))

做一个GPIO输出的试验

当I/O端口被配置为推挽模式输出时:输出寄存器上的0激活N-MOS,而输出寄存器上的1将激活P-MOS。

用这段程序实现:GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

int main(void)

{

#ifdef DEBUG

d ebug();

#endif

/*设置系统时钟*/

R CC_Configuration();

/*嵌套中断设置*/

N VIC_Configuration();

/*激活GPIOC clock */

R CC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

/* Configure PC.04, PC.05, PC.06 and PC.07 as Output push-pull */

G PIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;

G PIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

G PIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

G PIO_Init(GPIOC, &GPIO_InitStructure);

w hile (1)

{

/*本试验仅能实现LED1亮、熄功能*/

G PIO_SetBits(GPIOC, GPIO_Pin_4); //设置PC.04 pin为高电平,点亮LED1

D elay();

G PIO_ResetBits(GPIOC, GPIO_Pin_4); //设置PC.04 pin为低电平,熄灭LED1

D elay();

}

}

做一个GPIO输入的试验:以EK-STM32F中LCDdemo做例子

这个试验中把GPIO的PD.04做为按键输入,当下降沿来临时触发。

LCDdemo中的例程如下:首先配置按键PD.03, PD.04为按键输入接口。

void Button_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

/* Enable GPIOD clock */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

/* Configure PD.03, PD.04 as output push-pull */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 ;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOD, &GPIO_InitStructure);

}

下面为按键作用是启动外部中断

GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource3);

EXTI_InitStructure.EXTI_Line = EXTI_Line3; //设定外部中断3

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设定中断模式

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //设定下降沿触发模式 EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

(完整版)STM32F103xx系列单片机介绍

STM32F103xx系列单片机介绍 STM32F103xx增强型系列由意法半导体集团设计,使用高性能的ARMCortex-M332位的RISC 内核,工作频率为72MHz,内置高速存储器(高达128K字节的闪存和20K字节的SRAM),丰富的增强I/O端口和联接到两条APB总线的外设。所有型号的器件都包含2个12位的ADC、3个通用16位定时器和一个PWM定时器,还包含标准和先进的通信接口:多达2个I2C和SPI、3个USART、一个USB和一个CAN。 1、结构与功能 ■内核:ARM32位的Cortex?-M3CPU ?72MHz,1.25DMips/MHz(Dhrystone2.1),0等待周期的存储器 ?支持单周期乘法和硬件除法 ■存储器 ?从32K字节至512K字节的闪存程序存储器(STM32F103xx中的第二个x表示FLASH容量,其中:“4”=16K,“6”=32K,“8”=64K,B=128K,C=256K,D=384K,E=512K) ?从6K字节至64K字节的SRAM ■时钟、复位和电源管理 ?2.0至3.6伏供电和I/O管脚 ?上电/断电复位(POR/PDR)、可编程电压监测器(PVD) ?内嵌4至16MHz高速晶体振荡器 ?内嵌经出厂调校的8MHz的RC振荡器 ?内嵌40kHz的RC振荡器 ?PLL供应CPU时钟 ?带校准功能的32kHzRTC振荡器 ■低功耗 ?睡眠、停机和待机模式 ?VBAT为RTC和后备寄存器供电 ■2个12位模数转换器,1us转换时间(16通道) ?转换范围:0至3.6V ?双采样和保持功能 ?温度传感器 ■DMA ?7通道DMA控制器 ?支持的外设:定时器、ADC、SPI、I2C和USART ■多达80个快速I/O口 ?26/37/51/80个多功能双向5V兼容的I/O口 ?所有I/O口可以映像到16个外部中断

stm32知识点最终版!

1.*嵌入式系统:以计算机技术为基础,以应用为中心,软件硬件可剪裁,适合应用系统对功能可靠性、成本、体积、功耗严格要求的专业计算机系统。 2.*嵌入式系统与传统系统等所区分的三个特征:微处理器通常由32位以上的RISC组成;软件通常是以嵌入式操作系统为核心,外加用户应用程序;具有明显的可嵌入性。 3.*嵌入式系统的应用:智能消费电子中;工业控制中;医疗设备中;信息家电及家庭智能管理系统;网络与通信系统中;环境工程;机器人。 4.*ARM定义的三大分工明确的系列:“A”系列面向尖端的基于虚拟内存的操作系统和用户应用(针对日益增长的运行包括linux、Windows、CE和Android在内的消费电子和无线产品);“R”系列针对实时系统(针对需要运行实时操作系统来惊醒控制应用的系统,包括汽车电子、网络和影像系统);“M”系列对胃控制器和点成本应用提供优化(针对开发费用低功耗低,同时针对性能要求不断增加的嵌入式应用而设计,如汽车车身控制系统和各种大型家电)。 5.ARM Cortex处理器系列是基于ARMv7构架的产品,既有ARM Cortex-M系列,也有高性能的A系列。 6.NEON技术是64/128位SIMD指令集,用于新一代媒体和信号处理应用加速。NEON支持8位,16位,32位,64位整数及单精度浮点SIMD操作,以进行音频,视频、图像和游戏的处理。 7.ARM Cortex-M3处理器的特点:性能丰富成本低,低功耗,可配置性能强,丰富的链接。 8.*STM32F10x处理器分为:101,102,103,105,107。 9.*STM32的总线速度:USB接口速度12Mb/s;USART接口速度4.5Mb/s;SPI接口速度可达18Mb/s;IC接口速度400kHz。 10.STM32系列处理器的优点:先进的内部结构;三种功耗控制;最大程度集成整合;出众及创新的外设。 11.STM32F10x按性能分为:基本型STM32F101,USB基本型STM32F102,增强型STM32F103,互联网型STM32F105、STM32F107系列。 12.STM32F103RBT6系列的命名规则:R-引脚数量、B-Flash大小、T-封装、6-工作温度。 13.*STM32F103按照引脚功能分为:电源、复位、时钟控制、启动配置、输入输出口。 14.STM32F103总线系统包括:驱动单元、被动单元、总线矩阵。 15.最小系统是指仅包含必须的元器件、仅可运行最基本软件的基本系统。 16.典型的最小系统包括:微控制器芯片、供电电路、时钟电路、复位电路、启动配置电路和程序下载电路。 第三章 1.STM32标准库命名则:PPP_Init:根据PPP_InitTypeDef中指定的参数初始化外设ppp; PPP_DeInit:将外设PPP寄存器重设为缺省值; PPP_StructInit:将PPP_InitTypeDef结构中的参数设为缺省值; PPP_Cmd:使能或失能PPP外设; PPP_ItConfig:使能或失能PPP外设的中断源; PPP_GetITStatus:判断PPP外设中断发生与否; PPP_ClearITPendingBit:清除PPP外设中断待处理标志位; PPP_DMAConfig:使能或者失能PPP外设的DMA接口; PPP_GetFlagStatus:检查PPP外设的标志位; PPP_ClearFiag:清除PPP外设的标志位。 2.文件结构:每个C程序通常分为两个文件,一个文件用于保存程序的声明,成为头文件,以.h为后缀。另一个用于保存程序的实现,称为源文件,以.c后缀。 3.C语言的关键字有32个,根据作用分为数据类型、控语言、储存类型、其他关键字。 4.指针:是C语言中广泛使用的一种数据类型. 5.指向数组元素的指针 定义一个整形数组和一个指向整型的指针变量: Int a [10]; Int*p=NULL;//定义指针式要初始化 P=a;//数组名a为数组第0个元素的地址 //与p=&a[0]等价 P+i和a+i表示a[i]的地址;*(p+i)和*(a+i)表示P+i和a+i内容。 6.结构体:是由基本数据类型构成的,并并一个标识符来命名的各种变量的组合。

stm32芯片简介

单片机存储器处理器成本STM32 背景如果你正为项目的处理器而进行艰难的选择:一方面抱怨16位单片机有限的指令和性能,另一方面又抱怨32位处理器的高成本和高功耗,那么,基于ARM Cortex-M3内核的STM32系列处理器也许能帮你解决这个问题。使你不必在性能、成本、功耗等因素之间做出取舍和折衷。 即使你还没有看完STM32的产品手册,但对于这样一款融合ARM和ST技术的“新生儿”相信你和我一样不会担心这款针对16位MCU应用领域的32位处理器的性能,但是从工程的角度来讲,除了芯片本身的性能和成本之外,你或许还会考虑到开发工具的成本和广泛度;存储器的种类、规模、性能和容量;以及各软件获得的难易,我相信你看完本专题会得到一个满意的答案。 对于在16位MCU领域用惯专用在线仿真器(ICE)的工程师可能会担心开发工具是否能够很快的上手?开发复杂度和整体成本会不会增加?产品上市时间会不会延长?没错,对于32位嵌入式处理器来说,随着时钟频率越来越高,加上复杂的封装形式,ICE已越来越难胜任开发工具的工作,所以在32位嵌入式系统开发中多是采用JTAG仿真器而不是你熟悉的ICE。但是STM32采用串行单线调试和JTAG,通过JTAG调试器你可以直接从CPU获取调试信息,从而将使你的产品设计大大简化,而且开发工具的整体价格要低于ICE,何乐而不为? 有意思的是STM32系列芯片上印有一个蝴蝶图像,据ST微控制器产品部Daniel COLONNA 先生说,这是代表自由度,意在给工程师一个充分的创意空间。我则“曲解”为预示着一种蝴蝶效应,这种蝴蝶效应不仅会对方案提供商以及终端产品供应商带来举足轻重的影响,而且会引起竞争对手策略的改变……翅膀已煽动,让我们一起静观其变! STM32市面上流通的型号截至2010年7月1日,市面流通的型号有:基本型:STM32F101R6 STM32F101C8 STM32F101R8 STM32F101V8 STM32F101RB STM32F101VB 增强型:STM32F103C8 STM32F103R8 STM32F103V8 STM32F103RBSTM32F103VB STM32F103VE STM32F103ZE STM32系列的作用简介ARM公司的高性能”Cortex-M3”内核 1.25DMips/MHz,而ARM7TDMI只有0.95DMips/MHz 一流的外设 1μs的双12位ADC,4兆位/秒的UART,18兆位/秒的SPI,18MHz的I/O翻转速度低功耗 在72MHz时消耗36mA(所有外设处于工作状态),待机时下降到2μA 最大的集成度 复位电路、低电压检测、调压器、精确的RC振荡器等 简单的结构和易用的工具 STM32F10x重要参数2V-3.6V供电 容忍5V的I/O管脚 优异的安全时钟模式 带唤醒功能的低功耗模式 内部RC振荡器 内嵌复位电路 工作温度范围: -40°C至+85°C或105°C STM32F101性能特点36MHz CPU 多达16K字节SRAM 1x12位ADC温度传感器 STM32F103性能特点72MHz CPU多达20K字节SRAM 2x12位ADC 温度传感 PWM定时器 CAN USB STM32互联型系列简介:全新STM32互连型(Connectivity)系列微控制器增加一个全

stm32f1与4系列的区别

以前看到摘录的,帖过来参考: F1采用Crotex M3内核,F4采用Crotex M4内核。 F1最高主频 72MHz, F4最高主频168MHz。 F4具有单精度浮点运算单元,F1没有浮点运算单元。 F4的具备增强的DSP指令集。F4的执行16位DSP指令的时间只有F1的30%~70%。F4执行32位DSP指令的时间只有F1的25~60%。 F1内部SRAM最大64K字节, F4内部SRAM有192K字节(112K+64K+16K)。 F4有备份域SRAM(通过Vbat供电保持数据),F1没有备份域SRAM。 F4从内部SRAM和外部FSMC存储器执行程序的速度比F1快很多。F1的指令总线I-Bus只接到Flash上,从SRAM和FSMC取指令只能通过S-Bus,速度较慢。F4的I-Bus不但连接到Flash上,而且还连接到SRAM和FSMC上,从而加快从SRAM或FSMC取指令的速度。 F1最大封装为144脚,可提供112个GPIO;F4最大封装有176脚,可提供140个GPIO。 F1的GPIO的内部上下拉电阻配置仅仅针对输入模式有用,输出时无效。而F4的GPIO在设置为输出模式时,上下拉电阻的配置依然有效。即F4可以配置为开漏输出,内部上拉电阻使能,而F1不行。 F4的GPIO最高翻转速度为84MHz,F1最大翻转速度只有18MHz。 F1最多可提供5个UART串口,F4最多可以提供6个UART串口。 F1可提供2个I2C接口,F4可以提供3个I2C接口。 F1和F4都具有3个12位的独立ADC,F1可提供21个输入通道,F4可以提供24个输入通道。F1的ADC最大采样频率为1Msps,2路交替采样可到2Msps(F1不支持3路交替采样)。F4的ADC最大采样频率为2.4Msps,3路交替采样可到7.2Msps。 F1只有12个DMA通道,F4有16个DMA通道。F4的每个DMA通道有4*32位FIFO,F1没有FIFO。 F1的SPI时钟最高速度为 18MHz, F4可以到37.5MHz。 F1没有独立的32位定时器(32位需要级联实现),F4的TIM2和TIM5具有32位上下计数功能。 F1和F4都有2个I2S接口,但是F1的I2S只支持半双工(同一时刻要么放音,要么录音),而F4的I2S支持全双工,放音和录音可以同时进行。

STM32芯片型号的命名规则

STM32芯片型号的命名规则 一 STM32F105和STM32F107互连型系列微控制器之前,意法半导体已经推出STM32基本型系列、增强型系列、USB基本型系列、增强型系列;新系列产品沿用增强型系列的72MHz 处理频率。内存包括64KB到256KB闪存和20KB到64KB嵌入式SRAM。新系列采用LQFP64、LQFP100和LFBGA100三种封装,不同的封装保持引脚排列一致性,结合STM32平台的设计理念,开发人员通过选择产品可重新优化功能、存储器、性能和引脚数量,以最小的硬件变化来满足个性化的应用需求。 截至2010年7月1日,市面流通的型号有: 基本型:STM32F101R6 STM32F101C8 STM32F101R8 STM32F101V8 STM32F101RB STM32F101VB 增强型:STM32F103C8 STM32F103R8 STM32F103V8 STM32F103RBSTM32F103VB STM32F103VE STM32F103ZE STM32型号的说明:以STM32F103RBT6这个型号的芯片为例,该型号的组成为7个部分,其命名规则如下: (1)STM32:STM32代表ARM Cortex-M3内核的32位微控制器。 (2)F:F代表芯片子系列。 (3)103:103代表增强型系列。 (4)R:R这一项代表引脚数,其中T代表36脚,C代表48脚,R代表64脚,V代表100脚,Z代表144脚。 (5)B:B这一项代表内嵌Flash容量,其中6代表32K字节Flash,8代表64K字节Flash,B代表128K字节Flash,C代表256K字节Flash,D代表384K字节Flash,E代表512K字节Flash。 (6)T:T这一项代表封装,其中H代表BGA封装,T代表LQFP封装,U代表VFQFPN 封装。 (7)6:6这一项代表工作温度范围,其中6代表-40——85℃,7代表-40——105℃。 二 从上面的料号可以看出以下信息: ST品牌ARM Cortex-Mx系列内核32位超值型MCU,LQFP -48封装闪存容量32KB 温度范围-40℃-85℃; 1.产品系列: STM32代表ST品牌Cortex-Mx系列内核(ARM)的32位MCU; 2.产品类型: F:通用快闪(Flash Memory); L:低电压(1.65~3.6V);F类型中F0xx和F1xx系列为2.0~3.6V; F2xx和F4xx系列为

STM32系列单片机命名规则

示例: 从上面的料号可以看出以下信息: ST品牌ARM Cortex-Mx系列内核32位超值型MCU,LQFP -48封装闪存容量32KB 温度范围-40℃-85℃; 1.产品系列: STM32代表ST品牌Cortex-Mx系列内核(ARM)的32位MCU; 2.产品类型:F:通用快闪(Flash Memory); L:低电压(1.65~3.6V);F类型中F0xx和 F1xx系列为2.0~3.6V; F2xx 和F4xx系列为1.8~3.6V;W:无线系统芯片,开发版. 3.产品子系列: 030:ARM Cortex-M0内核; 050:ARM Cortex-M0内核; 051:ARM Cortex-M0内核; 100:ARM Cortex-M3内核,超值型; 101:ARM Cortex-M3内核,基本型; 102:ARM Cortex-M3内核,USB基本型; 103:ARM Cortex-M3内核,增强型; 105:ARM Cortex-M3内核,USB互联网型; 107:ARM Cortex-M3内核,USB互联网型、以太网型; 108:ARM Cortex-M3内核,IEEE802.15.4标准; 151:ARM Cortex-M3内核,不带LCD; 152/162:ARM Cortex-M3内核,带LCD;

205/207:ARM Cortex-M3内核,不加密模块.(备注:150DMIPS,高达1MB 闪存/128+4KB RAM,USB OTG HS/FS,以太网,17个TIM,3个ADC,15个通信外设接口和摄像头;) 215/217:ARM Cortex-M3内核,加密模块。(备注:150DMIPS,高达1MB 闪存/128+4KB RAM,USB OTG HS/FS,以太网,17个TIM,3个ADC,15个通信外设接口和摄像头;) 405/407:ARM Cortex-M4内核,不加密模块。(备注:MCU+FPU,210DMIPS,高达1MB闪存/192+4KB RAM,USB OTG HS/FS,以太网,17个TIM,3个ADC,15个通信外设接口和摄像头); 415/417:ARM Cortex-M4内核,加密模块。(备注:MCU+FPU,210DMIPS,高达1MB闪存/192+4KB RAM,USB OTG HS/FS,以太网,17个TIM,3个ADC,15个通信外设接口和摄像头); 4.管脚数: F:20PIN;G:28PIN;K:32PIN;T:36PIN;H:40PIN;C:48PIN;U:63PIN;R:64PIN;O:90PIN;V:100PINQ:132PIN;Z:144PIN; I:176PIN; 5. Flash存存容量: 4:16KB flash;(小容量); 6:32KB flash;(小容量);8:64KB flash;(中容量);B:128KB flash;(中容量);C:256KB flash;(大容量);D:384KB flash;(大容量);E:512KB flash;(大容量);F:768KB flash;(大容量);G:1MKB flash;(大容量) 6.封装: T:LQFP;H:BGA;U:VFQFPN;Y:WLCSP/ WLCSP64; 7.温度范围: 6:-40℃-85℃;(工业级); 7:-40℃-105℃;(工业级) 8.内部代码: “A”or blank; A:48/32脚封装;Blank:28/20脚封装; 9.包装方式: TR:带卷; XXX:盘装;D:电压范围1.65V – 3.6V且BOR无使能;无特性:电压范围1.8V – 3.6V且BOR使能;

STM32系列的CPU

STM32系列的CPU,有多达8个定时器 1.其中TIM1和TIM8是能够产生三对PWM互补输出的高级定时器,常用于三相电机的驱动,APB2 2.其他6个为普通定时器,APB1 定时器的作用: 1.定时 2.计数 3.输入捕获 4.匹配输出 5.PWM脉冲波 功能描述: 定时器还可以与定时器形成级联,组建更大的定时范围。 NOTE:只要你使用默认的库配置方式配置时钟为72M,无论TIM1还是TIMX,他们的计数器频率都是72M。 一、关于框图: TIMx_ETR: TIMER外部触发引脚 ETR: 外部触发输入 ETRP: 分频后的外部触发输入 ETRF: 滤波后的外部触发输入 ITRx: 内部触发x(由另外的定时器触发) TI1F_ED: TI1的边沿检测器。 TI1FP1/2: 滤波后定时器1/2的输入 TRGI: 触发输入 TRGO: 触发输出 CK_PSC: 应该叫分频器时钟输入

CK_CNT:定时器时钟。(定时周期的计算就靠它) TIMx_CHx: TIMER的输入脚 TIx: 应该叫做定时器输入信号x ICx: 输入比较x ICxPS: 分频后的ICx OCx: 输出捕获x OCxREF: 输出参考信号 关于框图要注意的: 1.时钟源(参考STM32定时器时钟源) 2.输入滤波(参考STM32定时器的输入滤波机制) 3.输入引脚和输出引脚是相同的。 二、时基: 时基单元包含: ●预分频器寄存器(TIMx_PSC) ●计数器寄存器(TIMx_CNT) ●自动装载寄存器(TIMx_ARR) CNT的计数方式分三种: 向上、向下、中央对齐。 通俗的说就是0—ARR、ARR—0、0—(ARR-1)—ARR—1. 三、时钟源: 1.内部时钟(参考STM32定时器时钟源) 2.外部时钟模式1 以T2举例 例如,要配置向上计数器在T12输入端的上升沿计数,使用下列步骤: 1. 配置TIMx_CCMR1寄存器CC2S=’01’,配置通道2检测TI2输入的上升沿 2. 配置TIMx_CCMR1寄存器的IC2F[3:0],选择输入滤波器带宽(如果不需要滤波器,保持IC2F=0000) 注:捕获预分频器不用作触发,所以不需要对它进行配置 3. 配置TIMx_CCER寄存器的CC2P=’0’,选定上升沿极性

详解STM32命名规则

STM32型号的说明:以STM32F103RBT6这个型号的芯片为例,该型号的组成为7个部分,其命名规则如下: 103性能特点 内核:ARM32位Cortex-M3 CPU,最高工作频率72MHz,1.25DMIPS/MHz。单周期乘法和硬件除法。 存储器:片上集成32-512KB的Flash存储器。6-64KB的SRAM存储器。 时钟、复位和电源管理:2.0-3.6V的电源供电和I/O接口的驱动电压。POR、PDR和可编程的电压探测器(PVD)。4-16MHz的晶振。内嵌出厂前调校的8MHz RC振荡电路。内部40 kHz 的RC振荡电路。用于CPU时钟的PLL。带校准用于RTC的32kHz的晶振。 低功耗:3种低功耗模式:休眠,停止,待机模式。为RTC和备份寄存器供电的VBAT。 调试模式:串行调试(SWD)和JTAG接口。 DMA:12通道DMA控制器。支持的外设:定时器,ADC,DAC,SPI,IIC和UART。 2个12位的us级的A/D转换器(16通道):A/D测量范围:0-3.6 V。双采样和保持能力。片上集成一个温度传感器。 2通道12位D/A转换器:STM32F103xC,STM32F103xD,STM32F103xE独有。 最多高达112个的快速I/O端口:根据型号的不同,有26,37,51,80,和112的I/O端口,所有的端口都可以映射到16个外部中断向量。除了模拟输入,所有的都可以接受5V以内的输入。 最多多达11个定时器:4个16位定时器,每个定时器有4个IC/OC/PWM或者脉冲计数器。2个16位的6通道高级控制定时器:最多6个通道可用于PWM输出。2个看门狗定时器(独立看门狗和窗口看门狗)。Systick定时器:24位倒计数器。2个16位基本定时器用于驱动DAC。 最多多达13个通信接口:2个IIC接口(SMBus/PMBus)。5个USART接口(ISO7816接口,LIN,IrDA兼容,调试控制)。3个SPI接口(18 Mbit/s),两个和IIS复用。CAN接口(2.0B)。USB 2.0全速接口。SDIO接口。 ECOPACK封装:STM32F103xx系列微控制器采用ECOPACK封装形式。 晶振工作原理计算机都有个计时电路,尽管一般使用“时钟”这个词来表示这些设备,但它们实际上并不是通常意义的时钟,把它们称为计时器(timer)可能更恰当一点。计算机的计时器通常是一个精密加工过的石英晶体,石英晶体在其张力限度内以一定的频率振荡,这种频率取决于晶体本身如何切割及其受到张力的大小。有两个寄存器与每个石英晶体相关联,一个计数器(counter)和一个保持寄存器(holdingregister)。石英晶体的每次振荡使计数器减1。当计数器减为0时,产生一个中断,计数器从保持寄存器中重新装入初始值。这种方法使得对一个计时器进行编程,令其每秒产生60次中断(或者以任何其它希望的频

STM32系列单片机命名规则

STM32系列单片机命名规则 示例: STM32F100C6T6B XXX 1 2 3 4 5 6 7 8 9 从上面的料号可以看出以下信息: ST品牌ARM Cortex-Mx系列内核32位超值型MCU,LQFP -48封装闪存容量32KB 温度范围-40℃-85℃; 1.产品系列: STM32代表ST品牌Cortex-Mx系列内核(ARM)的32位MCU; 2.产品类型: F:通用快闪(Flash Memory); L:低电压(1.65~3.6V);F类型中F0xx和F1xx系列为2.0~3.6V; F2xx和F4xx系列为1.8~3.6V;W:无线系统芯片,开发版. 3.产品子系列: 050:ARM Cortex-M0内核;051:ARM Cortex-M0内核;100:ARM Cortex-M3内核,超值型;101:ARM Cortex-M3内核,基本型;102:ARM Cortex-M3内核,USB基本型;103:ARM Cortex-M3内核,增强型;105:ARM Cortex-M3内核,USB互联网型;107:ARM Cortex-M3内核,USB互联网型、以太网型;108:ARM Cortex-M3内核,

IEEE802.15.4标准;151:ARM Cortex-M3内核,不带LCD;152/162:ARM Cortex-M3内核,带LCD; 205/207:ARM Cortex-M3内核,不加密模块.(备注:150DMIPS,高达1MB闪存/128+4KB RAM,USB OTG HS/FS,以太网,17个TIM,3个ADC,15个通信外设接口和摄像头;)215/217:ARM Cortex-M3内核,加密模块。(备注:150DMIPS,高达1MB闪存/128+4KB RAM,USB OTG HS/FS,以太网,17个TIM,3个ADC,15个通信外设接口和摄像头;)405/407:ARM Cortex-M4内核,不加密模块。(备注:MCU+FPU,210DMIPS,高达1MB 闪存/192+4KB RAM,USB OTG HS/FS,以太网,17个TIM,3个ADC,15个通信外设接口和摄像头); 415/417:ARM Cortex-M4内核,加密模块。(备注:MCU+FPU,210DMIPS,高达1MB 闪存/192+4KB RAM,USB OTG HS/FS,以太网,17个TIM,3个ADC,15个通信外设接口和摄像头); 4.管脚数: F:20PIN;G:28PIN;K:32PIN;T:36PIN;H:40PIN;C:48PIN;U:63PIN;R:64PIN;O:90PIN;V:100PINQ:132PIN;Z:144PIN;I:176PIN; 5. Flash存存容量: 4:16KB flash;(小容量); 6:32KB flash;(小容量);8:64KB flash;(中容量);B:128KB flash;(中容量);C:256KB flash;(大容量);D:384KB flash;(大容量);E:512KB flash;(大容量);F:768KB flash;(大容量);G:1MKB flash;(大容量) 6.封装: T:LQFP;H:BGA;U:VFQFPN;Y:WLCSP/ WLCSP64; 7.温度范围: 6:-40℃-85℃;(工业级); 7:-40℃-105℃;(工业级) 8.内部代码: “A” or blank; A:48/32脚封装;Blank:28/20脚封装; 9.包装方式: TR:带卷;XXX:盘装;D:电压范围1.65V – 3.6V且BOR无使能;无特性:电压范围1.8V – 3.6V且BOR使能;

相关主题