大綱
前沿:無論學習傳統寄存器編程還是庫函數編程,都學要學會看數據手冊和用戶手冊,實際工作中不可能手把手教你
每一個外設的函數或者寄存器怎么配,其實作為單片機工程師就是一個體力活,因為你只是在遵循芯片廠商的規則進行
配置一系列寄存器而已。在編程中要有一種變化的思維,第一點,比如使用某一個外設,需要配置其基本參數,如時鍾,端口和
引腳,作為輸入還是輸出,作為傳統輸出還是服用功能輸出。是否需要配置中斷,以及設置中斷優先級和某個外設中斷
使能,編寫實現功能的中斷函數。第二點,一般情況下單片機與外界交換,無外乎就是收發,對於發送,需要檢測其是否
發送成功,有發送成功的事件或中斷標志位。接收,判斷是否接受成功,如果是使用中斷標志位,則在進入中斷函數后,需要
清除中斷標志位。最后,最重要的是逆行要實現怎么樣的功能,單片機無外乎不就是引腳以及引腳的復用功能,如TIM、ADC、
DAC、CAN、I2C、USART、SPI、USB等等。作為提升自己的方式,我們需要學習上位機開發,可以用C#開發上位機,也可以
用QT開發上位機。
總之,嵌入式開發主要就是臉+腦 ==通訊協議 === 舌頭+手。其中臉是用戶界面,腦是數據庫 。舌頭是傳感器,手是電機。
他們之間形成交互,通過通訊協議進行傳輸數據。
PLC就是大型的單片機,常常用於工業電機的控制。而運動控制板卡是工業機器人的控制。
1.學什么
2.怎么學
3.物理層面的基本電路
4.庫函數的基本理念(HAL庫和FW庫)+內容概要
5.中斷和事件的區別,一定要有中斷嗎?
6.串口存在的意義
7.TIM及其應用
8.WWDG 存在的意義
9.SYSTICK 存在的意義
1.學什么
(1)片上外設
如GPIO、TIM、EXTI、SYSTICK等
(2)模擬數字轉換
如ADC\DAC
(3)通信協議
如I2C、USART/UART、SPI、TCP/IP、CAN等
2.怎么學
嵌入式軟件工程師做學硬件的話基礎要會焊貼片芯片、貼片元件,這個很重要!!!而且要保證焊出來的板子可以正常工作,
出了問題自己去找出問題然后解決掉。要會使用軟件繪制原理圖和PCB。其他的知識個人覺得多做項目,可以是公司項目,也可以
自己做一些小制作,在這個制作過程中需要用到什么硬件知識再去學習,會更有效一點。
3.物理層面的基本電路
1)推挽模式:
狀態:1/0
2)開漏模式:上拉電阻電壓由負載額定電壓決定。
狀態:0或截止
3) 斯密特觸發器
TTL電平,輸入后輸出有不同的比較值
當選擇輸入時,如果大於該比較值,則觸發器輸出1;
如果低於該比較值,則觸發器輸出0;
4)上拉/下拉輸入電路
其意義是保證引腳電平在一個確定的狀態下,常常配合開關或其他觸發方式使用。
4.庫函數的基本理念(HAL庫和FW庫)
固件庫是指“STM32標准函數庫”,它是由ST公司針對STM32提供的函數結構。即API(application program Interface),開發者可以調用函數接口來配置STM32的寄存器。
(1)相似之處:主要由CR、SR、DR(事件或中斷)組成,具體如下表所示
CR:配置相關外設或協議初始化
SR: 判斷引腳的狀態
DR: 讀取或寫入數據
寄存器 |
對應庫函數命名 |
CR Control Register |
對一些外設初始化\使能一些事件或中斷 xxx_Init() 如USART_Init()、GPIO_Init() xxx_cmd() 如 USART_IT()、TIM_Cmd() |
DR Date Register |
發送和接收數據 Xxx_SendData()、xxxReceiveData() |
SR Situation Register |
一些事件或中斷的標志位 Xxx_GetFlagStatus()、xxx_GetITStatus() Xxx_ClearFlag()、xxx_ClearITPend-ingBit() |
(2)固件庫的基本內容
1.匯編編寫的啟動文件
名稱:Startup_stm32f10x_hd.s
主要作用:設置C語言運行環境。
主要內容:設置堆棧指針,設置PC指針,初始化中斷向量表,設置系統時鍾systemInit。
2.時鍾配置文件
System_stm32f10x.c; 把外部的HSE(外部高速時鍾)=8M,經過鎖相環配置成72M。
3.外設相關的
Stm32f10x.h //peripheral register reflect GPIOA_BASE 0XFFFFFFFF
外設基地址,以及相應的寄存器的結構體 以及由外設基地址組成的結構體函數。
實現相應功能的庫
Stm32f10x_xx.c //外設的驅動函數庫文件
Stm32f10x.xx.h //頭文件,存放外設(GPIOx)的初始化結構
Stm32f10x_conf.h //包含所有外設的頭文件,可以選擇是否啟用
4.專門存放中斷服務函數的C文件
stm32f10x_it.h
stm32f10x_it.c
(注:中斷服務函數可以隨意放在其他地方,並不一定要放在.c文件中)
5.中斷和事件的區別
中斷需要中斷服務函數NVIC等一些列配置,而事件不需要軟件,它是直接通過硬件方式聯動。
圖中輸入線1(I/O口)信號進入,通過信號檢測(觸發方式):(上升沿、下降沿、上升下降沿檢測),
進入3之前,是設置軟件中斷/事件。
中斷通過NVIC控制和中斷屏蔽器相與。
事件與事件屏蔽寄存器相與,通過脈沖發生器 產生電平的反轉實現時間產生
一定要有中斷嗎?
(1)設備與外界通信,如CAN,上位機發送消息過來,這時候程序如果運行很慢,錯過消息,
就不自信串口的命令,最好寫入中斷。
(2)你會知道什么時候產生中斷嗎?
只有外界觸發時,如外部中斷導致引腳電平變換,內部中斷定時器,計時到了產生中斷,CAN通信
接收到消息產生中斷,這些都是硬件去檢測,本質檢測的是寄存器是否被置位,至於你(人)不知道是否
什么時候中斷,中斷之所以有優先級,是因為需要考慮很多,如火車行駛中前面兩個路口,有一個人和多個人
,死一個人和死多個人,當然選擇死一個人。
(3)對於嵌入式工程師,只要調用其庫函數接口可以,如CAN發送和接收的接口,自己在封裝下可以使用,
發送即可字節自己定義。對於串口,重定向后直接使用庫函數發送和接收,自己封裝無外乎是發送一個字節,還是發送多個字節而已。
6.串口的作用
1)調試程序,上位機與下位機交互
2)燒錄程序
7.TIM及其應用
8.WWDG 存在的意義
9.SYSTICK 存在的意義
系統定時器是屬於作為CM3/4內核外設,內部嵌套在NVIC中。系統定時器是一個24bit的向下遞減的計數器。
這里需要考慮兩點:計數器每計數一次的時間:與配置其始終有關。
產生一次中斷的時間:計數24次后的時間。
//設計流程
//將core_cm3/4中有關systick函數移植過來
//1.配置重裝載值,復位,以及定時器NVIC配置 config_systicks(xxx)
//2.初始化systicks,可以確定多久中斷一次
//3.配置中斷函數,並將它發到it.h中 ,其中參數變量在延時函數中賦值
//4.編寫相應的延時函數
//5.根據要求調用系統滴答函數
未完待續
更新日期:2021-10-13 \19:54:44