STM32入門教程-2023持續(xù)更新中


基于標(biāo)準(zhǔn)庫








還得是施密特(圖中肖特基為施密特,圖片翻譯錯(cuò)誤)












90度相位差判斷旋轉(zhuǎn)方向


配置中斷的順序






PWM





GPIO配置為復(fù)用推挽輸出(AF_PP)


千萬別用這個(gè),不然調(diào)試端口全沒,只能串口燒錄


這里解除jtag的復(fù)用

驅(qū)動(dòng)究竟干了啥




關(guān)于測周法的解釋



從模式可以自動(dòng)清零CNT
主從觸發(fā)的高級(jí)應(yīng)用后面再學(xué)



利用補(bǔ)碼的定義在CNT自減時(shí)把結(jié)果從uint16_t變成int16_t 可以讀出負(fù)數(shù)

抗噪聲
AD值最大為2^12 - 1也就是4095 ->3.3V
DA原理圖

逐次逼近ADC,采用二分法去計(jì)算數(shù)字量


ADC時(shí)鐘分頻只能選擇6往后的,因?yàn)樽畲笾С?4MHz

看門狗





用通道序號(hào)作為傳入值實(shí)現(xiàn)人工掃描[doge]




觸發(fā)源選擇就是開啟該觸發(fā)源的DMA
套娃(結(jié)構(gòu)體訪問寄存器)

關(guān)于(uint32_t)ADC1->DR這個(gè)寄存器

開始學(xué)USART啦


挖個(gè)坑CRC校驗(yàn)是什么?



usart1掛在apb2->72MHz




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

使用keil精簡庫中的printf


編碼選utf-8,串口接收同樣,防止亂碼,這里加如下

--no-multibyte-chars
或者采用GB2312編碼,串口使用GBK模式接收
串口觸發(fā)中斷




挖坑:多主多從


主機(jī)發(fā)送

PS:高位先行
主機(jī)接收

應(yīng)答機(jī)制

地址選擇


看手測兒!
軟件iic整體架構(gòu)
iic時(shí)序(6種)->設(shè)置mpu6050.h->main函數(shù)里實(shí)現(xiàn)


bit 6 置0就是關(guān)閉休眠模式
硬件iic


硬件i2C

10位地址標(biāo)志位11110

EV5事件:(大標(biāo)志位)DR->CC->I2C
軟硬件iic的區(qū)別
軟件占空比不規(guī)則,SCL下降沿來時(shí)不能立刻讀寫數(shù)據(jù),有延時(shí)

小尖峰因?yàn)閺臋C(jī)釋放數(shù)據(jù)線的瞬間主機(jī)拉低SDA,這就是硬件的快速響應(yīng)
SPI協(xié)議

片選置0

woc,指令讀??!
W25Q64BV閃存芯片
flash寫入數(shù)據(jù)先擦除,全部置1
寫入后芯片進(jìn)入忙狀態(tài),等緩存區(qū)搬運(yùn),可以讀busy寄存器查看狀態(tài)
軟件SPI設(shè)計(jì)思路:
自己寫一個(gè)MySPI作為底層操作引腳
然后寫W25Q64的硬件驅(qū)動(dòng)代碼調(diào)用MySPI的相關(guān)操作


指令集

跨頁函數(shù)(寫著玩玩)
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
}