GPIO输入模式:上拉、下拉、浮空、模拟。(与F103有区别:上拉、下拉设置在外面)
GPIO输出模式:开漏(输出强低电平、寄存器输出)、推挽(输出强高低电平、外设输出)、开漏复用、推挽复用。
每个引脚有一个复用器,该复用器只允许一个外设的复用功能(AF)连接到对应的IO口,这样确保公用一个IO引脚的外设之间不会发生冲突,
每个复用器采用16路复用功能输入(AF0-AF15),通过GPIOx_AFRL(引脚0-7)、GPIOx_AFRH(引脚8-15)两个32位寄存器对这些输入进行配置,每个IO引脚用4位。
首先对STM32中断进行分组(0-4),每个中断设置一个抢占优先级和一个响应优先级值。
组0 : 0位抢占优先级,4位响应优先级。
组1 : 1位抢占优先级,3位响应优先级。
组2 : 2位抢占优先级,2位响应优先级。
组2 : 3位抢占优先级,1位响应优先级。
组4 : 4位抢占优先级,0位响应优先级。
(数值越低,级别越高)
分组配置在寄存器SCB->AIRCR中8-10位配置,每个中断中IP寄存器(8位)中4-7位设置分配情况(例如:两位设置抢占、两位设置响应)。
响应优先级只有在抢占优先级相同时才有作用。
抢占优先级相同,高响应优先级不可以打断低响应优先级;只是在两者的中断同时发生时,响应优先级高的先执行。
1、UART(通用异步收发器,无时钟信号):TXD-发送端、RXD-接收端、GND-公共地, 异步通信, 全双工。
USART(通用同步异步收发器,有时钟信号)
2、单总线(1-wire) :DQ-发送 / 接收端 异步通信, 半双工。
3、SPI :SCK-同步时钟、MISO-主机输入从机输出、 同步通信, 全双工。
MOSI-主机输出从机输入、
4、I2C :SCL-同步时钟、SDA-数据输入 / 输出端 同步通信, 半双工。
串口通信每次传输16位包括:1、起始位,2、数据位(8位或者9位),3、奇偶校验位(第9位),4、停止位(1,15,2位),5、波特率设置。
RX -> 接收移位寄存器 (<- 接收器控制 <- 接收器时钟)-> 接收数据寄存器 -> 数据总线。
数据总线 -> 发送数据寄存器 (<-发送控制 <- 发送器时钟) -> 发送移位寄存器 -> TX。
接收器时钟、发送器时钟受同一个波特率控制(波特率可以不为整数),时钟来源 fPCLKx。串口1、6使用时钟 fPCLK2,串口2-5使用时钟 fPCLK1。
Tx / Rx 波特率 = fPCLKx / (16*USARTDIV)。USARTDIV是一个无符号的定点数,由它可以得到串口波特率寄存器USART1->BRR的值。
由USARTDIV得到串口USART_BRR寄存器的值:(假设串口1波特率为115200,PCLK时钟(即APB2总线时钟频率)为84M,采样除法器中OVER8 = 0)。
USARTDIV = 84000000 / (115200*16) = 45.572
得到:DIV_Fraction = 16*0.572 = 9 =0X09;
DIV_Mantissa = 45 = 0X2D;
USART_SR 状态寄存器(用到0-9位,每个位是状态标志位)
USART_DR 数据寄存器(用到0-8位)
USART_BRR 波特率寄存器(用到0-3位(USARTDIV的小数)、4-15位(USARTDIV的尾数)、USARTDIV为USART的除数)
USART_CR 控制寄存器
16个IO中断线,每个中断线只能映射 P(A-H)x 7个IO口中的一个。例如:GPIOx.0映射到EXIT0 。。。GPIOx.15映射到EXIT15。
每个外部中断线可以独立的配置触发方式(上升沿,下降沿,双边沿触发),触发 / 屏蔽,专用的状态位。
IO口外部中断在中断向量表中只分配了7个中断向量,也就是只能使用7个中断服务函数,外部中断线5-9分配一个中断向量,公用一个中断服务函数,外部中断线10-15分配一个中断向量,公用一个中断服务函数。
专门用于监测单片机程序运行状态的模块或者芯片,在启动正常运行时,系统不能复位;在系统跑飞(程序异常运行)的情况,系统复位,程序重新执行。
STM32内置两个看门狗(独立看门狗 / 窗口看门狗)用来检测和解决软件错误引起的故障,当计数器达到给定的超时值时,触发一个中断(仅适用窗口看门狗)或者产生系统复位。
相关寄存器(32位):键值寄存器(IWDG_KR)(0-15位有效)、预分频寄存器(IWDG_PR)(0-2位有效、有写保护功能)、
重装载寄存器(IWDG_RLR)(0-11位有效、有写保护功能)、状态寄存器(IWDG_SR)(0-1位有效)
(在键值寄存器(IWDG_KR)写入0x5555取消写保护)
键值寄存器(IWDG_KR)中写入0xCCCC开启看门狗,计数器从其复位值(0xFFF)递减,到0x000时会产生一个复位信号(IWDG_RESET),在键值寄存器(IWDG_KR)写入0xAAAA喂狗,自动重装载寄存器(IWDG_RLR)的值就会重新加载到计数器。
溢出时间 Tout = ((4*2∧prer)*rlr) / 32
时钟频率 LSI = 32K ,一个看门狗时钟周期就是最短超时时间。
最长超时时间 = (IWDG_RLR寄存器最大值) x 看门狗时钟周期
相关寄存器(32位):控制寄存器(WWDG_CR、0-7位)、配置寄存器(WWDG_CFR、0-9位)、状态寄存器(WWDG_SR、0位)
如果启动了看门狗并且允许中断,当递减计数器等于0x40时产生早期唤醒中断(EWI),它可以用于喂狗以避免WWDG复位。
窗口看门狗的超时公式 : Twwdg = (4096 *2∧WDGTB*(T[5 : 0] + 1))/ Fpclk1;
其中Twwdg : WWDG超时时间(单位为ms)
Fpclk1 : APB1 的时钟频率(单位为Khz)
WDGTB :WWDG的预分频系数
T [5 : 0] : 窗口看门狗的计数器低6位
窗口看门狗上窗口值W[6 :0]必须大于下窗口值0x40,否则就无窗口了;窗口看门狗的时钟来源PCLK1(APB1总线时钟)分频后。