STM32常见应用分析

更新时间:2023-06-09 03:33:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

STM32常见应用分析 arm 单片机 时钟 入门 深入

STM32F10x 常见应用解析

2008年9月

STM32

全国巡回研讨会

STM32常见应用分析 arm 单片机 时钟 入门 深入

系统时钟的监控和切换

起因:

在实际应用中,经常出现由于晶体振荡器在运行中失去 作用,造成微处理器的时钟源丢失,从而出现死机的现 象,导致系统出错。

严重时,由于系统的死机造成监控失效, 导致无法挽回的损失!

目的:

STM32作为一个可靠稳定的微处理器,但是不能排除 由于某些外界特殊因素可能造成STM32的外部振荡器 失效,所以在芯片中需要一种包含机制能够在STM32 运行时,一旦外部晶体振荡器(HSE)失效,切换

STM32的系统时钟源到一个稳定的时钟源,以保证 STM32能够继续运行,并进行相应的保护操作。

2

STM32常见应用分析 arm 单片机 时钟 入门 深入

系统时钟的监控和切换

时钟安全系统(CSS)系统原理:

时钟安全系统被激活后,时钟监控器将实时监控外部高速振荡器;如 果HSE时钟发生故障,外部振荡器自动被关闭,产生时钟安全中断, 此中断被连接到Cortex-M3的NMI的中断;与此同时CSS将内部RC 振荡器切换为STM32的系统时钟源。(对于STM32F103,时钟失效 事件还将被送到高级定时器TIM1的刹车输入端,用以实现电机保护

8MHz

控制)

HSI RC

÷2

SYSCLK

x2...x16 PLLCLK PLL up to

÷2 72 MHz

OSC_OUT OSC_IN 4 -16 MHz

HSE Osc

CSS

注意:一旦CSS被激活,当HSE时钟出现故障时将产生CSS中断,同时自动产生

NMI。NMI将被不断执行,直到CSS中断挂起位被清除。因此,在NMI的处理程序中 必须通过设置时钟中断寄存器(RCC_CIR)里的CSSC位来清除CSS中断。

3

STM32常见应用分析 arm 单片机 时钟 入门 深入

系统时钟的监控和切换(应用举例)

启动时钟安全系统CSS:

RCC_ClockSecuritySystemCmd(ENABLE);

(NMI中断是不可屏蔽的!)

外部振荡器实现时,产生中断,对应的中断程序:

void NMIException(void) {

if (RCC_GetITStatus(RCC_IT_CSS) != RESET)

// HSE、PLL已被禁止(但是PLL设置未变) {

// 客户添加相应的系统保护代码处

// 下面为HSE恢复后的预设置代码

RCC_HSEConfig(RCC_HSE_ON); // 使能HSE

RCC_ITConfig(RCC_IT_HSERDY, ENABLE); // 使能HSE就绪中断 RCC_ITConfig(RCC_IT_PLLRDY, ENABLE); // 使能PLL就绪中断

RCC_ClearITPendingBit(RCC_IT_CSS); // 清除时钟安全系统中断的挂起位 // 至此,一旦HSE时钟恢复,将发生HSERDY中断,在RCC中断处理程序里, 系统时钟可以设置到以前的状态 } }

在RCC的中断处理程序中,再对HSE和PLL进行相应的处理。

4

STM32常见应用分析 arm 单片机 时钟 入门 深入

实现软件的短时间延迟

在进行开发时,程序中常常需要延时一段时间,很多 人都会使用Delay(N),N为需要延时的时间(通常为 毫秒级)。

通常实现Delay(N)函数的方法为:

for(i = 0; i <= x; i ++);

x --- 对应于N毫秒的循环值

对于STM32系列微处理器来说,执行一条指令只有 几十个ns,进行for循环时,要实现N毫秒的x值非常 大,而且由于系统频率的宽广,很难计算出延时N毫 秒的精确值。

针对STM32微处理器,需要重新设计一个新的方法 去实现该功能,以实现在程序中使用Delay(N)。

5

STM32常见应用分析 arm 单片机 时钟 入门 深入

应用SysTick实现短时延迟

Cortex-M3的内核中包含一个SysTick时钟。SysTick 为一个24位递减计数器,SysTick设定初值并使能后, 每经过1个系统时钟周期,计数值就减1。计数到0时, SysTick计数器自动重装初值并继续计数,同时内部的 COUNTFLAG标志会置位,触发中断(如果中断使能)。

在STM32的应用中,使用Cortex-M3 内核的SysTick作为定时时钟,设定每 一毫秒产生一次中断,在中断处理函数 里对N减一,在Delay(N)函数中循环检 测N是否为0,不为0则进行循环等待; 若为0则关闭SysTick时钟,退出函数。

延迟时间将不随系统时钟频率改变。

6

STM32常见应用分析 arm 单片机 时钟 入门 深入

应 用SysTick 举 例

初始化相关模块:

SysTick_SetReload(9000); SysTick_ITConfig(ENABLE);

// 设定SysTick达到1ms计数结束 // 使能SysTick中断

中断处理:

void SysTickHandler (void) {

if (TimingDelay != 0x00) TimingDelay--; }

全局变量TimingDelay

必须定义为volatile

延时代码:

void Delay(u32 nTime) {

SysTick_CounterCmd(SysTick_Counter_Enable); TimingDelay = nTime;

while(TimingDelay != 0);

SysTick_CounterCmd(SysTick_Counter_Disable); SysTick_CounterCmd(SysTick_Counter_Clear); }

条件:外部晶振为8MHz,系统时钟为 72MHz,SysTick的频率9MHz, SysTick产生1ms的中断。

// 使能SysTick计数器 // 读取延时时间

// 判断延时是否结束 // 关闭SysTick计数器 // 清除SysTick计数器

应用代码:

Delay(300);

// 延时 300ms

7

STM32常见应用分析 arm 单片机 时钟 入门 深入

如何重新启动DMA传输

方案一:使用DMA的循环模式。

的寄存器,法如下

第一次DMA输配置为普通模式,然从第二次开①② ③④⑤STM32 方案二:重新配置部分DMA

始:

清除ENABLE位(DMA_CCRx寄存器),关闭DMA通道

如果DMA中的外设地址是递增的, 重新设置外设地址(DMA_CPARx寄存器)

如果DMA中的存储器地址是递增的, 重新存储器外设地址(DMA_CMARx寄存器)

重新设置数据传输数目(DMA_CNDTRx寄存器)

设置ENABLE位,从新使能DMA(DMA_CCRx寄存器)

全国巡回研讨会

常见应用解析

2008年9月 15

STM32常见应用分析 arm 单片机 时钟 入门 深入

DMA的概念

DMA是Direct Memory Access的首字母缩写。它的作用 是不需要经过CPU而进行数据传输。

DMA控制器可以代替CPU驱动产生数据访问的地址并执行数据的 读出和写入操作。

DMA传输有三大要素:

传输源:DMA控制器从传输源读出数据; 传输目标: DMA控制器将数据传输的目标;

触发信号:用于触发一次数据传输的动作,执行一个单位的传输源 至传输目标的数据传输;可以用来控制传输的时机。

STM32的DMA特征

传输源和传输目标可以分别是存储器和/或片上外设,源和目标可 以同为存储器或同为片上外设; 一次数据传输的单位可以为:8位、16位或32位 数据传输的触发信号由硬件确定,不能更改

STM32常见应用分析 arm 单片机 时钟 入门 深入

STM32 全国巡回研讨会

常见应用解析

2008年9月 16

STM32常见应用分析 arm 单片机 时钟 入门 深入

DMA触发源解读

设备

ADC1 SPI/I2S USART I2C TIM1 TIM2 TIM3 TIM4

TIM4_CH1 TIM2_CH3

通道1

ADC1

通道2

SPI1_RX USART3_TX

通道3

SPI1_TX USART3_RX

通道4 通道5 通道6 通道7

USART2_TX I2C1_RX

TIM1_CH1 TIM2_UP TIM3_CH3

TIM1_CH2

SPI/I2S2_RX SPI/I2S2_TX

USART1_TX USART1_RX USART2_RX I2C2_TX I2C2_RX I2C1_TX TIM1_CH4 TIM1_TRIG TIM1_UP TIM1_CH3 TIM1_COM

TIM2_CH1

TIM2_CH2 TIM2_CH4

TIM3_CH1 TIM3_TRIG

TIM3_CH4 TIM3_UP

TIM4_CH2

TIM4_CH3

TIM4_UP

ADC1、TIM2_CH3、TIM4_CH1的DMA请求复用同一个通道,他们 不能同时使用

定时器的各个通道不是使用的同一个DMA请求通道,而且不是所有通 道都能触发DMA请求,例如:

TIM4的通道1、2、3和更新事件才有DMA请求

TIM3的通道1、2、3、触发和更新事件才有DMA请求 STM32 全国巡回研讨会

常见应用解析

2008年9月 17

STM32常见应用分析 arm 单片机 时钟 入门 深入

DMA配置实例

在这个例子中使用了DMA通道6:

DMA请求(触发)源是定时器3

DMA数据源是GPIO输入寄存器/DMA目标是RAM中的缓冲区

设置外设地址:DMA_CPAR6 = (u32)&GPIOD->IDR

设置存储器地址 : DMA_CMAR6 = (u32) Parallel_Data_Buffer

设置数据传输数目 : DMA_CNDTR6 = 512

配置 DMA_CCR6 寄存器:

存储器数据宽度 = 半字 (16位) DMA 模式 = 循环 外设数据宽度 = 半字 (16位) 通道优先级 = 非常高 外设地址递增 = 无递增 中断 = 禁止 存储器地址递增 = 自动递增

传输方向 = 外设地址为传输的源地址

设置DMA_CCR6寄存器中的ENABLE位,启动传输通道

开启DMA请求:设置TIM3_DIER寄存器中的TDE位

STM32 全国巡回研讨会

常见应用解析

2008年9月 18

STM32常见应用分析 arm 单片机 时钟 入门 深入

STM32的内部温度传感器

STM32集成了片上的温度传感器,可以用来测量芯片内部 的温度;

STM32内部温度传感器与ADC的通道16相连,与ADC配 合使用实现温度测量; 测量范围-40~125℃,精度 ? 1.5℃。

TSVREFE控制位

内部地

址数

温度 传感器 内部 电源模块

VSENSE

ADC1_IN16

转换后的数据

ADC模块

VREFINT

ADC1_IN17

巡回研讨会

STM32 全国

STM32常见应用分析 arm 单片机 时钟 入门 深入

常见应用解析

2008年9月 19

STM32常见应用分析 arm 单片机 时钟 入门 深入

使用STM32的内部温度传感器

配置步骤:

1. 设置ADC相关参数

// ADC1 configuration ----------------------------- ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = ENABLE;

ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure);

2. 选中ADC1的通道16作为输入 3. 设置采样时间17.1 us

4. 设置寄存器ADC_CR2中的TSVREFE位激活温度传感器

Ncycle ?tADC = 17.1祍

// ADC1 regular channel16 Temp Sensor configuration

ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_55Cycles5); // Enable the temperature sensor and vref internal channel ADC_TempSensorVrefintCmd(ENABLE);

STM32 全国巡回研讨会

常见应用解析

2008年9月 20

STM32常见应用分析 arm 单片机 时钟 入门 深入

温度数值计算

ADC转换结束以后,读取ADC_DR寄存器中的结果,通过

下面的公式计算

V25:温度传感器在25℃时 的输出电压,典型值1.43 V

VSENSE:温度传感器的当前输出电压,与ADC_DR 寄存器中的结果ADC_ConvertedValue之间的转换 关系为:

ADC_ConvertedValue * Vdd

VSENSE =

Vdd_convert_value(0xFFF)

25

SENSE

T(℃) = V - V

Avg_Slope 转换程序

+ 25

Avg_Slope:温度传感器输出电压和 温度的关联参数,典型值4.3 mV/℃

Vtemp_sensor = ADC_ConvertedValue * Vdd / Vdd_convert_value; Current_Temp = (V25 - Vtemp_sensor)/Avg_Slope + 25;

STM32 全国巡回研讨会

常见应用解析

2008年9月 21

STM32常见应用分析 arm 单片机 时钟 入门 深入

RTC系统框图

配置RTCCLK以及RTC_DIV,使得 预分频器产生频率为1秒的秒脉冲

(TR_CLK),作为RTC的时钟基准。 32位的RTC计数器,以1秒的频率进 行计数, 可以持续长达 32

2 = 4*1024*1024*1024 (秒) = 49710 (天) = 136 (年) RTC系统的供电

处于备份区域:即系统掉电后,只

要有外部电池供电,该区域的功能

可以继续工作;

只要一直有电池供电,RTC的计数

器持续计数,由此可以计算出

HSE晶振 LSI RC

LSE晶振 或 外部时钟

RTCSEL

RTC闹钟

[1:0]

1/128

RTC预分频 加载寄存器

=

RTC计数器

RTC分频器

实时 的时间。

RTC 控制器寄存器 (CR)

STM32常见应用分析 arm 单片机 时钟 入门 深入

备份供电区域

秒中断 溢出中断 闹钟中断

TR_CLK

STM32 全国巡回研讨会

常见应用解析

2008年9月 22

STM32常见应用分析 arm 单片机 时钟 入门 深入

使用RTC制作万年历

初始化系统时钟

上电后初始化系统时钟 配置RTC

使能PWR和BKP模块的时钟 使能对备份区域的访问

STM32 全国巡回研讨会

检查预定义的标记判断RTC是否曾经设置过

预定义的标记设置在备份区域的备份寄存器,不受系统 掉电的影响

如果RTC未曾设置过,则初始化RTC模块:

时钟源LSE

秒中断的产生

设置RTC计数器

以一个基准作为时间原点

例如RTC计数值为0时表示:2008年1月1日 0:0:0 输入当前年/月/日/时/分/秒 ? 计算离时间原点的秒数 显示时间

根据当前RTC计数器的值,得到现在距时间原点的秒

数,反算出当前的年/月/日/时/分/秒。

STM32常见应用分析 arm 单片机 时钟 入门 深入

和RTC时钟

第一次设置RTC?

(查询标记)

配置RTC(产生秒中断)

设置当前时间

(年/月/日/小时/分/秒) 以此作为RTC计数器的初值

设置标记

计算并 显示时间

秒中断 循环

2008年9月 23

STM32常见应用分析 arm 单片机 时钟 入门 深入

校准实时时钟RTC

需求

嵌入式系统使用的实时时钟精度要求高 RTC晶振精度远远高于传统振荡器,精度可达到ppm级 受到温度等因素影响,晶振的精度会出现波动

对MCU提出了RTC时钟校准的要求

传统校准手段:调节晶振的负载电容

缺点:需要外部器件,可能增加晶振的功耗

STM32中设置了BKP_RTCCR寄存器, 实现软件校准

优点:软件校准,灵活性高,易于使用

本文来源:https://www.bwwdw.com/article/bi21.html

Top