资讯详情

stm32学习笔记

#启动文件与容量的对应关系:

#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集成电路

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台