STM32第一阶段总结

评论

浮动输入_IN_FLOATING:浮动输入的io口电压完全由外部设备决定,一般用于按键检测。

带上拉输入_IPU:默认高电平

带下拉输入_IPD:默认低电平

模拟输入_AIN:模拟输入

开漏输出_OUT_OD:只能输出低电平。如果要输出高电平,需要外接上拉电阻。

推挽输出_OUT_PP:比较常用的输出方式,可以输出高电平和低电平

开漏复用output_AF_OD:连接到外设的输出

推挽复用output_AF_PP:连接外设的输出

1.2 相关寄存器

注册配置库函数:

GPIO_Init 根据GPIO_InitStruct 中指定的参数初始化外设。 GPIOx 寄存器GPIOx-CRL:配置端口寄存器。该寄存器由32 位组成。每四位控制一个端口,对应IO口的0-7脚。只需配置您需要使用的引脚即可。可以直接使用寄存器进行操作,并使用位操作对需要设置的位进行清零或设置。设置前需要清除相应的四位。也可以直接使用库函数进行操作。具体操作请查阅说明书。

1.3 时钟

启用时钟库函数:

RCC_AHBPeriphClockCmd 启用或禁用AHB 外设时钟。 RCC_APB2PeriphClockCmd 启用或禁用APB2 外设时钟。 RCC_APB1PeriphClockCmd 启用或禁用APB1 外设时钟。 stm32内部有四个时钟源,通过不同的倍频和分频得到。我们需要的频率。系统时钟为72Mhz。使用HSE并乘以9得到HSE*9=72。

时钟源:

HSE:外部高速时钟4-16MHz(8MHz)

LSE:外部低速时钟32.768KHz RTC

HSI:内部高速时钟8MHz

LSI:内部低速时钟40KH

2. 中断

2.1 中断相关概念

中断源:固定可以产生中断

中断优先级:决定中断执行的顺序。数字越小,中断优先级越高。由抢占优先级和响应优先级决定。

中断响应:内核收到中断请求,内核执行中断服务函数。

中断挂起:内核收到中断请求,内核不执行中断服务函数。

中断服务函数:中断产生后,内核需要执行代码(自己写的)

2.2NVIC嵌套向量中断控制

NVIC配置库函数:

NVIC_Init 根据NVIC_InitStruct 中指定的参数初始化外设。 NVIC寄存器NVIC是stm32用来管理异常的系统。它可用于管理中断,包括设置优先级、设置优先级组和确定要使用的中断。

stm32中默认的中断分组为00 00:前两位为抢占优先级,后两位为响应优先级;

2.3 外部中断

外部中断配置库函数:

EXTI_Init 根据EXTI_InitStruct EXTI 寄存器中指定的参数初始化外设EXTI_GetITStatus 检查指定的EXTI 线触发请求是否发生EXTI_ClearITPendingBit 清除EXTI 线挂起位

中断源:

68个可屏蔽中断终端通道

16 个可编程中断优先级

外部中断触发控制器,触发方式分为上升沿触发和下降沿触发。

设置中断的一般步骤

1.配置管脚输入模式

2.EXTI配置

3.NVIC配置

4.编写中断服务函数

3.串口同步收发器-ustart

3.1 通讯分类

单工通讯:设备只能发送或只能接收-广播-无线电

半双工通讯:同一时间只能接收或发送——对讲机/IIC等。

全双工通信:可以同时发送和接收——uar

3.2RS232通讯协议

起始位+数据位+奇偶校验位+停止位个数1 5~8 0~1 1~2 Level 0 0/1 0/1 1 起始位:产生一个下降沿,通知接收设备准备接收数据。数据位:7/8位--以单位/ascii码为单位存储字节--8位是主要奇偶校验位: 奇偶校验--确定数据传输过程中是否出现错误--一般不使用(现在使用CRC校验)数据位中1的个数+奇偶校验位中1的个数。奇校验:位数必须为奇数。偶校验:位数必须为偶数。停止位:1~2位,高电平

3.3 波特率的计算

PCLK2 -- APB2 时钟-- 72MHz

公式中已知量:fck和波特率

求USARTDIV=fck/(波特率*16)

例如:假设波特率为9600

USARTDIV=468.7

USARTDIV的值可以在寄存器USART_BRR中设置

3.4 串口发送和接收数据相关的库函数

USART_Init 根据USART_InitStruct 中指定的参数初始化外设USARTx 寄存器USART_Cmd 启用或禁用USART 外设USART_SendData 通过外设USARTx 发送单个数据USART_ReceiveData 返回USARTx 最近接收到的数据USART_GetFlagStatus 检查指定的USART 标志位是否置位串口通信的获取基本步骤

配置GPIO端口

配置USTART串口:

打开USART1的时钟

USART1:全双工,RS232协议+波特率

启用串口

编写基本的发送和接收函数;

4.滴答定时器

Tick定时器:内核中的定时器

4.1 定时器的组成

时钟源:系统时钟72MHZ

参考时钟:通过分频器得到,除以72为1MHZ,不分频为72MHZ。

计数器:向上或向下计数

重载值:指定最大计数值

4.2 定时器实现相关函数

SysTick_Config(72000);//Tick定时器初始化,内核中定义的函数,实现ms级延迟重载值填充72000,实现ms级延迟重载值填充72,使用tick定时器实现精确ms延迟的方法

void SysTick_Handler(void)//Tick定时器中断函数,每1ms触发一次,由初始化函数决定{Sys_Time++;}void Sys_Delay_Ms(uint32_t time)//实现ms精确延时{uint32_t x_time=Sys_Time;//记录当前时间while (Sys_Time=(x_time+time));//循环}4.3 Timer实现非阻塞编程

阻塞和非阻塞是指调用者(程序)在等待返回结果(或输入)时的状态。阻塞时,当前线程在调用结果返回之前会被挂起,在获得结果之后才会返回。非阻塞时,如果不能立即获得结果,调用者不会阻塞当前线程。

定义一个两个元素的数组作为时间片,规定要执行的事件多久执行一次,将数组的第一个元素放入定时器中断函数中每1ms加1,外部判断。其值为Can。

uint32_t Led1_Time[2]={0,1000};//时间片

5.通用定时器和PWM控制

5.1 PWM波

脉宽调制(PWM),是英文“Pulse Width Modulation”的缩写,是一种利用微处理器的数字输出来控制模拟电路的非常有效的技术。它广泛应用于从测量到通信再到功率控制和转换的许多领域。

pwm的频率:指1秒(一个周期)内信号从高电平到低电平再回到高电平的次数;

pwm的周期:周期=1/频率

占空比:是一个脉冲周期内高电平时间与整个周期时间的比值,是脉冲宽度时间与周期的比值

脉宽调制原理:

以单片机为例,我们知道单片机的IO口输出数字信号,IO口只能输出高电平和低电平。

假设高电平为5V,低电平为0V。如果我们想输出不同的模拟电压,就需要使用PWM。通过改变IO口输出的方波的占空比,我们可以得到用数字信号模拟的模拟电压信号。我们知道,电压以连接1或断开0的重复脉冲序列钳位到模拟负载(如LED灯、直流电机等)上。连接是直流电源输出,断开是直流电源输出。直流电源中断。打开。通过控制接通和断开时间,理论上可以输出任何不大于最大电压值(即0到5V之间任意大小)的模拟电压。

STM32第一阶段总结

例如,如果占空比为50%,则意味着高电平时间为一半,低电平时间为一半。在一定频率下,可以获得模拟的2.5V输出电压。那么占空比为75%时得到的电压为3.75V。

5.2 定时器

5.2.1 定时器的分类:

STM32定时器分为3类:基本定时器、通用定时器和高级定时器

基本定时器:定时

通用定时器:定时+PWM+输入捕捉+编码

高级定时器:通用定时器+死区+刹车

5.2.2 基本定时器框图:

定时器中的预分频寄存器和重载寄存器都有影子寄存器,但重载寄存器的影子寄存器可以关闭。更新事件:将预载寄存器的值传送到实际寄存器。

5.2.3 通用定时器

1.计数器:16位,向上计数,向下计数,中心对齐

2.分频器:16位

3、通道:4个通道-- TIMx_CH1 TIMx_CH2 TIMx_CH3 TIMx_CH4 如果定时器配置了输入捕捉功能,则对应通道配置为输入

4. 时钟源

5.PWM波模式:

5.3 通用定时器配置相关库函数

TIM_TimeBaseInit 根据TIM_TimeBaseInitStruct 指定的参数初始化TIMx 的时基单元TIM_OCInit 根据TIM_OCInitStruct 指定的参数初始化外设TIMx TIM_Cmd 使能或禁用TIMx 外设TIM_OC1PreloadConfig 使能或禁用CCR1 上的TIMx 预载寄存器,使能后才能占空比进行修改。 TIM_GetITStatus 检查指定的TIM 中断是否发生。 TIM_ClearITPendingBit 清除TIMx 的中断挂起位。 STM32中定时器实现PWM的流程

1、配置GPIO口为推挽复用输出

2.配置PWM频率和定时器时序

3.配置PWM、CHy配置、OC模式、PWM模式(1/2)、有效电平

4. 定时器使能

6.模数转换器-ADC

6.1 ADC相关知识

ADC的作用:将模拟量转换为数字量

模拟输入范围:参考电压范围3.3V

数字输出的范围和精度(分辨率)

常见的有8位、10位、12位、16位等。位数越多,精度越高。

中间转换方法和速度

换算方法:逐次比较法、积分法等。

速度:采样率(根据外部环境参数变化)+转换率(一般固定)

参考电压

Vref 参考电压——稳定的电压源。

VCC 和GND。 ---模拟地和数字地分开。

转换通道数

转换通道的转换顺序(扫描模式)、连续模式。

6.2 STM32中ADC相关参数及结构框图

通道数:18通道(16个外部+2个内部)

转换精度:12位转换精度(分辨率)

模拟输入范围:Vref-~Vref+:0~3.3

转换方式:逐次逼近式

采样率:ADC 使用几个ADC_CLK 周期对输入电压进行采样。采样周期数可以通过ADC_SMPR1 和ADC_SMPR2 寄存器中的SMP[2:0] 位更改。每个通道可以在不同的时间进行采样。总转换时间计算如下: TCONV=采样时间+ 12.5 个周期

采集模式:单次、连续、扫描、间歇。

时钟:ADC控制器使用不超过14MHz:RCC的CFGR寄存器配置

规则组和注入组: 规则组:最多16个通道,对需要转换的通道进行排序。规则通道及其转换顺序在ADC_SQRx寄存器中选择;注入组:最多4个通道,相当于中断,中断当前正在执行的规则组。注入通道及其转换顺序在ADC_JSQR 寄存器中选择。

启动转换的信号:软件启动和外部触发启动(外部中断和定时器等)。

数据存储:ADC 结果可以左对齐或右对齐存储在16 位数据寄存器中。

6.2ADC相关库函数

ADC_Init 根据ADC_InitStruct 中指定的参数初始化外设ADCx 寄存器ADC_Cmd 使能或禁用指定ADCADC_ResetCalibration 复位指定ADC 的校准寄存器ADC_GetResetCalibrationStatus 获取ADC 复位校准寄存器的状态ADC_StartCalibration 启动指定ADC 的校准程序ADC_GetCalibrationStatus 获取指定ADC 校准状态ADC_RegularChannelConfig 设置指定ADC 的规则组通道,设置其转换顺序和采样时间ADC_GetConversionValue 返回最新ADCx 规则组的转换结果ADC 使用的基本步骤

1、配置io口为模拟输入模式

2. 打开ADC1 的时钟并配置ADC1 的输入时钟。不能高于14MHz。

3.配置ADC1:输入通道、连续、扫描、ADC启动模式等。

4.配置规则组:采样周期等。

5. 启用ADC

6. 校准

7.读取ADC的传感器值

7.低功耗模式

7.1 电源管理模式

电源管理框图:

1. VDDA供电区域:AD转换器温度传感器复位模块PLL

2. VDD供电部分:I/O电路、待机电路、稳压器

3. 1.8V供电区域:核心内存数字外设

4. 备用电源区域:LSE 备用寄存器RCC RTC

7.2 电压调节器的功能

复位后稳压器始终启用。根据应用的不同,它可以以3 种不同的模式工作。

运行模式:稳压器在正常功耗模式下提供1.8V 电源(内核、内存和外设)。

停止模式:稳压器在低功耗模式下提供1.8V 电源以保存寄存器和SRAM 内容。

待机模式:稳压器停止供电。除备份电路和备份域外,寄存器和SRAM 的内容都会丢失。

7.3 三种低功耗模式

STM32F10xxx具有三种低功耗模式:

睡眠模式(Cortex-M3 内核停止,所有外设包括Cortex-M3 内核外设,如NVIC、系统时钟(SysTick)等仍在运行)

停止模式(所有时钟停止)

待机模式(1.8V断电)

7.4 低功耗相关功能

睡眠模式:

/* 请求等待中断*/

__WFI();

/* 请求等待事件*/

__WFE();

进入关机和待机模式:

PWR_WakeUpPinCmd 启用或禁用唤醒引脚功能PWR_EnterSTOPMode 进入停止(STOP)模式PWR_EnterSTANDBYMode 进入待机(STANDBY)模式停止模式:关闭所有CLK

待机模式:关闭所有CLK和电源。

使用待机模式:按住按钮3秒关机,直接开机

进入待机模式的基本步骤

1.配置唤醒端口为外部中断模式

2. 使能PWR时钟

3. 使能唤醒引脚

用户评论

妄灸

刚刚看完这篇STM32第一阶段总结,感觉收获颇丰。作者把知识点梳理得非常清晰,对于初学者来说真的是个宝。

    有8位网友表示赞同!

无望的后半生

阅读完STM32第一阶段总结,感觉自己之前的学习都是瞎忙活,这篇文章让我有了更明确的学习方向。

    有7位网友表示赞同!

墨城烟柳

看了STM32第一阶段总结,感觉自己像是在黑暗中找到了一盏明灯,对STM32的编程有了新的认识。

    有20位网友表示赞同!

枫无痕

STM32第一阶段总结,这篇文章让我对STM32有了更深入的了解,感觉学到了很多实用技巧。

    有15位网友表示赞同!

心贝

这个STM32第一阶段总结太棒了!作者不仅分享了学习经验,还提供了很多实战案例,太实用了。

    有15位网友表示赞同!

见朕骑妓的时刻

看了STM32第一阶段总结,发现作者的学习方法跟我有点像,感觉找到了一个可以交流学习的伙伴。

    有9位网友表示赞同!

tina

读完STM32第一阶段总结,感觉作者的总结能力很强,希望他能继续分享更多优质内容。

    有6位网友表示赞同!

箜篌引

这篇文章的STM32第一阶段总结太详细了,我感觉自己已经可以独立完成一些小项目了。

    有13位网友表示赞同!

七级床震

STM32第一阶段总结,让我对STM32的编程有了全新的认识,感觉自己的编程水平提升了不少。

    有14位网友表示赞同!

君临臣

这篇文章的STM32第一阶段总结让我意识到,学习STM32需要不断实践,感谢作者的分享。

    有13位网友表示赞同!

你是梦遥不可及

看完STM32第一阶段总结,感觉作者对STM32的热爱让我也产生了兴趣,想试试看能不能入门。

    有12位网友表示赞同!

巷口酒肆

这篇文章的STM32第一阶段总结虽然很好,但我感觉作者在讲述过程中有些地方可以再详细一些。

    有15位网友表示赞同!

北朽暖栀

STM32第一阶段总结,感觉作者在分享经验的同时,也分享了自己的困惑,这让我觉得更有共鸣。

    有17位网友表示赞同!

淡抹丶悲伤

读完STM32第一阶段总结,我觉得作者的学习态度值得我学习,希望我也能像他一样坚持。

    有17位网友表示赞同!

┲﹊怅惘。

STM32第一阶段总结,这篇文章让我看到了学习STM32的艰辛,也看到了希望,谢谢作者的分享。

    有14位网友表示赞同!

在哪跌倒こ就在哪躺下

感觉这篇文章的STM32第一阶段总结有点过于简单,对于有一定基础的读者可能不太有帮助。

    有9位网友表示赞同!

陌上蔷薇

STM32第一阶段总结,作者的学习心得分享得很好,但感觉文章的结构可以再优化一下。

    有10位网友表示赞同!

〆mè村姑

看完STM32第一阶段总结,我觉得作者对STM32的热爱和执着值得我学习,希望我能像他一样坚持下去。

    有7位网友表示赞同!

发呆

这篇文章的STM32第一阶段总结让我对STM32有了更全面的了解,希望作者能继续更新后续阶段的总结。

    有15位网友表示赞同!

颜洛殇

STM32第一阶段总结,感觉作者的学习方法很适合我,准备按照他的方法试试看。

    有20位网友表示赞同!

标签: