穹拓做網(wǎng)站站長工具seo查詢
嵌入式學習_part2
本部分筆記用于學習記錄,筆記源頭 >>b站江科大_STM32入門教程_EXTI
EXTI、ADC、NVIC和AFIO
開發(fā)環(huán)境:keil MDK、STM32F103C8T6
1 )EXTI
STM32F10xxx參考手冊(中文)-> 中斷與事件 -> 中斷異常向量表<1>:CPU運行主程序,當 “異常/中斷” 產(chǎn)生時,硬件自動跳轉(zhuǎn)到中斷向量表的地址去執(zhí)行相關(guān)程序;
STM32F10xxx參考手冊(中文)-> 中斷與事件 -> 外部中斷/事件線路映像<1>:支持所有的GPIO口,但是不能使用相同的Pin,AFIO來連接到EXTI(數(shù)據(jù)選擇器);<2>:AFIO的作用,中斷引腳的選擇(數(shù)據(jù)選擇器)、復(fù)用功能的重映射;<3>:EXTI9~5、EXTI10~15,分配在一個通道;<4>:EXTI0~15,用于GPIO的0~15、EXTI線16連接到PVD輸出、 EXTI線17連接到RTC鬧鐘事件、EXTI線18連接到USB喚醒事件、EXTI線19連接到以太網(wǎng)喚醒事件(只適用于互聯(lián)型產(chǎn)品);
STM32F10xxx參考手冊(中文)-> 中斷與事件 -> EXTI結(jié)構(gòu)框圖
2 )NVIC(內(nèi)核外設(shè))
NVIC_搶占優(yōu)先級 / 響應(yīng)優(yōu)先級
搶占優(yōu)先級:搶占優(yōu)先級高的,用于中斷嵌套
響應(yīng)優(yōu)先級:"排隊",響應(yīng)優(yōu)先級相同的,按照 "向量表" 序號排隊;
3)外部中斷的代碼實現(xiàn)
GPIO、RCC、NVIC、EXTI、AFIO
1.基本框架
2.代碼部分
1.開啟時鐘
/*開啟時鐘*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //開啟GPIOB的時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //開啟AFIO的時鐘,外部中斷必須開啟AFIO的時鐘
2.GPIO配置
關(guān)于GPIO的輸入模式,GPIO_Mode = GPIO_Mode_IPUGPIO的輸入配置:STM32F10xxx參考手冊(中文)-> 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()里面實際的在操作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)));
}
這里我們進行配置:PB14 -> EXTI_LINE14
/*AFIO選擇中斷引腳*/GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);//將外部中斷的14號線映射到GPIOB,即選擇PB14為外部中斷引腳
4.EXTI & NVIC
//狀態(tài)標志位,主函數(shù)里面用FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);void EXTI_ClearFlag(uint32_t EXTI_Line);//中斷相關(guān)的狀態(tài)標志位,中斷函數(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號線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)先級范圍:0~3,響應(yīng)優(yōu)先級范圍:0~3//此分組配置在整個工程中僅需調(diào)用一次//若有多個中斷,可以把此代碼放在main函數(shù)內(nèi),while循環(huán)之前//若調(diào)用多次配置分組的代碼,則后執(zhí)行的配置會覆蓋先執(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)先級為1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //指定NVIC線路的響應(yīng)優(yōu)先級為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號線觸發(fā)的中斷{//這里寫你的執(zhí)行邏輯 EXTI_ClearITPendingBit(EXTI_Line14); //清除外部中斷14號線的中斷標志位//中斷標志位必須清除//否則中斷將連續(xù)不斷地觸發(fā),導致主程序卡死}
}
4 )ADC
b站江科大_STM32入門教程_ADC
1.ADC基本框架
ADC:模擬-數(shù)字轉(zhuǎn)換器;<1>: 12位逐次逼近型ADC,1μs的轉(zhuǎn)換時間;<2>: 輸入電壓值范圍0~3.3v,由參考電壓Vref+ ~ Vref- 決定;<3>: 轉(zhuǎn)化結(jié)構(gòu)范圍0~4095,由ADC位數(shù)決定;<4>: 用于"轉(zhuǎn)換"的輸入通道(18個),16個外部通道(GPIO端口),2個內(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個通道的結(jié)果(16bit),但是規(guī)則組轉(zhuǎn)換結(jié)果寄存器只有16bit,也就是只能存放一個通道的結(jié)果;2.注入組:可以一次轉(zhuǎn)換4個通道的結(jié)果(16bit),注入組轉(zhuǎn)換結(jié)果寄存器有4×16bit,也就是可以存放4個通道的結(jié)果;<7>: 閾值"看門狗":監(jiān)測ADC轉(zhuǎn)換電壓;1.可以設(shè)置 "閾值" ,連接NVIC,進行函數(shù)處理;<8>: 規(guī)則組 / 注入組,轉(zhuǎn)化結(jié)構(gòu)結(jié)束時,也可連接NVIC,進行中斷函數(shù)處理;<9>: ADC的處理時鐘來源于APB2的預(yù)分頻(2、4、6、8) ,最大14Mhz;可以看,STM32F10xxx參考手冊(中文)-> 6.2時鐘 -> 圖8:時鐘樹;<10>: STM32F103C8T6 ADC資源,ADC1、ADC2,10個外部輸入通道(GPIO);
2.逐次逼近型ADC
該類型的ADC與STM32 ADC原理一致;
通過"2分法",逐次比較電壓值,通過比較器進行比較;