一、系统架构
1.被动单元:被动传输数据
- SRAM:存储程序的变量,RAM是易失性的,关机或重启时,RAM中的所有数据都会丢失。
- FLASH:存储下载的程序,程序的常量,长期存储,即使在设备关机时,数据也不会丢失。在这里,容量比SRAM大,比SRM成本低
- AHB到APBx的桥接:高速外设总线APB2的速度为72MHz,低速外设APB1的速度为36MHz。
2.主动(驱动)单元:发出控制信号。
- Cortex-M3,D-Bus数据总线:从FLASH加载常量和调试访问。
- S-Bus
- DMA1(direct memory access直接内存访问):连接到总线矩阵上,降低CPU负担,建立通道控制内存外设的数据流动。
3.其他单元
- ICode 指令总线:传输指令专用通道,不走总线矩阵。
- FSMC (flexible static memory controller):扩展SRAM,flash
二、GPIO外设
- 引脚最大翻转速度为50MHz。
- 通用开漏模式下,能够输出低电平和高电平(必须上拉电阻,因为开漏输出实际是输出高阻态)。
- 共用信号线的场合只能使用开漏模式(推挽会出现短路情况,而开漏具有线与的逻辑效果)。
- 对于需要在复用情况下变换模式(输出,输入间切换)的引脚,设置成复用输出模式即可。
1.相关寄存器
- 2个32位配置寄存器GPIOx_CRL和GPIOx_CRH(configuration register):配置每一位工作模式和时钟速率
- 2个32位数据寄存器GPIOx_IDR和GPIOx_ODR
- 1个32位置位/复位寄存器:0-16位负责分别为16各引脚置0(位置1时),17-31位负责分别为16各引脚置1(位置1时),当两者冲突时,置1操作优先。
- 1个16位复位寄存器:和上面的本质上是一样的
- 1个32位锁定寄存器:锁定配置寄存器
- CR寄存器配置CNF位时发现:10对应上拉/下拉模式,那么如何确定是下拉还是上拉呢?方法设置完CR寄存器后,设置对应位ODR寄存器,如果置1则上拉,置0则下拉。
三、时钟系统
- 边上方框代表引脚,OSC是振荡器的缩写,OSC_IN和OSC_OUT连接外部晶振,MCO:给外部传输时钟信号。HSE OSC:高 速 外部 振荡器(一般通过外部8MHz时钟九倍频得到72MHz)。
- 一般RC振荡器不稳定,优先用外部。
- 使用多个时钟,分配始终资源更合理,功耗更小。
- 最终产生两个重要的时钟:系统时钟(一般使用倍频得到的时钟),实时时钟RTC:一啊用外部低速时钟。
时钟的应用:就是图片右边使用时钟的要求或者说配置。
低速外部时钟不能驱动系统时钟
四、HAL库开发 Hardware Abstraction Layer 硬件抽象层
HAL是基于BSD许可协议的开源代码,可用作商业用途,一致性强。
标准库中的CMSISI coterx microcontroller software interface standard,是跟供应商无关的硬件抽象层,这来源于ARM。
- STM32CubeMX提供了一个图形化的配置窗口(清晰的时钟树图形化,以及引脚复用功能的快速选择···),创建项目时可以生成配置文件。
- HAL库函数隐藏了底层寄存器操作,更易读,类似Arduino?
五、中断系统
意义:避免轮询,解放CPU。
Cortex-M3内核支持256个中断,16个内核中断(异常),240个外部中断,优先级可以设置256级。
Stm32有84个中断,16个内核中断,68个可屏蔽中断。
Stm32F103有70个中断,10个内核中断,60个可编程中断。
每一个中断对应一个地址,实际就是对应程序的地址。
优先级为复述代表不能设置优先级
1.中断体系架构
NCIC嵌套向量中断控制器:管理所有中断请求,排好优先级
中断来源:
- 内核其他控件:系统滴答计时器,复位。。。
- 片上外设:串口,定时器,i2c。。。
- 外部中断:GPIO,AFIO引脚复用选择器对于GPIOx 这7组16位寄存器,16位引脚7合1引脚合并→EXTI外部中断空控制器并确定7合1某一位信号从哪个x来,再交给NVIC,除了16个这样的外部中断还有特定的PVD电源检测线,RTC闹钟线,USB检测线,以太网唤醒线。共20个外部中断线。
优先级分两类:抢先优先级和响应优先级。两种不同场景。
2.NVIC nested vectored interrupt controller 嵌套向量中断控制器
决定哪个中断的处理程序交给CPU执行
20个外部中断交给EXTI控制,然后交给NVIC,其他直接交给NVIC。
优先级分为抢占优先级和响应优先级,后者是指一起等待时的优先级。系统里对应英文为group priority 和 subpriority。
优先级组和子优先级划分
库提供了配置分组模式的函数:
NVIC_SetPriorityGroupin(3); // 配置分组模式为全为抢占优先级
3.EXIT external interrupt 外部中断原理和寄存器
输入线就是引脚。
软件中断事件触发器:可以用软件模拟一个中断。
请求挂起寄存器:判断是否产生中断的状态寄存器,通过硬件进行置位,送出中断信号后还要清空。
中断屏蔽寄存器:是否屏蔽中断。
下方部分是事件处理方式:
原理差不多,不需要挂起,作为事件,检查是否被屏蔽,然后直接交给内核,这是一种硬件处理,不用运行中断程序。虽然是硬件处理,但是需要对应的硬件电路。
4.GPIO触发中断的相关寄存器
AFIO引脚复用选择器中的 AFIO_EXTICRx(x=4)外部中断配置寄存器
四个寄存器保留低16位,用4位控制一根中断线,一共控制16跟中断线。
EXTI的上升沿触发选择寄存器EXTI_RTSR
对应的20跟外部中断线
EXTI的中断屏蔽寄存器
置1,架构图里会与请求信号做一个与。
NVIC配置
设置优先级组,配置优先级
中断处理程序
第一步一定要往EXTI的挂起寄存器线清除中断标志
注意:该位是硬件置位,该位写1进行清除。
中断服务程序并不能自由定义,根据头文件(汇编文件)中的定义。例如: