浮动输入_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之间任意大小)的模拟电压。
例如,如果占空比为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位网友表示赞同!
读完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位网友表示赞同!
看完STM32第一阶段总结,我觉得作者对STM32的热爱和执着值得我学习,希望我能像他一样坚持下去。
有7位网友表示赞同!
这篇文章的STM32第一阶段总结让我对STM32有了更全面的了解,希望作者能继续更新后续阶段的总结。
有15位网友表示赞同!
STM32第一阶段总结,感觉作者的学习方法很适合我,准备按照他的方法试试看。
有20位网友表示赞同!