今天是學(xué)習(xí)有方機(jī)器人課程的第二天,通過(guò)課程復(fù)習(xí)GPIO相關(guān)知識(shí)點(diǎn),很有收獲,老師講的非常好!
處理器控制硬件原理
處理器在日常工作時(shí)有兩種功能,第一個(gè)是負(fù)責(zé)基本的數(shù)據(jù)運(yùn)算和邏輯運(yùn)算,第二是控制硬件外設(shè)。
對(duì)于處理器來(lái)說(shuō),正常工作時(shí)需要去運(yùn)行程序,而處理器本身只能運(yùn)行程序,不能存儲(chǔ)程序,程序是存儲(chǔ)在內(nèi)部的只讀存儲(chǔ)器(ROM)中,處理器如何執(zhí)行程序呢?從ROM里讀一條執(zhí)行一條程序,程序中涉及到的運(yùn)算就通過(guò)RSV來(lái)執(zhí)行,運(yùn)算結(jié)果的數(shù)據(jù)就存在了RAM里面;
RAM和ROM最大的區(qū)別就是RAM掉電后就丟失數(shù)據(jù),ROM掉電后不丟失,下次上電后依舊運(yùn)行之前的程序。
RAM:隨機(jī)存取存儲(chǔ)器(random access memory),又稱作“隨機(jī)存儲(chǔ)器”,是與CPU直接交換數(shù)據(jù)的內(nèi)部存儲(chǔ)器,也叫主存(內(nèi)存)。
ROM:只讀存儲(chǔ)器(Read Only Memory),是一種只能讀出事先所存的數(shù)據(jù)的固態(tài)半導(dǎo)體存儲(chǔ)器。ROM中所存數(shù)據(jù)穩(wěn)定,一旦存儲(chǔ)數(shù)據(jù)就再也無(wú)法將之改變或者刪除,斷電后所存數(shù)據(jù)也不會(huì)消失。其結(jié)構(gòu)簡(jiǎn)單,因而常用于存儲(chǔ)各種固化程序和數(shù)據(jù)。
處理器不只是簡(jiǎn)單的進(jìn)行數(shù)據(jù)運(yùn)算操作,還要進(jìn)行復(fù)雜的控制硬件外設(shè)操作
處理器如何控制硬件外設(shè)呢?由于CPU 本身是不能直接控制硬件的,硬件一般由其對(duì)應(yīng)的控制器來(lái)控制,每一個(gè)硬件控制器內(nèi)部都有其自己的寄存器,開(kāi)發(fā)人員通過(guò)向某一硬件控制器內(nèi)部的寄存器寫入特定的值配置該寄存器,依次到達(dá)控制該硬件控制器的目的。
在處理器中將各個(gè)硬件控制器映射到了 CPU 地址空間中的一段范圍,這樣 CPU 就可以通過(guò)讀寫寄存器來(lái)間接控制硬件。通過(guò)IO來(lái)實(shí)現(xiàn)。比如開(kāi)發(fā)人員想要控制GPIO,需要往GPIO內(nèi)部寄存器中寫入特定的值來(lái)配置寄存器,配置好后硬件就會(huì)實(shí)現(xiàn)對(duì)應(yīng)的功能。
硬件寄存器的本質(zhì)就是存儲(chǔ)器,把開(kāi)發(fā)人員寫入的值存在里面,這樣硬件就會(huì)按照寫入值得寄存器的功能執(zhí)行相應(yīng)的工作,開(kāi)發(fā)人員通過(guò)寫入或讀取相應(yīng)寄存器實(shí)現(xiàn)數(shù)據(jù)交互過(guò)程,相當(dāng)于與單片機(jī)進(jìn)行“對(duì)話”。
對(duì)于處理器來(lái)講,讀取存儲(chǔ)器里的數(shù)據(jù)有一個(gè)范圍,這個(gè)范圍就是由處理器內(nèi)部的地址空間決定,對(duì)于RAM32位處理器來(lái)說(shuō),它的讀寫的范圍就是2的32次方=4G,即地址空間大小=4G。
當(dāng)我們要控制某一外設(shè)時(shí),往對(duì)應(yīng)寄存器中寫入一個(gè)值就可以,以上就是處理器控制硬件原理。
地址映射表
處理器分配地址空間的這一過(guò)程就叫做映射,把相應(yīng)外設(shè)寄存器對(duì)應(yīng)的地址映射到處理器的內(nèi)部地址空間中。在一個(gè)處理器中,一般會(huì)將 ROM、RAM、寄存器存儲(chǔ)設(shè)備分別映射到尋址空間中的不
同地址段,我們將這個(gè)映射關(guān)系稱為處理器的地址映射表。簡(jiǎn)單的來(lái)說(shuō)就是處理器讀取程序就去 ROM 對(duì)應(yīng)的地址段讀取,存儲(chǔ)數(shù)據(jù)就到 RAM 對(duì)應(yīng)的地址段存儲(chǔ),控制硬件控制器就到其內(nèi)部的寄存器所對(duì)應(yīng)的地址段進(jìn)行讀寫操作,而 ROM、RAM、寄存器這三者的地址段會(huì)形成一張表,將其稱為處理器的地址映射表。
啟動(dòng)模式
程序通過(guò)ST-Link下載到ROM里,啟動(dòng)模式為主閃存存儲(chǔ)模式。
STM32F10X.H 頭文件?
STM32F10X 系列單片機(jī)內(nèi)部的寄存器數(shù)量多且復(fù)雜,而此文件是對(duì) STM32 寄存器地址、結(jié)構(gòu)體類型定義的底層頭文件,由ST 公司提供,使用 STM32 庫(kù)時(shí)都要包含該文件。
GPIO 的輸入輸出
通過(guò)參考手冊(cè),我們知道GPIO的內(nèi)部結(jié)構(gòu)如下。
輸出:
開(kāi)漏模式下,輸出驅(qū)動(dòng)器的P-MOS管失效,當(dāng)寫入0到對(duì)應(yīng)寄存器時(shí),輸出控制會(huì)響應(yīng)寄存器里的配置,由于N-MOS管導(dǎo)通,IO引腳被拉低;當(dāng)寫入1時(shí),由于P-MOS失效,呈現(xiàn)高阻態(tài),需要外接上拉電阻才能把IO引腳拉高。低電平有驅(qū)動(dòng)能力,高電平呈高阻態(tài)無(wú)驅(qū)動(dòng)能力。
推挽模式下,P-MOS和N-MOS都是有效的。寫入1,IO引腳拉高;寫入0,IO引腳拉低。低電平和高電平都有效有驅(qū)動(dòng)能力
輸入:
模擬輸入不經(jīng)過(guò)TTL施密特觸發(fā)器,施密特觸發(fā)器本質(zhì)上來(lái)講就是用來(lái)濾波,當(dāng)信號(hào)高于上限值就轉(zhuǎn)換為高電平,低于下限值為低電平。
復(fù)用功能輸入通過(guò)TTL施密特觸發(fā)器,達(dá)到一個(gè)濾波的作用。
IO引腳處的兩個(gè)二極管,起到保護(hù)電路的作用。
代碼部分(知識(shí)點(diǎn)查漏補(bǔ)充)
1、?在對(duì)應(yīng)外設(shè)的.h文件里,能找到該外設(shè)所有封裝函數(shù)聲明。
/**
* @brief Writes data to the specified GPIO data port.
* @param GPIOx: where x can be (A..G) to select the GPIO peripheral.
* @param PortVal: specifies the value to be written to the port output data register.
* @retval None
*/
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)
{
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
GPIOx->ODR = PortVal;
}
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)
{
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GET_GPIO_PIN(GPIO_Pin));
assert_param(IS_GPIO_BIT_ACTION(BitVal));
if (BitVal != Bit_RESET)
{
GPIOx->BSRR = GPIO_Pin;
}
else
{
GPIOx->BRR = GPIO_Pin;
}
}
GPIO_Write,是控制GPIOx的所有引腳;GPIO_Write(GPIOA, 0xfeff),表示ODR寄存器的第8位寫0,其他15位都為1。
GPIO_WriteBit,是設(shè)置GPIOx中某一個(gè)引腳的置位或清除,單獨(dú)對(duì)某一個(gè)IO口進(jìn)行配置。
2、可以用GPIO_WriteBit 代替GPIO_SetBits或GPIO_ResetBits。
通過(guò)assert_param(),里面的參數(shù),雙擊選中之后按F12,進(jìn)行跳轉(zhuǎn),可以看到對(duì)應(yīng)寄存器的操作。
/**
* @brief Sets the selected data port bits.
* @param GPIOx: where x can be (A..G) to select the GPIO peripheral.
* @param GPIO_Pin: specifies the port bits to be written.
* This parameter can be any combination of GPIO_Pin_x where x can be (0..15).
* @retval None
*/
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_PIN(GPIO_Pin));
GPIOx->BSRR = GPIO_Pin;
}
/**
* @brief Clears the selected data port bits.
* @param GPIOx: where x can be (A..G) to select the GPIO peripheral.
* @param GPIO_Pin: specifies the port bits to be written.
* This parameter can be any combination of GPIO_Pin_x where x can be (0..15).
* @retval None
*/
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_PIN(GPIO_Pin));
GPIOx->BRR = GPIO_Pin;
}
3、 GPIO_Pin_All代表對(duì)所有的引腳都進(jìn)行定義。
#define GPIO_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */
#define GPIO_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected */
#define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */
#define GPIO_Pin_3 ((uint16_t)0x0008) /*!< Pin 3 selected */
#define GPIO_Pin_4 ((uint16_t)0x0010) /*!< Pin 4 selected */
#define GPIO_Pin_5 ((uint16_t)0x0020) /*!< Pin 5 selected */
#define GPIO_Pin_6 ((uint16_t)0x0040) /*!< Pin 6 selected */
#define GPIO_Pin_7 ((uint16_t)0x0080) /*!< Pin 7 selected */
#define GPIO_Pin_8 ((uint16_t)0x0100) /*!< Pin 8 selected */
#define GPIO_Pin_9 ((uint16_t)0x0200) /*!< Pin 9 selected */
#define GPIO_Pin_10 ((uint16_t)0x0400) /*!< Pin 10 selected */
#define GPIO_Pin_11 ((uint16_t)0x0800) /*!< Pin 11 selected */
#define GPIO_Pin_12 ((uint16_t)0x1000) /*!< Pin 12 selected */
#define GPIO_Pin_13 ((uint16_t)0x2000) /*!< Pin 13 selected */
#define GPIO_Pin_14 ((uint16_t)0x4000) /*!< Pin 14 selected */
#define GPIO_Pin_15 ((uint16_t)0x8000) /*!< Pin 15 selected */
#define GPIO_Pin_All ((uint16_t)0xFFFF) /*!< All pins selected */
4、當(dāng)端口需要復(fù)用時(shí),要配置復(fù)用功能,并開(kāi)啟AFIO時(shí)鐘。
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)
/*
* @brief 表示改變指定引腳的映射,即復(fù)用功能
@param GPIO_Remap: 選擇要重新映射的引腳。
@param NewState: 端口引腳重新映射的新?tīng)顟B(tài)。 ENABLE or DISABLE.
*/
今天學(xué)習(xí)了P2-P6的視頻,完成筆記并補(bǔ)充疏漏知識(shí)點(diǎn)!
STM32 開(kāi)發(fā)板+智能小車 入門課程+項(xiàng)目?
本人博客僅代表個(gè)人見(jiàn)解方便記錄成長(zhǎng)筆記。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-836914.html
若有不足,請(qǐng)指出,感謝您的閱讀!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-836914.html
到了這里,關(guān)于有方機(jī)器人 STM32智能小車 項(xiàng)目學(xué)習(xí)筆記2的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!