?? 專欄簡介:本專欄記錄了從零學(xué)習(xí)單片機的過程,其中包括51單片機和STM32單片機兩部分;建議先學(xué)習(xí)51單片機,其是STM32等高級單片機的基礎(chǔ);這樣再學(xué)習(xí)STM32時才能融會貫通。
?? 專欄適用人群 :適用于想要從零基礎(chǔ)開始學(xué)習(xí)入門單片機,且有一定C語言基礎(chǔ)的的童鞋。
??專欄目標(biāo):實現(xiàn)從零基礎(chǔ)入門51單片機和STM32單片機,力求在玩好單片機的同時,能夠了解一些計算機的基本概念,了解電路及其元器件的基本理論等。?? 專欄主要內(nèi)容: 主要學(xué)習(xí)STM32單片機的功能、各個模塊、單片機的外設(shè)、驅(qū)動等,最終玩好單片機和單片機的外設(shè),全程手敲代碼,實現(xiàn)我們所要實現(xiàn)的功能。
?? 專欄說明 :如果文章知識點有錯誤的地方,歡迎大家隨時在文章下面評論,我會第一時間改正。讓我們一起學(xué)習(xí),一起進步。
??專欄主頁:http://t.csdn.cn/HCD8v
本學(xué)習(xí)過程參考:https://space.bilibili.com/383400717
STM3單片機安裝軟件、各種資料以及源碼的路徑:
鏈接:https://pan.baidu.com/s/1snD0uuTfMhchFqOMWvAiHA?pwd=asdf#list/path=%2F
提取碼:asdf
鏈接里壓縮包的解壓密碼:32
本大節(jié)主要學(xué)習(xí)STM32的中斷系統(tǒng)和外部中斷,包含兩部分,第一小節(jié)主要學(xué)習(xí)中斷系統(tǒng)的基礎(chǔ)知識,第二小節(jié)是寫兩個程序進行練習(xí),即對射式紅外傳感器計次和旋轉(zhuǎn)編碼器計次,最終附上所有的源代碼;
本小節(jié)主要是對上一節(jié)學(xué)習(xí)的EXTI外部中斷進行實戰(zhàn)練習(xí),編寫程序進行練習(xí),實現(xiàn)對射式紅外傳感器計次,并附上程序源碼;
一、本節(jié)目標(biāo)
目標(biāo):對射式紅外傳感器計次
實現(xiàn)OLED顯示屏上實時顯示紅外傳感器被擋光的次數(shù)。
過程是我們對紅外傳感器進行擋光,隨后把手拿開;這樣擋光–拿開的過程,每進行一次,OLED上顯示的次數(shù)加1;如下圖所示:
二、設(shè)備介紹
2.1 設(shè)備介紹
2.1.1 旋轉(zhuǎn)編碼器介紹
- 第一個圖的旋轉(zhuǎn)編碼器只能測位置和速度,不能測方向
- 第二個圖是本課程使用的旋轉(zhuǎn)編碼器,第三張圖是其內(nèi)部拆解;既可以測位置和速度,也可以測方向;
2.1.2 旋轉(zhuǎn)編碼器硬件電路
三、對射式紅外傳感器計次源碼
3.1 接線圖
對射式紅外傳感器模塊,VCC、GND分別接電源的正負(fù)極,DO數(shù)字輸出端,隨意選擇一個GPIO口接上就行,在這里我接到了B14端口;
硬件接線圖如下所示:
程序邏輯:
當(dāng)我們的擋光片或者編碼盤在這個對射式紅外傳感器模塊中間經(jīng)過時,這個DO就會輸出電平變化的信號,然后這個電平跳變的信號觸發(fā)STM32 PB14號口的中斷,我們在中斷函數(shù)里執(zhí)行變量++的程序,并最終輸出在OLED上即可。
3.2 代碼
代碼路徑:\STM32入門教程資料\STM32入門教程資料\程序源碼\程序源碼\STM32Project\5-1 對射式紅外傳感器計次\User
3.2.1 代碼邏輯:
- 第一步,配置RCC,把涉及到的外設(shè)的時鐘都打開,一定要謹(jǐn)記,不打開時鐘,外設(shè)是沒法工作的;
- 第二步,配置GPIO,選擇我們的端口為輸入模式
- 第三步,配置AFIO,選擇我們用哦的這一路GPIO,連接到后面的EXTI
- 第四步,配置邊沿觸發(fā)方式,比如上升沿、下降沿或者雙邊沿;還有選擇觸發(fā)響應(yīng)方式,可以選擇中斷響應(yīng)和事件響應(yīng);
- 第五步,配置NVIC,給我們這個中斷選擇一個合適的優(yōu)先級;
- 最后,通過NVIC,外部中斷信號就能進入CPU了,這樣CPU才能收到中斷信號,才能跳轉(zhuǎn)到中斷函數(shù)里執(zhí)行中斷程序;
以上就是外部中斷的配置流程,涉及到的外設(shè)包括RCC、GPIO、AFIO、EXTI、NVIC。
3.2.2 代碼解釋:
第一步開啟時鐘:
開啟GPIOB和AFIO的時鐘:
EXTI、NVIC的時鐘默認(rèn)是開啟的,所以不需要程序開啟;
第二步配置GPIO為輸入模式:
第三步,配置AFIO外設(shè):
選擇GPIOB,連接PB14號口的第14個中斷線路;
第四步,配置EXTI:
EXTI的所有庫函數(shù)如下,
EXTI初始化:
將EXTI的第14個線路配置位中斷模式,下降沿觸發(fā);
第五步:配置NVIC:
NVIC庫函數(shù):
文章來源:http://www.zghlxwxcb.cn/news/detail-486389.html
3.2.3 完整代碼
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "CountSensor.h"
int main(void)
{
OLED_Init();
CountSensor_Init();
OLED_ShowString(1, 1, "Count:");
while (1)
{
OLED_ShowNum(1, 7, CountSensor_Get(), 5);
}
}
CountSensor.c
:文章來源地址http://www.zghlxwxcb.cn/news/detail-486389.html
#include "stm32f10x.h" // Device header
uint16_t CountSensor_Count;
void CountSensor_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line14;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_Init(&EXTI_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
}
uint16_t CountSensor_Get(void)
{
return CountSensor_Count;
}
void EXTI15_10_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line14) == SET)
{
/*如果出現(xiàn)數(shù)據(jù)亂跳的現(xiàn)象,可再次判斷引腳電平,以避免抖動*/
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) == 0)
{
CountSensor_Count ++;
}
EXTI_ClearITPendingBit(EXTI_Line14);
}
}
到了這里,關(guān)于STM32單片機(五)第二節(jié):EXTI外部中斷練習(xí)(對射式紅外傳感器計次和旋轉(zhuǎn)編碼器計次)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!