时钟初始化
- 时钟晶振设置
- 设置晶振使用源(如HSE/HSI/LSE/LSI/MSI等)
- 是否开启PLL,PLL来源,M·N·P·Q·R参数(如果不需要PLL也可以不用设置)
- 执行上述参数设置
- 设置时钟
- 是否开启APB,AHB,SYSCLK时钟
- 设置SYSCLK时钟来源,APB,AHB总线时钟分频系数
- 执行上述参数设置
GPIO引脚设置及使用
- 通用型设置
- 开启该引脚口对应的时钟
- 设置引脚口,使用的模式,传输速率
- 执行上述参数设置
- 复用性设置
-
- 使用
- 通用型
- 置高/低电平,使用库函数HAL_GPIO_WritePin,函数接口为GPIO区域,GPIO引脚口,置高/低。
- 反转电平
- 复用型
- 通用型
串口模块设置及使用
- 串口参数设置
- 串口号,波特率
- 模式(接收,发送或既接收又发送)
- 字长,停止位,奇偶校验位
- 硬件检查
- 串口引脚复用设置
- 串口引脚时钟使能
- 串口模块使能
- 串口引脚设置为复用模式(设置引脚口,复用模式(复用输出和复用选项),传输速率,上拉/下拉/开漏)
- 执行上述设置
- 串口使用
- 发送
- 调用库函数HAL_UART_Transmit,函数接口为串口句柄,发送的数据,数据长度,延时时间。
- 接收
+
- 发送
中断设置及使用
- 外部中断设置及使用
- 基本知识
- STM32每个引脚都可以设置为中断,但是中断是有限的,因此GPIOA-E的0号引脚都对应着0号中断线,A~E的1号引脚都对应1号中断线;
- GPIOA和GPIOD的0号引脚都可以设置为中断模式,但是它们不能同时出现中断模式(最好不要,没有具体操作过)
- 设置及使用
- 外部中断引脚复用设置
- 使能引脚时钟,设置引脚口,上下拉模式,速度
- 设置引脚中断触发模式(上升沿触发/下降沿/上升和下降沿)
- 执行上述参数设置
- 设置抢占和响应优先级
+备注:引脚与中断线名称是固定的(可以在"stm32L475xx.h"中找到),一般情况是- EXTI0_IRQn -> 引脚0号线;EXTI1_IRQn -> 引脚1号线,…,直到第五个引脚
- EXTI9_5_IRQn-> 引脚5-9号线;EXTI15_10_IRQn-> 引脚10-15号线;
- 使能中断
- 编写中断服务函数
- 当出现中断时,会自动执行中断服务函数,因此中断服务函数名称不能随意设定;
- 中断服务函数是根据实际需求进行编写,注意先判断中断标志位,有标志位则清除中断标志位并执行中断内容,否则跳出中断;
- 注意中断时间不能太长,否则会宕机;
- STM32例程中是先调用GPIO中断服务函数,服务函数再调用GPIO中断的函数,GPIO中断函数中先清除中断标志位再调用GPIO中断回调函数,GPIO中断回调函数执行中断内容(我觉得这个过程有些复杂)。
- 外部中断引脚复用设置
- 基本知识
定时器设置及使用
- 计数定时器的基本使用
- 基本知识
- 通过给定时器设置一个时间周期,当到达该时间周期,则触发定时器中断,执行“清除定时器中断标志位”,“定时器清零”和“执行中断服务函数中的内容”。
- 设置时间周期主要依靠“自动重装载寄存器ARR”和“预分频器PSC”
- 定时周期时间 = (ARR+1)*(PSC+1)/Tclk,其中ARR为自动装载寄存器值(Period),PSC为预分频器值(Prescaler),Tclk为该定时器所在时钟周期频率
- 如ARR=4999,PSC=7999,Tclk=80M,则定时周期为0.5秒。
- 设置及使用
- TIM定时器的初始化并执行,主要有使用的定时器X,预分频系数PSC,自动重装载值ADD,计数模式(向上/向下),时钟分频系数(这个参数与输入滤波有关,与普通的定时器计数无关);
- 重写TIM_MSPInit()函数,函数内部主要使能定时器时钟,设置定时器中断优先级并开启中断;
- 使能并开启定时器中断(注意,这里有两次开启定时器中断,两个中断并不是一种类型)
- 编写中断服务函数和回调函数
- 基本知识
DMA设置及使用
- DMA的基本使用
- 基本知识
- DMA是一个控制器,可以在不占用CPU的情况下控制总线实现数据从内存到外设/从外设到内存/内存到内存。也就是数据搬运工,减轻CPU的负担。
- 普通设置(没有使用中断)及使用
- DMA初始化
- 使能DMA模块时钟;
- 将DMA与需要使用的外设联系起来(STM32L4系列的芯片需要);
- 设置 DMA通道、DMA请求选项(请求选项可能和请求发送电平次数有关)、数据传输方向、外设地址是否使用增量模式、内存地址是否使用增量模式(增量模式指的是在每次传送后+1,移动至下一个地址)、外设数据长度、内存数据长度、普通/循环模式(传输一次/循环传输,当为循环传输时,时间周期与外设有关)、DMA优先级(不同的模块使用DMA发生竞争是通过优先级决定先后顺序)
- 使能执行上述设置
- DMA使用
- 使用相关函数使用DMA进行数据传输(如串口使用DMA的函数为“ HAL_UART_Transmit_DMA() ”:这个函数的调用还是需要CPU,函数执行会打开串口DMA并使用DMA进行数据传输),
- DMA执行数据传输,CPU继续干其他的事情
- 执行完成后,DMA返回一个标志位(这里可以跳入中断,但是中断部分我还没做,因此初始化部分没有加入与DMA中断有关的设置笔记),CPU清除传输完成的标志位,可以关闭串口DMA(这里以DMA举例)。
- DMA初始化
- 基本知识
IIC
- IIC协议说明
- IIC只有两个引脚线,分别为时钟控制线和数据控制线SCL和SDA
- 开始传输数据时,SCL为高电平,SDA由高电平变为低电平,结束数据传输时,SCL为高电平,SDA由低电平变为高电平;
- 进行数据传输时,从MSB(高位)开始传输,SCL为高电平,从设备开始读取SDA的电平数据,SCL为低电平时,从设备不读取SDA可改变电平以等待下一次的读取;
- 每8个数据位后,SDA线由接收方控制,接收方将SDA置低,则表示接收成功(ACK信号),否则置高为接收不成功;
- IIC可支持一对多(一主多从),实现原理是在开始信号后为7位设备地址(设备地址需要看芯片厂商,一般高四位是固定的,低四位通过芯片上管脚电压高低来实现不同地址名)从而实现和不同设备通信