STM32
1、keil的配置以及vscode的配置略
2、stm32的命名规则 todo 以下以stm32lf103ze为例。
3、点亮第一个小灯
开启时钟、设置输入/输出模式、给小灯的位赋值0。
- 开启时钟
- 开启时钟使用到的寄存器为RCC_APB2ENR,32位,高16位为保留位。
- 第二位IOPA控制IO端口A的输入输出使能。其他具体每一位什么功能看数据手册。
- 设置输入/输出模式
- 用到GPIOA_CRL / GPIOA_CRH。这两个寄存器每个都是32位,每个只能给8个输入/输出设置模式(每4bit给一个输入/输出位设置模式),两个加起来可以给16个输入/输出设置模式
- 具体使用以及复位值见参考手册。
- 给小灯的位赋值
- 用到GPIOA_ODR(输出寄存器)。32位,高16位保留。
我们可以使用方便的方法,比如引入 stm32f10x.h 库来让以上的设置更见名知意。
4、寄存器和引脚 todo
5、GPIO的8种工作模式
GPIO输入输出电路里有一个P-MOS管和一个N-MOS管。 P-MOS管栅极接低电平导通,N-MOS管栅极接高电平导通。 P-MOS管的符号可以在前面加上一个小圆圈,有的也不加。加小圆圈的就是说这个是低电平导通,方便记一下。
- 输入浮空
- 输入上拉
- 输入下拉
- 以上的三个输入状态是管无输入时的输入值。比如选择输入上拉时,没有往芯片中输入数据,则为输入被上拉拉为1。
- 模拟输入
- 输入模拟信号,即没有走内部的施密特触发器,输入为模拟信号。
- 开漏输出。
- 利用上拉电阻实现。
- 使用场景如 需要外部上拉电阻确定高电平、多个设备共用信号线...
- 推挽式输出。
- 使用场景如 todo
- 推挽式复用功能。暂略。
- 开漏复用功能。暂略。
6、时钟
-
HSI ---- 高速内部时钟;
- RC振荡器产生。8MHz。
-
HSE ---- 高速外部时钟;
- 在外部接的一个8MHz的晶振。
-
LSI ---- 低速内部时钟;
- 大概40kHz。不能驱动系统时钟。
-
LSE ---- 低速外部时钟;
- 32.768kHz。不能驱动系统时钟。
-
PLL ---- 锁环器/倍频器。
7、中断
-
NVIC (嵌套向量中断控制器) 作用为协调中断。
- 来自内核的中断。如 系统滴答定时器。 直接由NVIC协调。
- 来自内部外设的中断。 如 串口、定时器、IIC等。直接由NVIC协调。
- 来自外部的中断。 如 PA-PG那112个引脚。 AFIO --> EXTI --> NVIC。
-
中断的优先级
- 中断的优先级占4个二进制位。
- 分为 抢占优先级 和 响应优先级。 两种优先级可以分这4个位。比如可以全部分给抢占。这个用3-7来配置。 从3开始,3表示4个位全给抢占;7表示4个位全给响应。
- 先比抢占,再比响应,再查表。(两个没执行的中断的比较。)
- 如果一个中断在执行,另一个中断只有抢占大于它时才能打断。
-
中断的配置。
-
开启时钟 (GPIO的复用引脚 和 AFIO)
-
配置GPIO模式 比如我们想要设置下拉输入(我们想要上升沿生效,则需要设置下拉输入),然后记得把ODR也设置一下才能实现下拉,ODR设置0位。
-
配置AFIO,用于将引脚复用为外部中断。比如 将外部中断10的位置指定上PF寄存器,也就是 将PF10引脚 指定为外部中断。
-
配置EXTI。 (1、EXTI->RTSR配置上升沿触发; 2、EXTI->IMR开放对应的屏蔽寄存器。)
-
配置NVIC。(1、优先级组; 2、优先级; 3、使能中断。)
-
中断服务函数。写中断触发后要实现的功能。记得 EXTI->PR 设置挂起寄存器(0没有触发请求,1触发了请求(1即清位,需要我们手动清))。
刚开始挂起寄存器EXTI->PR为0,有中断进来,对应的位变为1,进入中断后,我们再给它1让它再清零。
-
8、通讯
-
串行:一次传输一个bit。 通讯距离远(USB线就算远了)、抗干扰能力强、成本低。
-
并行:一次传输n个bit。 传输速率高。(一般设备内部间通讯用并行)
-
单工:只能一方发送数据。如收音机。
-
半双工:同一时间只能一方发送。如对讲机。
-
全双工共:两端可以同时接收数据。如手机。
-
同步:要求收发两端时钟保持一致。(共用同一个时钟,比如两个设备连接上SCL这一根时钟线。)
-
异步:不要求时钟一致。
stm32的串口通信是有三个支持同步通信,由于异步没有时钟的要求,所以需要通讯设备之间约定好波特率,即每秒传输/接收多少个bit。先发低位,后发高位。(USART串口同步异步接收器可以实现同步,UART就是同步)。一个设备的发送接另一个的接收,这要两个设备各两条线,再来个两设备共地的线。关于同步异步以及频率看后面记的时钟数和命名。 todo
stm32的IIC通信是同步串行半双工通讯。先发高位,后发低位。todo
x
1、stm32运算速度非常快,如果用循环当作延时,需要大概十万百万次空循环才能看到小灯闪烁的效果。
2、stm32是32位地址线。
3、寄存器的复位值即开机后或按下复位键之后寄存器或其对应引脚的初始默认值。查看数据手册时关注一下,因为这个有时能影响到写的逻辑。
4、不同型号的IO口数量不同。我们使用这个有总共144个引脚,112个IO引脚(A-G * 16)
5、关于ARM的应用及分类 略。
6、当我们驱动大电流设备时,不能使用芯片直接驱动,因为如果我们输出0时,会造成电流进入芯片,电流大时会烧掉芯片。但我们可以把芯片加一个驱动器,比如三极管,芯片放在基极位置。
7、上拉电阻拉高的原理是当我们电路为悬空状态(正负没有连通)时,没有电流经过上拉电阻,所以电阻两端的电压相同,电阻相当于导线。
8、设置输入模式时,将CNFx设置为 上拉/下拉模式,还需要额外在输出寄存器ODR中配置来区分到底是上拉还是下拉(0下拉;1上拉 )。
9、
-
桥1通过APB2连接到外设,APB2上的频率为最高72MHz;上面的外设有:ADC1、ADC2、ADC3、USART1、SPI1、TIM1、TIM8、GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF、EXTI、AFIO ;
-
桥2通过APB1连接到外设,APB1上的频率最高36MHz;上面的外设有:DAC、PWR、BKP、bxCAN、USB、I2C2、I2C1、UART5、UART4、USART3、USART2、SPI3/I2S、SPI2/I2S、IWDG、WWDG、RTC、TIM7、TIM6、TIM5、TIM4、TIM3、TIM2