#启动文件与容量的对应关系:
#GPIO端口:
#IO口输入保护二极管电路:
当输入电压超过时VDD上述二极管导通时,I/O引脚被钳位成VDD;当输入电压低于时VSS以下二极管导通,I/O引脚被钳位成VSS... 总之,输入电源总是位于VDD到VSS之间。
GPIO操作相关寄存器:
1, GPIOx_CRL 配置寄存器 32bit
2, GPIOx_CRH 配置寄存器 32bit
3, GPIOx_IDR 数据寄存器 32bit
4, GPIOx_ODR 数据寄存器32Bit(输出寄存器只能整体操作寄存器)
5, GPIOx_BSRR 位置复位寄存器 32bit(可以对每一个ODR独立设置/清除位置)
6, GPIOx_BRR 复位寄存器16bit
7, GPIOx_LCKP 锁定寄存器 32bit[孟永志1]
|
所有GPIO口腔内部有弱上拉和弱下拉,但当配置为输入时,可以激活或断开。
IO输入配置:
#网友详细说明
http://jingyan.baidu.com/article/3065b3b698a6aabecff8a4cd.html
IO口的输出配置:
重点:
#当IO当口配置为输出模式时:
1, 出现在IO每个脚上的数据APB采样2小时,输入数据寄存器
2, 在泄漏模式下,可以访问输入数据寄存器IO口的状态
#复用输出配置:
#网友详细说明
http://jingyan.baidu.com/article/5d6edee2f873f899eadeecff.html
#如何在输出模式下准确获得?IO外部电平信号:
只有泄漏输出/复用开漏输出时,当输出时1时,NMOS此时管道关闭IO信号完全由外部信号决定,读取IO输入信号。其他时间读取的输入信号不准确,受输出影响。(推拉输出/复用推挽输出)
#当IO口开漏输出时:不能够使用5V上拉电阻将IO上拉至5V,因为IO口有保护二极管电路,点钳位于Vdd 二极管压降,Vss-二极管压降。
时钟系统:
1, HIS RC:内置高速RC振荡器, 8M, 不精确, 一般不用;
2, LSI RC: 内部低速RC振荡器 40k 不精确
3, HSE Osc: 外部高速晶振 4~16M
4, LSE Osc : 外部低速晶振, 32.768k
5, PLL:锁相环, 倍频输入频率72M为PLLCLK,供SYSCLK选择。
#核心时钟模块:
SYSCLK: 系统时钟(来源:HIS,PLL,HSE,HSE)<css:监视器,一旦HSE失效,即改时钟为HSI>
#SYSCLK系统时钟分配:
1, AHB预分频器:可以对SYSCLK时钟进行分频
2, APB1 预分频器:
3,APB2 预分频器:
4,USB 预分频器:
………………………………
#STM32系统架构:
ARM体系结构:Advanced RISCMachines
#驱动单元:
Icode总线:
我们写好的程序写好后通过编译都变成一条条指令存储在外设的FLASH里面,内核要读取这些指令来执行程序就必须通过Icode总线(专门用来取指)。
Dcode总线与DMA总线:
即为DATA,我们知道常量const存放在内部FLASH里面,而变量存在内部SRAM里面。这些数据可以由DCode和DMA来读取,为了避免两者同时去读取数据从而造成冲突,所以在两者读取数据的时候会有一个总线矩阵来裁定谁来读取数据。
System总线:
读取数据,最主要还是用来访问外设的寄存器,即读写寄存器都是通过这条总线来完成的。
DMA总线:
说先说这条总线也是主要传输数据的,这个数据可以是某个外设的数据寄存器,可以是SRAM,可以是内部的FLASH 。
#被动单元
FLASH:
程序存储器
SRAM:
静态存储器
FSMC:
外部RAM总线
AHP:
高速总线
#STM32储存映像
#启动文件的作用:
设置堆栈指针、设置PC指针、初始化中断向量表、配置系统时钟、调用C程序的main()函数执行C代码。
#STM32固件库:
https://wenku.baidu.com/view/0bb4cf24647d27284b735149.html
#内核之外的寄存器的映射:
Stm32f10x.h: 实现了内核之外的外设的寄存器映射
#时钟配置文件:
System_stm32f10x.c:上电后初始化时钟、拓展外部存储器
#外设驱动:
Stm32f10x_xx.c: 外设驱动的库函数文件
Stm32f10x_xx.h: 存放外设初始化结构体和初始化结构体成员的参数列表,外设固件库函数的声明
#内核外设:
Core_cm3.h: 实现了内核里面的寄存器的映射
Core_cm3.c: 实现了一些操作内核外设的函数(用的比较少)
#Misc.h: NCIV(嵌套向量中断控制器)、systic(系统滴答定时器)
Misc.c:这个文件提供了外设对内核中NVIC(中断向量控制器)的访问函数,用于配置中断。
#头文件配置文件:
Stm32f10x_conf.h: 所有外设的头文件都包含在其中
#专门存放中断服务函数的文件:
Stm32f10x_it.c
Stm32f10x_it.h
//中断服务函数可以随便放在其他任何地方。
#stm32位带操作
STM32位带区的一个位在位带别名区膨胀为4个字节,两个位带别名区分别是SRAM的最低1M、片内外设的最低1M,所有的片内外设寄存器地址映射均在片内外设地址的最低1M空间内,所以可以对所有的寄存器进行“位寻址”操作。
#由位带区想要操作寄存器的n位及其寄存器地址addr,可以通过统一的公式找到别名去对应的4个字节的起始地址:
ADDR=((addr&0xf0000000)+0x02000000+((addr&0x00ffffff)<<5)+(n<<2))
#库函数编程学习:
#启动文件选择:
#RCC
RCC是STM32的时钟控制器,可开启或关闭各总线的时钟,在使用各外设功能必须先开启其对应的时钟,没有这个时钟内部的各器件就不能运行。
#RCC寄存器
1, RCC_CR: 时钟控制寄存器:各个时钟的使能、准备就绪等
2,RCC_CFGR:时钟配置寄存器:各个预分频器的输入时钟选择、各个预分频器的分频因子
3,RCC_CIR :时钟中断寄存器:中断使能
5,
6,
8,外设时钟使能寄存器
9,备份域控制寄存器
控制状态寄存器
外设时钟复位寄存器
12,时钟配置寄存器
#stm32f10x.h:
1,定义结构体类型,用定义的类型将下面定义的各外设的基址指针化供之后操作。
1, 给各外设地址取宏名
2, 将宏名代表的地址用结构体指针化
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
#操作寄存器的方法:
GPIOA->CRL = 0x00000000 çè((GPIO_TypeDef *) GPIOA_BASE) = 0x00000000
3, Bit definition for XXX register,使用宏来替换各个寄存器中的值来配置各个寄存器,使用宏名便于观察理解,不易出错。(宏数据的位数取决于寄存器的位数)
#Systic:系统定时器(寄存器)
1, CTRL : SysTick寄存器
2, LOAD : Systic重装载值寄存器
3, VAL : SysTic 当前值寄存器
4, CALIB : Systic校准值寄存器
#由于Systick是挂载在内核上的,所以只要内核有时钟,直接配置Systick相关的寄存器就可以开始工作了;
#与Systick相关的函数有两个:
库里SysTick相关的函数我们能找到两个
一个在msic.h中
voidSysTick_CLKSourceConfig(uint32_t SysTick_CLKSource) { /* Check the parameters */ assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource)); if (SysTick_CLKSource == SysTick_CLKSource_HCLK) { SysTick->CTRL |= SysTick_CLKSource_HCLK; } else { SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8; } }
一个在core_m3.h中
static__INLINE uint32_t SysTick_Config(uint32_t ticks) { if (ticks >SysTick_LOAD_RELOAD_Msk) return(1); /* Reload value impossible */ SysTick->LOAD =(ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* setreload register */ NVIC_SetPriority(SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
/*set Priority for Cortex-M0 System Interrupts */ SysTick->VAL =0; /*Load the SysTick Counter Value */ SysTick->CTRL =SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ return(0); /* Function successful */ }
我们一般只需要后一个就可以了
需要的操作在SysTick_Handler()中添加就好了,意思每到加载到SysTick中的值减到0时就执行SysTick();
在 SysTick_Config()库函数还调用了固件库函数 NVIC_SetPriority()来配置系统定时器的中断优先级,该库函数也在 core_m3.h 中定义,原型如下:
__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) 2 { 3 if ((int32_t)IRQn < 0) { 4 SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = 5 (uint8_t)((priority << (8 - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); 6 } else { 7 NVIC->IP[((uint32_t)(int32_t)IRQn)] = 8 (uint8_t)((priority << (8 - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); 9 } 10 }
#启动文件简介 启动文件由汇编编写,是系统上电复位后第一个执行的程序。主要做了以下工作:
1, 初始化堆栈指针SP=_initial_ap
2, 初始化PC指针=Reset_Handler
3, 初始化中断向量表
4, 配置系统时钟
5, 调用C库函数_main()初始化用户堆栈,从而最终调用 main 函数去到 C 的世界;
#STM32中断(中断即异常)
#CM3内核支持256个中断,其中有16个内核中断和240个外部中断,并且具有256级的可编程中断设置;
Stm32并没有使用到,有16个内核中断和86个外部中断,具有16级可编程中断;stm32f103的更少。
#NVIC和EXTI的关系:
NVIC(管理内核外设和片上外设所有的功能):具体描述在CM3手册
寄存器:
1, 使能与除能寄存器
2, 悬起与“解悬”寄存器
优先级寄存器
抢断优先级;
亚优先级:
4, 活动状态寄存器
5, 外部中断/事件控制器(EXTI;
GPIO 的管教 GPIOx.0~GPIOx.15(x=A,B,C,D,E, F,G)分别对应中断线 0~15。这样每个中断线对应了最多 7 个 IO 口,以线 0 为例:它对应了 GPIOA.0、 GPIOB.0、 GPIOC.0、 GPIOD.0、GPIOE.0、 GPIOF.0、 GPIOG.0。而中断线每次只能连接到 1 个 IO 口上,这样就需要通过配置来决定对应的中断线配置到哪个GPIO 上了。
1, voidGPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) 该函数将GPIO 端口与中断线映射起来
//初始化结构体:
typedef struct { uint32_t EXTI_Line; //第一个参数是中断线的标号,取值范围为 EXTI_Line0~EXTI_Line15
EXTIMode_TypeDef EXTI_Mode; //(第二个参数是中断模式,可选值为中断EXTI_Mode_Interrupt 和事件 EXTI_Mode_Event。)
EXTITrigger_TypeDef EXTI_Trigger; //第三个参数是触发方式,可以是下降沿触发EXTI_Trigger_Falling,上升沿触发 EXTI_Trigger_Rising,或者任意电平(上升沿和下沿) 触发EXTI_Trigger_Rising_Falling,
FunctionalState EXTI_LineCmd; 最后一个参数就是使能中断线 了。
}EXTI_InitTypeDef;
#EXTI寄存器
1, 中断屏蔽寄存器
2, 事件屏蔽寄存器
3, 上升沿触发选择寄存器
4, 下降沿触发选择寄存器
5, 软件中断事件寄存器
6, 挂起寄存器
7, 外部中断事件寄存器映像
8, STM32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组位一个单位的,同组间的外部中断同一时间只能使用一个。比如说,PA0,PB0,PC0,PD0,PE0,PF0,PG0这些为1组,如果我们使用PA0作为外部中断源,那么别的就不能够再使用了,在此情况下,我们只能使用类似于PB1,PC2这种末端序号不同的外部中断源。每一组使用一个中断标志EXTIx。
9, EXTI0 – EXTI4这5个外部中断有着自己的单独的中断响应函数,
10, EXTI5-9共用一个中断响应函数,
11, EXTI10-15共用一个中断响应函数。
#
1, 事件控制寄存器
2, 复用重映射和调试配置寄存器
3, 外部中断配置寄存器
4, 外部中断配置寄存器
5, 外部中断配置寄存器
6, 外部中断配置寄存器
#USART串口:
#寄存器:
1, 状态寄存器
2, 数据寄存器
3, 波特比率寄存器
4, 控制寄存器
5, 控制寄存器
6, 控制寄存器
7, 保护时间和预分频寄存器
波特率计算值公式:
波特率=Fckl/(16*USARTDIV)
USARTDIV写入到一个寄存器,USART_BRR[11:0][3:0]带小数
#串口中断标志:
#TC:
:发送完成 (Transmission complete) 当包含有数据的一帧发送完成后,并且TXE=1时,由硬件将该位置’1’。如果USART_CR1中的TCIE为’1’,则产生中断。由软件序列清除该位(先读USART_SR,然后写入USART_DR)。 TC位也可以通过写入’0’来清除,只有在多缓存通讯中才推荐这种清除程序。 0:发送还未完成; 1:发送完成 |
#RXEN:
:读数据寄存器非空 (Read data register not empty) 当RDR移位寄存器中的数据被转移到USART_DR寄存器中,该位被硬件置位。如果 USART_CR1寄存器中的RXNEIE为1,则产生中断。对USART_DR的读操作可以将该位清 零。 RXNE位也可以通过写入0来清除,只有在多缓存通讯中才推荐这种清除程序。 0:数据没有收到; 1:收到数据,可以读出。 |
模拟数字转换
表62 ADC引脚
名称 |
信号类型 |
注解 |
VREF+ |
输入,模拟参考正极 |
ADC使用的高端/正极参考电压, 2.4V ≤ VREF+ ≤ VDDA |
VDDA(1) |
输入,模拟电源 |
等效于VDD的模拟电源且: 2.4V ≤ VDDA ≤ VDD(3.6V) |
VREF- |
输入,模拟参考负极 |
ADC使用的低端/负极参考电压, VREF- = VSSA |
VSSA(1) |
输入,模拟电源地 |
等效于VSS的模拟电源地 |
ADCx_IN[15:0] |
模拟输入信号 |
16个模拟输入通道 |
1. VDDA和VSSA应该分别连接到VDD和VSS。
通过设置ADC_CR2寄存器的ADON位可给ADC上电。当第一次设置ADON位时,它将ADC从断电状态下唤醒。ADC上电延迟一段时间后(tSTAB),再次设置ADON位时开始进行转换。通过清除ADON位可以停止转换,并将ADC置于断电模式。
寄存器
状态寄存器
控制寄存器
控制寄存器
采样时间寄存器
采样时间寄存器
注入通道数据偏移寄存器
看门狗高阀值寄存器
看门狗低阀值寄存器
规则序列寄存器
规则序列寄存器
规则序列寄存器
#ADC 工作参数具体配置为:独立模式、单通道采集不需要扫描、启动连续转换、使用内部软件触发无需外部触发事件、使用右对齐数据格式、转换通道为1,并调用 ADC_Init函数完成 ADC 工作环境配置
#RCC_ADCCLKConfig()函数用来配置 ADC 的工作时钟,接收一个参数,设置的是PCLK2的分频系数,ADC 的时钟最大不能超过 14M。
#ADC_RegularChannelConfig 函数用来绑定 ADC 通道的转换顺序和采样时间。它接收 4个形参,第一个形参选择 ADC外设,可为ADC1、 ADC2或 ADC3;第二个形参通道选择,总共可选 18 个通道;第三个形参为通道的转换顺序,可选为1 到 16;第四个形参为采样周期选择,采样周期越短, ADC 转换数据输出周期就越短但数据精度也越低,采样周期越长,ADC 转换数据输出周期就越长同时数据精度越高。
#ADC_Cmd 函数控制 ADC 转换启动和停止。最后,在 ADC校准之后调用 ADC_SoftwareStartConvCmd函数进软件触发 ADC开始转换
#我们使用 ADC_ITConfig 函数使能 ADC 转换完成中断,并在中断服务函数中读取转换结果数据
#ADC校准可以使数据更加准确
#DMA:把数据从一个地方搬到另外一个地方
寄存器
1, 中断状态寄存器
中断标志清除寄存器
中断标志清除寄存器
中断标志清除寄存器
通道配置寄存器
通道传输数量寄存器
通道外设地址寄存器
9, 通道存储器地址寄存器
DMA 具有 12 个独立可编程的通道,其中 DMA1 有 7 个通道, DMA2 有 5 个通道,每个通道对应不同的外设的 DMA 请求。虽然每个通道可以接收多个外设的请求,但是同一时间只能接收一个,不能同时接收多个。
#通道优先级:
当发生多个 DMA 通道请求时,就意味着有先后响应处理的顺序问题,这个就由仲裁 器也管理。仲裁器管理 DMA 通道请求分为两个阶段。第一阶段属于软件阶段,可以在 DMA_CCRx 寄存器中设置,有 4 个等级:非常高、高、中和低四个优先级。第二阶段属于硬件阶段,如果两个或以上的DMA 通道请求设置的优先级一样,则他们优先级取决于通道编号,编号越低优先权越高,比如通道 0 高于通道 1。在大容量产品和互联型产品中,DMA1 标签: 2cr3z集成电路