STM32入门教程-2023持续更新中


基于标准库








还得是施密特(图中肖特基为施密特,图片翻译错误)












90度相位差判断旋转方向


配置中断的顺序






PWM





GPIO配置为复用推挽输出(AF_PP)


千万别用这个,不然调试端口全没,只能串口烧录


这里解除jtag的复用

驱动究竟干了啥




关于测周法的解释



从模式可以自动清零CNT
主从触发的高级应用后面再学



利用补码的定义在CNT自减时把结果从uint16_t变成int16_t 可以读出负数

抗噪声
AD值最大为2^12 - 1也就是4095 ->3.3V
DA原理图

逐次逼近ADC,采用二分法去计算数字量


ADC时钟分频只能选择6往后的,因为最大支持14MHz

看门狗





用通道序号作为传入值实现人工扫描[doge]




触发源选择就是开启该触发源的DMA
套娃(结构体访问寄存器)

关于(uint32_t)ADC1->DR这个寄存器

开始学USART啦


挖个坑CRC校验是什么?



usart1挂在apb2->72MHz




16倍波特率=72MHz / 寄存器(DIV)

使用keil精简库中的printf


编码选utf-8,串口接收同样,防止乱码,这里加如下

--no-multibyte-chars
或者采用GB2312编码,串口使用GBK模式接收
串口触发中断




挖坑:多主多从


主机发送

PS:高位先行
主机接收

应答机制

地址选择


看手测儿!
软件iic整体架构
iic时序(6种)->设置mpu6050.h->main函数里实现


bit 6 置0就是关闭休眠模式
硬件iic


硬件i2C

10位地址标志位11110

EV5事件:(大标志位)DR->CC->I2C
软硬件iic的区别
软件占空比不规则,SCL下降沿来时不能立刻读写数据,有延时

小尖峰因为从机释放数据线的瞬间主机拉低SDA,这就是硬件的快速响应
SPI协议

片选置0

woc,指令读取!
W25Q64BV闪存芯片
flash写入数据先擦除,全部置1
写入后芯片进入忙状态,等缓存区搬运,可以读busy寄存器查看状态
软件SPI设计思路:
自己写一个MySPI作为底层操作引脚
然后写W25Q64的硬件驱动代码调用MySPI的相关操作


指令集

跨页函数(写着玩玩)
uint32_t W25Q64_PageProgramLeap(uint32_t Address,uint8_t *DateArray,uint16_t Count)
{
uint8_t i;
uint8_t PageNum;
uint8_t externFrontNum;
uint8_t externBackNum;
externFrontNum = 0xFF - (Address & 0xFF) + 1;
PageNum = (Count - externFrontNum) / 0x100 ;
externBackNum = (Count - externFrontNum) % 0x100;
if(PageNum)
{
W25Q64_PageProgram(Address,DateArray,externFrontNum);
for(i=1;i<=PageNum;i++)
{
W25Q64_PageProgram((Address + (i << 8)) & 0xFFFF00,DateArray + externFrontNum +(i-1)*0x100,0x100);
}
W25Q64_PageProgram((Address + ((PageNum + 1) << 8)) & 0xFFFF00,DateArray + externFrontNum +PageNum * 0x100,externBackNum);
}else
{
W25Q64_PageProgram(Address,DateArray,externFrontNum);
W25Q64_PageProgram((Address + ((PageNum + 1) << 8)) & 0xFFFF00,DateArray + externFrontNum ,externBackNum);
}
//return PageNum;
//return ((PageNum + 1) << 8);// & 0xFFFF00
}