STM32学习笔记

STM32学习笔记
STM32学习笔记

读书参考手册

1 STM32不完全手册

2 基于MDK的STM32处理器开发应用

3 STM32中文参考手册

4 Cortex-M3权威指南

5 STM32固件库使用手册

6 STM32_在KEIL_MDK环境下使用V3.4库

经过这段时间,基本知道了内容。例如系统初始化配置,看门狗,定时器,AD,SPI 等等内容。这段时间,需要结合example例子,熟悉编程风格以及加深内容理解。

这次看书最重要,属于收获的阶段。大概看一个星期吧,仔细研究。然后就是开发板回来,通过动手,实践出真知。

2011-11-17 《基于MDK的STM32处理器开发应用》笔记

第一章:Cortex-M3处理器简介

2006年就推出了ARMv7(不是ARM7)内核,和DSP一样,有多个系列。A/R/M三个系列,很巧合,和ARM(advanced risc machines,英国公司,不生产芯片,提供设计芯片方案挣钱并提供软件开发工具、编译器)同名。

A:application,高端应用型号;

R:RealTime,实时系统;

M:MCU,低端微控制器。

产业链构成

内核设计<-> 芯片设计<-> 芯片制造<-> 产品设计<-> 产品制造

ARM公司| ST意法半导体公司| |自动化公司

标号含义

第二章:Cortex-M3编程模型

1. 模式、状态

1.1. 两种模式

处理模式:handle,异常时进入,特权状态;

线程模式:thread,正常处理模式,可以运行于特权和用户(非特权)状态;

1.2 两种状态

特权状态:可以访问所有资源;

非特权状态:某些资源是不能访问的。

两种模式/状态可以构成一个2*2矩阵。处理器启动后进入线程模式特权状态,可以手工切换到用户状态,可是无法切换回特权状态了!除非异常,进入处理模式,然后回到特权状态。

2. 堆栈介绍

包括主堆栈、进程栈。系统启动后,使用主堆栈。进入线程模式后,可以使用进程栈。异常使用主堆栈。

3. 寄存器,20个32位

R0~R12, 13个通用寄存器;

分组寄存器Banked,R13,用于指示堆栈顶部,堆栈是向下生长的;

连接寄存器R14(LR),用于存储返回地址;

程序寄存器PC,指示下一条指令地址;

XPSR,程序状态寄存器,A应用/I中断/E执行。

中断发生三步走:

1.现场自动保护。当异常发生时候,R0~R3,R12,LR,PC(如果当前是PSP就如PSP,否则如MSP,进入异常后,将使用MSP),xPSR入栈。

为什么仅仅保存了R0~R3,R12这几个通用寄存器,其它的通用寄存器就是下等公民?原因在于编译器优化ISR,一般会使用这几个寄存器,其它不用,所以不保存。如果用到了R4,编译器也会生产相应代码保存R4。

2.取中断向量。保护现场堆栈操作时,ICODE总线会根据中断向量表(DCODE完成查表操作),预取指。这儿可以体会到了专用总线的优点,多个事情可以同时进行。

3.更新寄存器。入栈会更新PSP/MSP到最新的位置,然后让SP=MSP。PSR存储当前的异常编号。PC指向入口地址。LR被更新位EXC_RETURN(仅有三个合法的值,异常的时候,栈保存的PC值为返回地址,LR作为PC返回地址仅用于子函数调用,异常LR指示返回状态)。

4.123完成后,开始执行服务例程。

中断返回。如果将EXC_RETURN写入到PC,就会开始中断返回操作。首先恢复现场,然后把NVIC的中断活动位置0。

疑问:既然有LR寄存器,为何需要保存PC值?

R14/LR存储子程序的返回地址。当程序调用时候,PC值为当前指令地址+4(应该在子程序里面吧),并不是返回地址,所以必须由LR保留返回地址!!

当异常发生时候,LR却不变化,此时PC存的返回地址是返回地址!!

所以,LR,PC这两个地址不是等价的,分别在子函数和异常中保留返回地址。

中断尾链异常:当中断运行过程中,碰到一个低优先级的ISR过来,该功能可以有用,加快了中断响应速度。

中断迟到异常:中断响应过程中,如果碰到高优先级的ISR过来,会现场保护完毕后,执行高优先级的ISR,然后运行完毕后,会尾链异常,切换到低优先级的ISR运行。如果,迟到太狠,就是中断嵌套了,且没有中断尾链异常!

4. 指令集

Cortex-M3支持16位的thumb指令和32位的thumb2指令。不支持ARM指令。

5. 系统控制寄存器

在内存空间固定分配,实现系统控制功能。

第三章STM32处理器总线结构和存储器

1 总线结构

Cortex-M3内核的Icode总线,Dcode总线,System总线,私有外设总线。

Icode总线:负责Flash取指(0x00000000~0x1FFFFFFF);

Dcode总线:负责Flash取数,查表(0x00000000~0x1FFFFFFF);

-----------------------------均小于SRAM地址,或者讲为block0区,大小512MB。System总线:负责访问外设和片上资源,包括SRAM,片上外设,外扩RAM,外扩外设,系统存储区的供应商定义部分;

私有外设总线:主要是访问调试专用的资源,位于系统存储区。

AHB:先进高性能总线,72MHZ。

APB:先进外设总线,APB2高速,72MHZ,APB1低速,36MHZ。

APB1:USB,UART2~3,CAN,I2C,BKP,WDG,TIM2~4,SPI2;

APB2:TIM1,UART1,SPI1,GPIOx,ADCx,EXIT;

2 存储器组织与映射

Cortex-M3采用统一编址方式,存储空间为4GB,小开端存放(引脚可配大开端)。分成8大块,每块都是512MB。这样,可以采用内存访问的方式去统一访问所有资源。

和PC一样,存储区最小单位为字节,但是总线和寄存器为32位,所以,一次就是取了4个字节。这就是为什么一个中断向量一下存4个字节,pc也是+4的原因。

片内Flash,起始地址为0x08000000;片内RAM为0x20000000(512MB)。

对于RAM和外设都有位带区和位带别名区,主要就是考虑方便位操作。

位带别名地址= 位带别名起始地址+ 位带区字节偏移地址*32 + 位偏移地址*4

两个位带区和对应的位带别名区,位带区大小为1MB,别名区大小为32MB。

位带区1:0x20000000~0x20100000 别名区1:0x22000000~0x23FFFFFF ←-------RAM使用位带区2:0x40000000~0x40100000 别名区2:0x42000000~0x43FFFFFF ←-------外设使用

将一位映射到一个字,所以从1MB扩带到了32MB。

外设区映射片上外设的寄存器,这样通过内存变量操作实现了外设控制。

系统启动有三处:Flash: 0x08000000 ~ 0x0807FFFF, 大小为0x80000, 512KB。

System memory: 0x1FFFF000~0x1FFFF7FF,大小为0x8000, 32KB。

(运行bootloader,用于系统程序更新,串口下载)

SRAM:0x20000000~0x2000FFFF,大小为0x10000,64KB。

通过对BOOT[0,1]引脚配置,实现Flash存储区/系统存储区/内嵌SRAM区启动选择,硬件会自动将选择的启动区映射到“系统启动区”。这样,都是从0x00000000的系统启动区开始运行,其实CODE的真实地址不是0x00000000。

注意:系统启动区0x0000000 ~ 0x0007FFFF,大小为三个区域的最大的512KB。该区域其实为上述三个区域的别名区。

STM32F103VC,Flash大小为256KB,SRAM位48KB。

3 系统启动配置

通过配置BOOT[0..1]引脚,实现启动区的映射,但是用以前的物理区地址也可以访问。也就是说某个空间可能有两个地址,和位段类似。

第四章Cortex-M3的异常处理

1 异常响应

Cortex-M3异常响应来讲,是非常迅速的。其中涉及了一些非常重要的技术。

1 现场自动保护与恢复。异常时,会自动保存某些寄存器,退出时,会自动恢复。

2 中断向量的获取(ICODE取址/DCODE查表)和现场保护(System RAM堆栈操作)同步。

3 中断嵌套和优先级分组。

4 中断尾链技术(减少了不必要的堆栈保护),中断迟到技术(让优先级高的后到先做)。

中断尾链:当一个ISR运行时候,另外一个低优先级的ISR到来,后来的会阻塞。当ISR 执行完毕后,不用恢复现场,而是让阻塞的ISR运行。减少了中断的开销。

中断迟到:特指ISR现场保护这段很短的时间,如果有个更高的优先级的中断到来,现场保护完毕后,是立马执行晚到的ISR。否则ISR运行过程中来,就是中断嵌套了。

中断响应时候,如果用的PSP,现场就保存于PSP,否则保存与MSP。不过进入ISR后,就会使用MSP。堆栈是“向下生长”的。每次中断嵌套就要加8个字的空间,嵌套过深,可能导致MSP溢出。

有个疑问:为什么尾链可以不保存,而嵌套必须保存。原因:中断嵌套发生于ISR正在运行,所以需要保护当前ISR的一些状态。而尾链发生于ISR执行完毕,故没有必要保护ISR状态。

2 系统启动详解

_main <> mail !!

_mail()由编译器自动生成,其内容包括两部分,第一是初始化系统资源,由编译器自动添加。第一步完毕后,才开始第二步:调用main()。

Startup文件首先是分配堆,栈的空间,并指明MSP的初始值。然后运行复位向量程序,先完成systeminit(),再调用_main()实现堆栈的初始化工作,最后才是main()应用程序。Cortex 复位是,会从启动区0x0000000获取MSP初始值,并由复位向量完成自动初始化工作,最终转向应用程序的运行。

LDR R0, = Heap_Mem 堆底

LDR R1, = (Stack_Mem + Stack_Size) 栈底

LDR R2, = (Heap_Mem + Heap_Size) 堆顶

LDR R3, = Stack_Mem 栈顶

中断向量表,主要存储中断例行程序的入口地址。读取中断向量的内容,就是程序的入口。里面不是跳转指令,仅仅是地址,所以要跳转到该地址去运行。如果取得该地址的指令运行后,程序也就开始运行了。

.bss存放程序中未初始化的全局变量

.data存放程序中已初始化的全局变量

.text 存放代码CODE

中断向量为于代码区的开始部分(Flash/SRAM),第一个是MSP的初始值,第二个是RESET 向量,指向复位ISR。

第5章MDK入门

RVMDK:RealView Microcontroller Development Kit。包括两个部分,一是keil公司的uVision 集成开发环境;二是RVCT编编译器;

库文件制作

作用:

1 保密安全需要;

2 方便,一个lib可以包含n多c文件,这样加一个lib相当于加入n多c文件;

3 节省空间。(每个独立的函数用一个c文件书写)

使用:

加入lib文件以及相应的h文件

第6章GPIO使用

一般引脚都是可复用的。共5组,A~E,每组16个引脚。16 * 5 = 80。默认是悬空输入模式。

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.360docs.net/doc/dc3482353.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();

相关文档
最新文档