穹拓做網(wǎng)站站長(zhǎng)工具seo查詢
嵌入式學(xué)習(xí)_part2
本部分筆記用于學(xué)習(xí)記錄,筆記源頭 >>b站江科大_STM32入門教程_EXTI
EXTI、ADC、NVIC和AFIO
開發(fā)環(huán)境:keil MDK、STM32F103C8T6
1 )EXTI
STM32F10xxx參考手冊(cè)(中文)-> 中斷與事件 -> 中斷異常向量表<1>:CPU運(yùn)行主程序,當(dāng) “異常/中斷” 產(chǎn)生時(shí),硬件自動(dòng)跳轉(zhuǎn)到中斷向量表的地址去執(zhí)行相關(guān)程序;
STM32F10xxx參考手冊(cè)(中文)-> 中斷與事件 -> 外部中斷/事件線路映像<1>:支持所有的GPIO口,但是不能使用相同的Pin,AFIO來連接到EXTI(數(shù)據(jù)選擇器);<2>:AFIO的作用,中斷引腳的選擇(數(shù)據(jù)選擇器)、復(fù)用功能的重映射;<3>:EXTI9~5、EXTI10~15,分配在一個(gè)通道;<4>:EXTI0~15,用于GPIO的0~15、EXTI線16連接到PVD輸出、 EXTI線17連接到RTC鬧鐘事件、EXTI線18連接到USB喚醒事件、EXTI線19連接到以太網(wǎng)喚醒事件(只適用于互聯(lián)型產(chǎn)品);
STM32F10xxx參考手冊(cè)(中文)-> 中斷與事件 -> EXTI結(jié)構(gòu)框圖
2 )NVIC(內(nèi)核外設(shè))
NVIC_搶占優(yōu)先級(jí) / 響應(yīng)優(yōu)先級(jí)
搶占優(yōu)先級(jí):搶占優(yōu)先級(jí)高的,用于中斷嵌套
響應(yīng)優(yōu)先級(jí):"排隊(duì)",響應(yīng)優(yōu)先級(jí)相同的,按照 "向量表" 序號(hào)排隊(duì);
3)外部中斷的代碼實(shí)現(xiàn)
GPIO、RCC、NVIC、EXTI、AFIO
1.基本框架
2.代碼部分
1.開啟時(shí)鐘
/*開啟時(shí)鐘*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //開啟GPIOB的時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //開啟AFIO的時(shí)鐘,外部中斷必須開啟AFIO的時(shí)鐘
2.GPIO配置
關(guān)于GPIO的輸入模式,GPIO_Mode = GPIO_Mode_IPUGPIO的輸入配置:STM32F10xxx參考手冊(cè)(中文)-> 8.1.11 外設(shè)的GPIO配置
/*GPIO初始化*/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); //將PB14引腳初始化為上拉輸入
3.AFIO設(shè)置
AFIO的功能:1.EXTI的數(shù)據(jù)選擇器;2.引腳功能的重映射;AFIO相關(guān)的函數(shù)和GPIO的函數(shù)都放在 -> stm32f10x_gpio.h
//配置AFIO事件輸出功能
void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
void GPIO_EventOutputCmd(FunctionalState NewState);
//引腳重映射
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
//配置AFIO的數(shù)據(jù)選擇器,來選擇我們想要的中斷引腳
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
//以太網(wǎng)有關(guān)
void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);
stm32f10x_gpio.c -> GPIO_EXTILineConfig()里面實(shí)際的在操作AFIO的相關(guān)寄存器
/*** @brief Selects the GPIO pin used as EXTI Line.* @param GPIO_PortSource: selects the GPIO port to be used as source for EXTI lines.* This parameter can be GPIO_PortSourceGPIOx where x can be (A..G).* @param GPIO_PinSource: specifies the EXTI line to be configured.* This parameter can be GPIO_PinSourcex where x can be (0..15).* @retval None*/
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
{uint32_t tmp = 0x00;/* Check the parameters */assert_param(IS_GPIO_EXTI_PORT_SOURCE(GPIO_PortSource));assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource));tmp = ((uint32_t)0x0F) << (0x04 * (GPIO_PinSource & (uint8_t)0x03));AFIO->EXTICR[GPIO_PinSource >> 0x02] &= ~tmp;AFIO->EXTICR[GPIO_PinSource >> 0x02] |= (((uint32_t)GPIO_PortSource) << (0x04 * (GPIO_PinSource & (uint8_t)0x03)));
}
這里我們進(jìn)行配置:PB14 -> EXTI_LINE14
/*AFIO選擇中斷引腳*/GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);//將外部中斷的14號(hào)線映射到GPIOB,即選擇PB14為外部中斷引腳
4.EXTI & NVIC
//狀態(tài)標(biāo)志位,主函數(shù)里面用FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);void EXTI_ClearFlag(uint32_t EXTI_Line);//中斷相關(guān)的狀態(tài)標(biāo)志位,中斷函數(shù)里面用ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
/*EXTI初始化*/EXTI_InitTypeDef EXTI_InitStructure; //定義結(jié)構(gòu)體變量EXTI_InitStructure.EXTI_Line = EXTI_Line14; //選擇配置外部中斷的14號(hào)線EXTI_InitStructure.EXTI_LineCmd = ENABLE; //指定外部中斷線使能EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //指定外部中斷線為中斷模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //指定外部中斷線為下降沿觸發(fā)EXTI_Init(&EXTI_InitStructure); //將結(jié)構(gòu)體變量交給EXTI_Init,配置EXTI外設(shè)/*NVIC中斷分組*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置NVIC為分組2//即搶占優(yōu)先級(jí)范圍:0~3,響應(yīng)優(yōu)先級(jí)范圍:0~3//此分組配置在整個(gè)工程中僅需調(diào)用一次//若有多個(gè)中斷,可以把此代碼放在main函數(shù)內(nèi),while循環(huán)之前//若調(diào)用多次配置分組的代碼,則后執(zhí)行的配置會(huì)覆蓋先執(zhí)行的配置/*NVIC配置*/NVIC_InitTypeDef NVIC_InitStructure; //定義結(jié)構(gòu)體變量NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //選擇配置NVIC的EXTI15_10線NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //指定NVIC線路使能NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //指定NVIC線路的搶占優(yōu)先級(jí)為1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //指定NVIC線路的響應(yīng)優(yōu)先級(jí)為1NVIC_Init(&NVIC_InitStructure); //將結(jié)構(gòu)體變量交給NVIC_Init,配置NVIC外設(shè)
5.中斷函數(shù)
startup_stm32f10x_md.s -> 中斷向量表 - >ST寫好了指定的中斷處理 "接口" 函數(shù)
void EXTI15_10_IRQHandler(void)
{if (EXTI_GetITStatus(EXTI_Line14) == SET) //判斷是否是外部中斷14號(hào)線觸發(fā)的中斷{//這里寫你的執(zhí)行邏輯 EXTI_ClearITPendingBit(EXTI_Line14); //清除外部中斷14號(hào)線的中斷標(biāo)志位//中斷標(biāo)志位必須清除//否則中斷將連續(xù)不斷地觸發(fā),導(dǎo)致主程序卡死}
}
4 )ADC
b站江科大_STM32入門教程_ADC
1.ADC基本框架
ADC:模擬-數(shù)字轉(zhuǎn)換器;<1>: 12位逐次逼近型ADC,1μs的轉(zhuǎn)換時(shí)間;<2>: 輸入電壓值范圍0~3.3v,由參考電壓Vref+ ~ Vref- 決定;<3>: 轉(zhuǎn)化結(jié)構(gòu)范圍0~4095,由ADC位數(shù)決定;<4>: 用于"轉(zhuǎn)換"的輸入通道(18個(gè)),16個(gè)外部通道(GPIO端口),2個(gè)內(nèi)部通道;<5>: 觸發(fā)ADC轉(zhuǎn)換的方式:1. TIM通道;2.軟件觸發(fā)(函數(shù)調(diào)用);3.EXTI;<6>: 轉(zhuǎn)化單元:規(guī)則組和注入組;1.規(guī)則組:可以一次轉(zhuǎn)換16個(gè)通道的結(jié)果(16bit),但是規(guī)則組轉(zhuǎn)換結(jié)果寄存器只有16bit,也就是只能存放一個(gè)通道的結(jié)果;2.注入組:可以一次轉(zhuǎn)換4個(gè)通道的結(jié)果(16bit),注入組轉(zhuǎn)換結(jié)果寄存器有4×16bit,也就是可以存放4個(gè)通道的結(jié)果;<7>: 閾值"看門狗":監(jiān)測(cè)ADC轉(zhuǎn)換電壓;1.可以設(shè)置 "閾值" ,連接NVIC,進(jìn)行函數(shù)處理;<8>: 規(guī)則組 / 注入組,轉(zhuǎn)化結(jié)構(gòu)結(jié)束時(shí),也可連接NVIC,進(jìn)行中斷函數(shù)處理;<9>: ADC的處理時(shí)鐘來源于APB2的預(yù)分頻(2、4、6、8) ,最大14Mhz;可以看,STM32F10xxx參考手冊(cè)(中文)-> 6.2時(shí)鐘 -> 圖8:時(shí)鐘樹;<10>: STM32F103C8T6 ADC資源,ADC1、ADC2,10個(gè)外部輸入通道(GPIO);
2.逐次逼近型ADC
該類型的ADC與STM32 ADC原理一致;
通過"2分法",逐次比較電壓值,通過比較器進(jìn)行比較;