stm32f103c8t6踩坑筆記(續(xù))
0.Introduction and purpose
這個(gè)專欄是某航儀光19級(jí)著名廢物曹**玩低檔stm32板子的記錄.估計(jì)寫了也沒人看.
在這個(gè)文章里面,我們的說下用stm32f103c8t6和vs2019編寫STM32標(biāo)準(zhǔn)庫版的程序,實(shí)現(xiàn)跑馬燈和串口通信的過程,受硬件的限制我們只實(shí)現(xiàn)這兩個(gè)簡(jiǎn)單功能就可以洗洗睡了.
本文涉及位運(yùn)算內(nèi)容,如果感覺不會(huì)/不熟練可私信交流,或者后面再開個(gè)專欄.
p.s.?如果用到基于寄存器的STM32開發(fā),對(duì)硬件和位運(yùn)算的掌握要求更高

1.Devices and?tools
硬件我們用 STM32F103C8T6最小系統(tǒng)板.為什么用這個(gè)板子,因?yàn)楹紺助教工資不夠入手以STM32F103ZET6最小系統(tǒng)為核心的多源感知綜合創(chuàng)新系統(tǒng)核心板(這么長(zhǎng)的名字,功能比最小系統(tǒng)板要強(qiáng)的多).因?yàn)闆]有相應(yīng)的硬件資源我們只有自己造了.配件主要有CH340G USB轉(zhuǎn)串口模塊,自制LED燈模塊,JLink調(diào)試器,jtag轉(zhuǎn)swd,面包線若干.
軟件我們主要用的JLink軟件(jlink,jflash) VS2019 VisualGDB 硬件驅(qū)動(dòng) 串口監(jiān)視器

2.Hardware?and software?preparation
step 1:連接電路(省略若干步)直接上結(jié)果.這是個(gè)細(xì)心活.需要注意檢查無誤了再上電.


step 2:按照上個(gè)文章的做法新建項(xiàng)目,修改配置(STM32標(biāo)準(zhǔn)庫 板載LED閃爍),改造項(xiàng)目文件

先在LEDBlink解決方案里面添加篩選器User(用于放自己寫的.c .cpp和.h文件)
在User里面添加兩個(gè)篩選器Inc(include,放header文件)和Src(source,放C語言和C++源代碼)
然后把生成的C++文件重命名為main.cpp(因?yàn)樵谶@個(gè)文件里寫main函數(shù))
step3.先造庫吧(因?yàn)槲覀儸F(xiàn)在幾乎什么都沒有),移植下正點(diǎn)原子的延時(shí)庫和串口庫(測(cè)試串口的時(shí)候要用).新建相應(yīng)的header和source文件.在header里面寫類型聲明和函數(shù)聲明.可以用C或者C++在source里面寫函數(shù).作為曾經(jīng)的航C豬腳本廢物用C寫的.
最終效果:

上代碼辣,有bug歡迎指正:)
visualgdb需要自己造庫.造好了就稍微輕松些了
(1)延時(shí)
延時(shí)可以說是stm32編程里面用的最多的一個(gè)功能了.
文件內(nèi)容:
rcc時(shí)鐘初始化,延時(shí)功能初始化,延時(shí)若干us,延時(shí)若干ms
常用宏定義:最大值 最小值 循環(huán)左移位CROL 循環(huán)右移位CROR
CROL宏:對(duì)n位整數(shù)X循環(huán)左移i位 如果是8位整數(shù)一定沒有bug
CROR宏:對(duì)n位整數(shù)X循環(huán)右移i位
(a)delay.h
(b)delay.c 實(shí)現(xiàn)延時(shí)功能 RCC初始化
(2)串口函數(shù)
定義了裝數(shù)據(jù)的結(jié)構(gòu)變量.移植和包裝了若干和串口相關(guān)的函數(shù).可以實(shí)現(xiàn)波特率可修改,8位數(shù)據(jù)位,1位停止位,不帶校驗(yàn)位的通信.用的中斷法接收(要求必須遇到CRLF標(biāo)識(shí)一組數(shù)組接收結(jié)束),查詢法發(fā)送1字節(jié).?在此基礎(chǔ)上包裝了把接收到的若干數(shù)據(jù)復(fù)制到指定數(shù)組和發(fā)送一個(gè)C風(fēng)格字符串的功能
擴(kuò)展玩法(且看后面幾個(gè)文章介紹,這里先咕了):
在USART2上接HC-04藍(lán)牙轉(zhuǎn)串口模塊和手機(jī)通信.可以實(shí)現(xiàn)手機(jī)遙控led(甚至是智能遙控小車,因?yàn)闆]有硬件就不做了)要求波特率9600
在USART3上連接arduino并通信.我的arduino用的是arduino nano(atmega328P芯片)主要功能是IIC轉(zhuǎn)串口.據(jù)說stm32f103c8t6的硬件iic有bug會(huì)卡暴斃,軟件iic事太多了我沒有搞明白,因此出此下策,用arduino的wire庫去實(shí)現(xiàn)iic通信.這樣可以讀取使用iic通信的傳感器(例如mpu6050陀螺儀傳感器)
(a)usart.h
(b)usart.c

3.LEDs Blink
用GPIO實(shí)現(xiàn)流水燈
上來必做兩件事 初始化RCC(時(shí)鐘) 初始化延時(shí)
為了做流水燈我們只需要初始化GPIO口就ok了
設(shè)置GPIOA組的A0,A1,...A7為推拉輸出
用一個(gè)整數(shù)ch表示GPIOA組的7,6,5,4,3,2,1,0號(hào)io口的狀態(tài),配合GPIO_Write一次操縱一組連續(xù)的io口.循環(huán)移位實(shí)現(xiàn)流水燈的效果
"流水燈"視頻的main.cpp代碼如下,"反向流水燈"只需要把循環(huán)右移(CROR)改成循環(huán)左移(CROL)即可
delay.h參見上文


對(duì)于這個(gè)思考題,我們甚至用不上循環(huán)移位運(yùn)算,只要寫一個(gè)for循環(huán)并且用移位運(yùn)算就ok了,如何實(shí)現(xiàn)這里就不展示了

4.Serial communication
把自制LED板子拔了,然后修改main.cpp代碼,usart.h參見上文
打開XCOM串口監(jiān)視器(也可以是別的串口軟件)進(jìn)行通信


后記:
感謝北航17系老師們的指導(dǎo)和幫助.更多的STM32踩坑文章要先咕一陣子了.
Reference:
1.北航儀光小學(xué)期實(shí)驗(yàn)指導(dǎo)書 基于 STM32 (F103ZET6)的系統(tǒng)實(shí)現(xiàn)
2.正點(diǎn)原子STM32F103示例代碼
3.STM32單片機(jī)應(yīng)用與全案例實(shí)踐 沈紅衛(wèi)等著 電子工業(yè)出版社