嵌入式系統(tǒng)導(dǎo)論(錢曉捷 第2版) 課件 第6-10章 CM3異常和STM32中斷-STM32的模擬接口_第1頁
嵌入式系統(tǒng)導(dǎo)論(錢曉捷 第2版) 課件 第6-10章 CM3異常和STM32中斷-STM32的模擬接口_第2頁
嵌入式系統(tǒng)導(dǎo)論(錢曉捷 第2版) 課件 第6-10章 CM3異常和STM32中斷-STM32的模擬接口_第3頁
嵌入式系統(tǒng)導(dǎo)論(錢曉捷 第2版) 課件 第6-10章 CM3異常和STM32中斷-STM32的模擬接口_第4頁
嵌入式系統(tǒng)導(dǎo)論(錢曉捷 第2版) 課件 第6-10章 CM3異常和STM32中斷-STM32的模擬接口_第5頁
已閱讀5頁,還剩175頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

嵌入式系統(tǒng)導(dǎo)論嵌入式系統(tǒng)導(dǎo)論主講教師:第6章CM3異常和STM32中斷本章內(nèi)容提要6.1Cortex-M3的異常6.2STM32的中斷應(yīng)用6.3EXTI應(yīng)用示例:按鍵中斷數(shù)據(jù)傳送方式程序查詢傳送中斷傳送DMA傳送6.1Cortex-M3的異常異常(Exception)是導(dǎo)致程序流程改變的事件ARM的中斷(Interrupt)是異常的一種類型中斷通常由外設(shè)或外部輸入產(chǎn)生有些情況下也可以由軟件激發(fā)針對中斷的異常處理程序也被稱為中斷服務(wù)程序ISR異常由嵌套向量中斷控制器NVIC處理(NestedVectoredInterruptController)CM3異常的來源中斷請求IRQ(IntrruptRequest)通常來自片上外設(shè)或經(jīng)I/O端口的外部中斷輸入非屏蔽中斷NMI(Non-MaskableInterrupt)請求可來自看門狗定時器或供電電壓下降探測電路系統(tǒng)時鐘(滴答)SysTick,可以產(chǎn)生周期性中斷請求可用于嵌入式操作系統(tǒng)的時間記錄或者作為監(jiān)督的定時控制處理器本身也是異常事件的來源例如,失效事件、軟件異常等復(fù)位是一種特殊的異常CM3

常異常編號IRQn優(yōu)先級名稱1--3Reset2-14-2NMI3-13-1HardFault4-120MemManage5-111BusFault6-102UsafeFault7—10---11-53SVCall12-44DebugMonitor13---14-25PendSV15-16SysTick16—2550—2557—255IRQ優(yōu)先級定義CM3的一個異常是否被處理器接收并處理取決于它的優(yōu)先級以及處理器當(dāng)前的優(yōu)先級有些異常(復(fù)位、NMI和HardFalult)具有固定優(yōu)先級是一個負(fù)值,表示其優(yōu)先級高于其他優(yōu)先級其他異常的優(yōu)先級可以編程確定,范圍是0~255異常優(yōu)先級數(shù)值越小、優(yōu)先權(quán)越高CM3支持3個固定最高優(yōu)先級和256級可編程優(yōu)先級但實(shí)際支持的優(yōu)先級有半導(dǎo)體芯片設(shè)計者決定多數(shù)只支持8、16、32等種優(yōu)先級優(yōu)先級編程由優(yōu)先級寄存器控制8、16、32、256種優(yōu)先級依次需3、4、5、8位優(yōu)先級寄存器組(搶占)優(yōu)先級和子(響應(yīng))優(yōu)先級3~8位的優(yōu)先級寄存器又分成兩個部分組優(yōu)先級(GroupPriority)確定是否可以打斷正在執(zhí)行的中斷,實(shí)現(xiàn)嵌套早期技術(shù)手冊中,被稱為搶占優(yōu)先級(Pre-emptionPriority)子優(yōu)先級(Sub-Priority)只用于在相同組優(yōu)先級,多個子優(yōu)先級同時出現(xiàn)時 高優(yōu)先權(quán)(低優(yōu)先級值)的異常首先被處理也有譯為響應(yīng)優(yōu)先級嵌套向量中斷控制器NVICNVIC是處理器的一部分,可以編程處理異常和中斷的配置、優(yōu)先權(quán)和中斷屏蔽6.2STM32的中斷應(yīng)用STM32具有多達(dá)68個中斷(不包括16個Cortex-M3中斷線)STM32把編號-3~6的中斷定義為系統(tǒng)異常編號7開始的是外部中斷(所有外設(shè)都具有中斷請求能力)編號為負(fù)的3個中斷不能設(shè)置優(yōu)先級其他都可以自行設(shè)置不同型號STM32微控制器的向量表略有區(qū)別啟動文件包含了其支持的所有中斷并給出了中斷服務(wù)函數(shù)名STM32

斷異常編號IRQn優(yōu)先級名稱1607WWDG1718PVD…………22613EXTI023714EXTI124815EXTI225916EXTI3261017EXTI4271118DMA1_Channel1…………392330EXTI9_5…………564047EXTI15_10…………NVIC庫函數(shù)函數(shù)名函數(shù)功能NVIC_InitNVIC初始化NVIC_PriorityGroupConfig配置優(yōu)先權(quán)組NVIC_SetVectorTable設(shè)置向量表位置和偏移NVIC_SystemLPConfig為系統(tǒng)進(jìn)入低功耗模式選擇條件SysTick_CLKSourceConfig配置系統(tǒng)時鐘SysTick時鐘源1.NVIC優(yōu)先級配置STM32使用4位優(yōu)先級寄存器、支持16種異常優(yōu)先級4位分成組(搶占)優(yōu)先級和子(響應(yīng))優(yōu)先級有5組分配形式(下頁表)STM32庫中文件misc.c提供了NVIC的配置函數(shù)

voidNVIC_PriorityGroupConfig(uint32_t

NVIC_PriorityGroup)參數(shù)NVIC_PriorityGroup對應(yīng)5組分配形式NVIC_PriorityGroup_0~NVIC_PriorityGroup_4使用中斷一定要在工程項目中添加misc.c文件STM32的5組優(yōu)先級配置組號組(搶占)優(yōu)先級子(響應(yīng))優(yōu)先級0無4位都配置子優(yōu)先級16種子優(yōu)先級(0~15)11位配置組優(yōu)先級2種組優(yōu)先級(0、1級)3位配置子優(yōu)先級8種子優(yōu)先級(0~7)22位配置組優(yōu)先級4種組優(yōu)先級(0~3級)2位配置子優(yōu)先級4種子優(yōu)先級(0~3)33位配置組優(yōu)先級8種組優(yōu)先級(0~7級)1位配置子優(yōu)先級2種子優(yōu)先級(0、1)44位都配置組優(yōu)先級16種組優(yōu)先級(0~15級)無2.NVIC初始化NVIC初始化函數(shù)void

NVIC_Init(NVIC_InitTypeDef*NVIC_InitStruct)NVIC_InitTypeDef結(jié)構(gòu)typedef

struct{uint8_tNVIC_IRQChannel;uint8_tNVIC_IRQChannelPreemptionPriority;uint8_tNVIC_IRQChannelSubPriority;

FunctionalState

NVIC_IRQChannelCmd;}

NVIC_InitTypeDef;STM32的外部中斷/事件EXTIEXTI控制器具有19個邊沿檢測器(中斷通道)EXTI0~EXTI15:對應(yīng)GPIOx_Pin0~GPIOx_Pin15EXTI16:連接PVD(電源電源檢測)輸出EXTI17:連接RTC(實(shí)時時鐘)的鬧鐘事件EXTI18:連接USB喚醒事件(EXTI19:連接以太網(wǎng)喚醒事件,僅互聯(lián)型產(chǎn)品)用于檢測19個輸入線,每個都可以單獨(dú)地被配置為中斷或事件也都可以選擇上升沿、下降沿或上下沿均觸發(fā)每個輸入線都可以單獨(dú)進(jìn)行屏蔽EXTI:ExternalInterrupt/event通用I/O引腳作為外部中斷所有I/O端口都可以配置為EXTI外部中斷模式用來檢測外設(shè)中斷請求,可以配置為 下降沿觸發(fā)、上升沿觸發(fā)或上升下降沿觸發(fā)所有GPIO引腳都可以作為中斷源連接到16個EXTI外部中斷線(Line)上PAx~PGx引腳連接到EXTIxEXTI0~EXTI4分別占用一個中斷向量EXTI9~EXTI5共用一個中斷向量、被稱為EXTI9_5EXTI15~EXTI10共用一個中斷向量、被稱為EXTI15_10EXTI:ExternalInterrupt/eventGPIO的EXTI連接PAx~PGx引腳連接到EXTIx同一個時刻EXTIx只能響應(yīng)一個端口引腳x的中斷事件EXTI寄存器寄存器縮寫寄存器英文名稱EXTI_IMRInterruptMaskRegisterEXTI_EMREventMaskRegisterEXTI_RTSRRisingTriggerSelectionRegisterEXTI_FTSRFallingTriggerSelectionRegisterEXTI_SWIERSoftwareInterrupt/EventRegisterEXTI_PRPendingrequestRegisterEXTI結(jié)構(gòu)中斷(Interrupt)與事件(Event)對于外部觸發(fā)信號來說,沒有區(qū)別在微控制器芯片內(nèi)部,處理不同中斷是某個事件發(fā)生向處理器發(fā)出中斷請求,并跳轉(zhuǎn)到中斷服務(wù)程序中可以被更高優(yōu)先權(quán)的中斷屏蔽(禁止)事件是檢測到某個事件發(fā)生可向其他模塊發(fā)送觸發(fā)信號對應(yīng)模塊決定如何響應(yīng)(觸發(fā)或不觸發(fā)中斷)事件不會被屏蔽,但可以屏蔽發(fā)送觸發(fā)信號(這是事件屏蔽寄存器的作用)EXTI庫函數(shù)函數(shù)名函數(shù)功能EXTI_InitEXTI初始化EXTI_DeInitEXTI解除初始化EXTI_StructInit填充EXTI初始化結(jié)構(gòu)成員EXTI_GetITStatus獲取中斷狀態(tài)EXTI_ClearITPendingBit中斷掛起位清除EXTI_GetFlagStatus獲取標(biāo)志狀態(tài)EXTI_ClearFlag掛起標(biāo)志清除EXTI_GenerateSWIInterrupt產(chǎn)生軟件中斷外設(shè)的中斷相關(guān)函數(shù)函數(shù)名函數(shù)功能PPP_ITConfig設(shè)置外設(shè)PPP某個(些)中斷請求是允許或禁止PPP_GetITStatus獲取外設(shè)PPP某個中斷狀態(tài)PPP_ClearITPendingBit清除外設(shè)PPP某個掛起的中斷標(biāo)志PPP_GetFlagStatus獲取標(biāo)志狀態(tài):檢測某個外設(shè)標(biāo)志是否置位PPP_ClearFlag掛起標(biāo)志清除:清除某個外設(shè)的掛起標(biāo)志6.3EXTI應(yīng)用示例:按鍵中斷【例6-1】根據(jù)按鍵狀態(tài)控制LED燈亮滅2個按鍵KEY有按下來,產(chǎn)生中斷請求KEY在目標(biāo)板上的連接PA0和PC13分別連接2個KEY1和KEY2按鈕按下時,GPIO引腳輸入低電平(0)否則輸入高電平(1)程序的功能是按下某個按鈕KEYx對應(yīng)LEDx亮一段時間,然后熄滅中斷初始化配置復(fù)位后,所有中斷都被禁止,并賦予優(yōu)先級0使用任何中斷,都需要設(shè)置中斷,具體是:1.NVIC初始化配置配置優(yōu)先級組為每個中斷通道進(jìn)行NVIC初始化2.外設(shè)初始化配置3.外設(shè)中斷配置啟動GPIO的復(fù)用功能(AFIO)時鐘

為每個中斷請求的GPIO引腳指明外部中斷EXTI線為每個中斷請求引腳進(jìn)行EXTI初始化NVIC初始化配置首先,選擇優(yōu)先級組號(即0~4共5種形式)NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);其次,配置中斷通道:PA0(KEY1)NVIC_InitTypeDefNVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn; //指明IRQ通道(EXTI0_IRQn)NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //指明IRQ通道的組(搶占)優(yōu)先級(0)NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; //指明IRQ通道的子優(yōu)先級(0)NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //允許IRQ通道中斷(ENABLE)NVIC_Init(&NVIC_InitStructure);啟動GPIO的復(fù)用功能(AFIO)時鐘STM32的I/O引腳,不僅能夠作為通用I/O端口GPIO還可以作為片上外設(shè)(如串口、ADC等)的I/O引腳這稱為復(fù)用I/O端口AFIO大多數(shù)GPIO都有默認(rèn)的復(fù)用功能部分GPIO還有重映射功能把原來是A引腳的默認(rèn)復(fù)用功能,映射到B引腳使用當(dāng)把GPIO用作EXTI外部中斷或者使用重映象功能時必須在設(shè)置GPIO引腳之前啟動AFIO時鐘

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);AFIO:Alternate-FunctionI/O選擇作為EXTI中斷的GPIO引腳 void

GPIO_EXTILineConfig(uint8_tGPIO_PortSource,uint8_tGPIO_PinSource)GPIO_PortSource選擇作為EXTI線的GPIO端口

形如GPIO_PortSourceGPIOx(x是A~G)GPIO_PinSource指明配置的EXTI線(GPIO引腳) 形如GPIO_PinSourcex(x是0~15)選擇PA0(KEY1)作為外部中斷EXTI GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0)EXTI初始化配置調(diào)用stm32f10x_exti.c中的EXTI初始化配置

voidEXTI_Init(EXTI_InitTypeDef*EXTI_InitStruct)參數(shù)EXTI_InitStruct是指向EXTI_InitTypeDef結(jié)構(gòu)的指針typedef

struct{uint32_tEXTI_Line; /*指明EXTI線*/

EXTIMode_TypeDef

EXTI_Mode; /*指明工作模式*/

EXTITrigger_TypeDef

EXTI_Trigger; /*指明有效邊沿*/

FunctionalState

EXTI_LineCmd; /*ENABLE或DISABLE*/}EXTI_InitTypeDef;幫助文檔示例:PA0引腳的EXTI初始化

EXTI_InitTypeDef

EXTI_InitStructure;EXTI_InitStructure.EXTI_Line=EXTI_Line0;//指明EXTI線(EXTI_Line0)

EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//指明EXTI工作模式(EXTI_Mode_Interrupt)

EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//

指明觸發(fā)有效邊沿(EXTI_Trigger_Falling)

EXTI_InitStructure.EXTI_LineCmd=ENABLE; //允許中斷(ENABLE)

EXTI_Init(&EXTI_InitStructure);主程序流程intmain(void){LED_Config(); //LED初始化

……EXTI_Config();//外部中斷初始化(含KEY初始化)while(1){}//循環(huán)等待中斷}中斷服務(wù)程序stm32f10x_it.c專用于編寫中斷服務(wù)函數(shù)中斷服務(wù)函數(shù)名必須與啟動代碼中定義的相同KEY1(PA0)的中斷服務(wù)函數(shù)voidEXTI0_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line0)==

SET)

{LED_On(1);Delay(5000000);

LED_Off(1);EXTI_ClearITPendingBit(EXTI_Line0);

}}中斷狀態(tài)獲取與清除函數(shù)中斷狀態(tài)獲取函數(shù),用于確認(rèn)發(fā)生了中斷

ITStatus

EXTI_GetITStatus(uint32_tEXTI_Line)參數(shù)EXTI_Line是EXTI線編號:

EXTI_Linex(x是0~19)返回值ITStatus是EXTI線的狀態(tài): 觸發(fā)(SET)、沒有觸發(fā)(RESET)中斷狀態(tài)清除函數(shù),用于清除EXTI線掛起的位

voidEXTI_ClearITPendingBit(uint32_tEXTI_Line)幫助文檔掛起(Pending)是暫停中斷處理掛起狀態(tài)表明中斷還沒有處理結(jié)束嵌入式系統(tǒng)導(dǎo)論主講教師:第7章

STM32的USART本章內(nèi)容提要7.1串行異步通信7.2通用同步異步接收發(fā)送器(USART)7.3USART應(yīng)用示例: 實(shí)現(xiàn)C語言標(biāo)準(zhǔn)輸入輸出函數(shù)串行通信并行傳輸7.1串行異步通信串行數(shù)據(jù)傳輸將數(shù)據(jù)分解成二進(jìn)制位用一條信號線一位一位順序傳輸數(shù)據(jù)通信線路少,遠(yuǎn)距離通信的成本低適合于遠(yuǎn)距離數(shù)據(jù)傳送和近距離數(shù)據(jù)傳送可以減小芯片尺寸、提升傳輸速率需制定通信協(xié)議(通信規(guī)程),解決傳送速率、信息格式、數(shù)據(jù)同步、數(shù)據(jù)校驗等問題串行異步通信:以字符為單位進(jìn)行傳輸串行同步通信:以一個數(shù)據(jù)塊(幀)為傳輸單位串行串行異步通信字符格式起始位——每個字符開始傳送的標(biāo)志,起始位采用邏輯0電平數(shù)據(jù)位——數(shù)據(jù)位緊跟著起始位傳送。由5~8個二進(jìn)制位組成,低位先傳送校驗位——用于校驗是否傳送正確;可選擇奇檢驗、偶校驗或不傳送校驗位停止位——表示該字符傳送結(jié)束。停止位采用邏輯1電平,可選擇1、1.5或2位起始位校驗位停止位空閑位數(shù)據(jù)位低位高位字符0/10/10/10/110111…空閑位——傳送字符之間的邏輯1電平,表示沒有進(jìn)行傳送串行同步通信以一個數(shù)據(jù)塊(幀)為傳輸單位每個數(shù)據(jù)塊附加1個或2個同步字符最后以校驗字符結(jié)束同步通信的傳輸效率和速率較高,硬件電路較復(fù)雜串行同步通信主要應(yīng)用在網(wǎng)絡(luò)當(dāng)中最常使用高級數(shù)據(jù)鏈路控制協(xié)議HDLC~~~~同步字符數(shù)據(jù)數(shù)據(jù)數(shù)據(jù)校驗字符數(shù)據(jù)傳輸速率(帶寬)數(shù)據(jù)傳輸速率=比特率(BitRate)每秒傳輸?shù)亩M(jìn)制位數(shù)bps字符中每個二進(jìn)制位持續(xù)的時間長度都一樣, 是數(shù)據(jù)傳輸速率的倒數(shù)進(jìn)行二進(jìn)制數(shù)碼傳輸,每位時間長度相等: 比特率=波特率(BaudRate)過去,限制在50bps到9600bps之間現(xiàn)在,可以達(dá)到115200bps或更高異步串行接口標(biāo)準(zhǔn)美國電子工業(yè)協(xié)會EIA制定1962年公布,1969年修訂1987年1月正式改名為EIA-232D數(shù)據(jù)終端設(shè)備DTE與數(shù)據(jù)通信設(shè)備DCE標(biāo)準(zhǔn)接口25針插口9針插口232C接口的引腳定義TxD:發(fā)送數(shù)據(jù)RxD:接收數(shù)據(jù)RTS:請求發(fā)送CTS:清除發(fā)送(允許發(fā)送)DTR:數(shù)據(jù)終端準(zhǔn)備好DSR:數(shù)據(jù)裝置準(zhǔn)備好GND:信號地

CD:載波檢測(DCD)

RI:振鈴指示保護(hù)地(機(jī)殼地)TxC:發(fā)送器時鐘RxC:接收器時鐘232C接口的連接連接調(diào)制解調(diào)器:通過電話線路遠(yuǎn)距離通信直接(零調(diào)制解調(diào)器)連接:進(jìn)行短距離通信不使用聯(lián)絡(luò)信號的3線相連微機(jī)TxDRxDGND微機(jī)微機(jī)DSRDTRTxDRxDRTSCTSGND微機(jī)“偽”使用聯(lián)絡(luò)信號的3線相連傳輸制式全雙工通信同時雙向傳輸站A站B站A站B站A站B半雙工通信分時雙向傳輸單工通信單向傳輸7.2通用同步/異步接收/發(fā)送器實(shí)現(xiàn)串行數(shù)據(jù)傳輸需要并行到串行和串行到并行的轉(zhuǎn)換并按照傳輸協(xié)議發(fā)送和接收每個字符(或數(shù)據(jù)塊)可由軟件實(shí)現(xiàn),也可用硬件實(shí)現(xiàn)通用同步異步接收發(fā)送器USART是用硬件實(shí)現(xiàn) 串行通信的接口電路UniversalSynchronousAsynchronousReceiver/Transmitter處理器USARTSTM32的串行通信接口USARTSTM32具有多達(dá)5個USART接口USART1連接高速APB2總線、運(yùn)行速度為72MHz(支持高達(dá)4.5Mbps的傳輸速率)其他位于APB1總線、36MHz(2.25Mbps傳輸速率)STM32的USART接口具有多種操作模式異步全雙工通信、同步單路通信和半雙工單線通信支持LIN、智能卡、IrDA、多處理器通信每個USART接口具有兩個DMA通道用于接收Rx和發(fā)送Tx數(shù)據(jù)與存儲器之間的高速傳送UniversalSynchronousAsynchronousReceiver/TransmitterUSART結(jié)構(gòu)圖USART的增強(qiáng)功能局部互聯(lián)網(wǎng)絡(luò)LIN(LocalInterconnectionnetwork)主要針對車輛中低成本的LIN總線智能卡(SmartCard)內(nèi)嵌芯片的集成電路(IC)卡兼容ISO7816-3標(biāo)準(zhǔn)的異步智能卡協(xié)議紅外線接口IrDA(InfraredDataAssociation)短距離、點(diǎn)對點(diǎn)直線數(shù)據(jù)傳輸支持SIRENDEC傳輸編碼解碼協(xié)議USART接口的引腳USART接口通過3個引腳連接外設(shè)Tx

發(fā)送數(shù)據(jù)輸出(TransmitDataOut)Rx

接收數(shù)據(jù)輸入(ReceiveDataIn)CK

發(fā)送時鐘輸出,用于同步傳輸模式(CK引腳早期版本被稱為SCLK)實(shí)現(xiàn)硬件流程控制需要如下引腳nCTS

清除發(fā)送(ClearToSend) 若為高電平,在當(dāng)前傳輸結(jié)束前阻止下個數(shù)據(jù)發(fā)送nRTS

發(fā)送請求(RequestToSend) 若為低電平,表明USART準(zhǔn)備好接收數(shù)據(jù)USART寄存器寄存器縮寫寄存器中文名稱USART_SR狀態(tài)寄存器USART_DR數(shù)據(jù)寄存器USART_BRR波特率寄存器USART_CR1控制寄存器1USART_CR2控制寄存器2USART_CR3控制寄存器3USART_GTPR時間保護(hù)和預(yù)分頻寄存器異步串行通信協(xié)議嵌入式開發(fā)系統(tǒng)可以連接PC機(jī)串口用于程序下載、系統(tǒng)調(diào)試等嵌入式開發(fā)板與PC機(jī)的串口連接通常采用簡單的交叉3線、不采用聯(lián)絡(luò)信號支持全雙工通信異步串行通信協(xié)議以字符為單位,需設(shè)置波特率(傳輸率)、數(shù)據(jù)位數(shù)奇偶校驗、停止位個數(shù)7.3USART應(yīng)用示例:實(shí)現(xiàn)標(biāo)準(zhǔn)輸入輸出函數(shù)使用3線交叉線連接USART1端口與PC機(jī)串口1編寫USART1初始化配置函數(shù)將輸入輸出函數(shù)重定向到USART1端口編寫字符發(fā)送fputc函數(shù)編寫字符接收fgetc函數(shù)不使用半主機(jī)模式復(fù)用功能USART1_REMAP=0USART1_REMAP=1USART1_TXPA9PB6USART1_RXPA10PB7USART初始化配置啟動USART時鐘

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE)

GPIO復(fù)用引腳初始化USART1_Tx(發(fā)送信號)復(fù)用PA9引腳USART1_Rx(接收信號)復(fù)用PA10引腳USART初始化配置為:115200-8-N-1(波特率-數(shù)據(jù)位數(shù)-校驗方式-停止位數(shù))允許USART工作

USART_Cmd(USART1,ENABLE)GPIO復(fù)用引腳初始化啟動GPIOA端口時鐘

RCC_APB2PeriphClockCmd(RCC_APB2Perih_GPIOA,ENABLE)

使用GPIO_Init函數(shù)初始化GPIO引腳PA9(USART1_TX)需設(shè)置為推挽復(fù)用輸出PA10(USART1_RX)需配置為浮空輸入或上拉輸入USART引腳通信配置GPIO配置USARTx_TX全雙工復(fù)用推挽輸出半雙工同步模式復(fù)用推挽輸出USARTx_RX全雙工浮空輸入/上拉輸入半雙工同步模式未用??捎糜谕ㄓ肐/O參考手冊USART初始化USART初始化函數(shù)

voidUSART_Init(

USART_TypeDef*USARTx,USART_InitTypeDef*USART_InitStruct)

USARTx(要配置的串口):USART1~UART5USART_InitStruct指向USART_InitTypeDef結(jié)構(gòu)變量的指針typedef

struct{uint32_tUSART_BaudRate;/*通信波特率*/uint16_tUSART_WordLength;/*數(shù)據(jù)位數(shù)*/uint16_tUSART_StopBits;/*停止位數(shù)*/uint16_tUSART_Parity;/*校驗?zāi)J?/uint16_tUSART_Mode;/*接收發(fā)送模式*/uint16_tUSART_HardwareFlowControl;/*硬件流控制*/}USART_InitTypeDef;幫助文檔USART初始化(115200-8-N-1)USART_InitTypeDef

USART_InitStructure;USART_InitStructure.USART_BaudRate=115200;USART_InitStructure.USART_WordLength=USART_WordLength_8b;USART_InitStructure.USART_StopBits=USART_StopBits_1;USART_InitStructure.USART_Parity=USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;USART_Init(USART1,&USART_InitStructure);

USART_Cmd(USART1,ENABLE);重定向(Retarget)C語言輸入輸出函數(shù)默認(rèn)設(shè)備:鍵盤和顯示器要使用scanf和printf函數(shù),需要重定向?qū)⑤斎氲男畔⒅匦露ㄏ騺碜酝庠O(shè)(USART1端口)將輸出的信息重新定向去到外設(shè)(USART1端口)用戶可以重新編寫C語言的庫函數(shù)當(dāng)C編譯器檢查到與C庫函數(shù)相同名稱的函數(shù)時優(yōu)先采用用戶編寫的函數(shù),實(shí)現(xiàn)重定向1.編寫fputc函數(shù)2.編寫fgetc函數(shù)3.不使用半主機(jī)模式printfHello×USART的數(shù)據(jù)收發(fā)函數(shù)接收數(shù)據(jù)的函數(shù)uint16_tUSART_ReceiveData(USART_TypeDef*USARTx)函數(shù)調(diào)用的返回值就是最新接收的數(shù)據(jù)發(fā)送數(shù)據(jù)的函數(shù)voidUSART_SendData(USART_TypeDef*USARTx,uint16_tData)參數(shù)Data就是要發(fā)送的數(shù)據(jù)雖然是一個16位數(shù)據(jù),實(shí)際上只使用其低8位1.編寫fputc函數(shù)在C標(biāo)準(zhǔn)庫函數(shù)中,printf函數(shù)實(shí)質(zhì)是一個宏需要調(diào)用fputc實(shí)現(xiàn)一個字符輸出int

fputc(int

ch,FILE*f){USART_SendData(USART1,(uint8_t)ch);while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);returnch;}USART_GetFlagStatus用于檢測發(fā)送完成USART_GetFlagStatus函數(shù)用于檢測發(fā)送完成

FlagStatus

USART_GetFlagStatus(USART_TypeDef*USARTx,uint16_tUSART_FLAG)要檢測的狀態(tài)是參數(shù)USART_FLAG·USART_FLAG_CTS(CTS改變標(biāo)志,UART4和UART5上不可用)·USART_FLAG_LBD(LIN中止檢測標(biāo)志)·USART_FLAG_TXE(發(fā)送數(shù)據(jù)寄存器空標(biāo)志)·USART_FLAG_TC(發(fā)送完成標(biāo)志)·USART_FLAG_RXNE(接收數(shù)據(jù)寄存器非空標(biāo)志)·USART_FLAG_IDLE(空閑線檢測標(biāo)志)·USART_FLAG_ORE(溢出錯誤標(biāo)志)·USART_FLAG_NE(噪聲錯誤標(biāo)志)·USART_FLAG_FE(幀錯誤標(biāo)志)·USART_FLAG_PE(校驗錯標(biāo)志)返回值USART_FLAG說明置位(SET)或復(fù)位(RESET)幫助文檔2.

編寫fgetc函數(shù)標(biāo)準(zhǔn)輸入函數(shù)scanf函數(shù)通過調(diào)用fputc實(shí)現(xiàn)int

fgetc(int

ch,FILE*f){intch;while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET);ch=USART_ReceiveData(USART1);/*實(shí)現(xiàn)鍵盤輸入的回顯功能*/while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);USART_SendData(USART1,(uint8_t)ch);returnch;}3.

不使用半主機(jī)模式半主機(jī)模式(Semihosting)將ARM應(yīng)用程序的I/O在主機(jī)(PC機(jī))上體現(xiàn)出來printf、scanf等函數(shù)使用主機(jī)的屏幕和鍵盤使開發(fā)人員可以通過PC機(jī)的標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)和標(biāo)準(zhǔn)輸出設(shè)備(顯示器)調(diào)試ARM處理器代碼將printf、scanf等函數(shù)重定向到USART端口 就不能再采用半主機(jī)模式,方法有兩種(1)使用微庫(2)添加retarget.c文件使用C標(biāo)準(zhǔn)輸入輸出函數(shù),需包含stdio.h(1)使用微庫(UseMicroLIB)KeilMDK特別為嵌入式應(yīng)用編寫的小型C庫僅實(shí)現(xiàn)了基本的、簡單的函數(shù),例如printf、scanf不能使用高級的fprintf、fopen等微庫不使用半主機(jī)模式在MDK集成環(huán)境的目標(biāo)選項中,從代碼生成欄(CodeGeneration),選擇使用微庫MicroLib的選擇(目標(biāo)選項)(2)添加retarget.c文件如果仍使用標(biāo)準(zhǔn)C庫需要用戶重新編寫使用半主機(jī)模式的函數(shù)在MDK安裝目錄中有一個文件retarget.c為用戶編寫自己的函數(shù)提供的模板用戶可以將文件復(fù)制到工程目錄中,添加到項目中,并進(jìn)行修改retarget.c主要修改是編輯fputc、fgetc函數(shù)的實(shí)現(xiàn)代碼本例刪除(已在其他文件實(shí)現(xiàn)了這兩個函數(shù))

#include<stdio.h>#pragma

import(__use_no_semihosting_swi)FILE__stdout;FILE__stdin;void_sys_exit(int

return_code){while(1);/*endlessloop*/}【例7-1】信息交互應(yīng)用程序?qū)崿F(xiàn)在PC機(jī)終端程序中進(jìn)行信息交互intmain(void){ charmsg[100]; inttemp; USART1_Config(); //USART1配置

printf("\r\n演示printf和scanf函數(shù)\r\n"); printf("輸入一個字符串:"); scanf("%s",msg); printf("\r\n輸入的字符串是:%s\r\n",msg);

……}調(diào)試運(yùn)行軟件模擬查看View→串行窗口SerialWindows→UART#1程序調(diào)試運(yùn)行時,該窗口有printf輸出結(jié)果激活該窗口也可利用scanf函數(shù)輸入信息在線硬件仿真使用3線交叉串口電纜連接PC機(jī)串口和目標(biāo)板USART1端口運(yùn)行PC機(jī)的超級終端程序,設(shè)置其傳輸協(xié)議是“1152008-N-1”連接好目標(biāo)板硬件仿真器,打開電源,運(yùn)行程序在PC機(jī)超級終端程序中,與目標(biāo)板交互【例7-2】接收中斷驅(qū)動LED燈點(diǎn)亮USART接口的中斷應(yīng)用、實(shí)現(xiàn)功能從PC機(jī)鍵盤輸入數(shù)字1、2或3,從PC機(jī)串口發(fā)送給嵌入式系統(tǒng)的USART1接口USART1接收數(shù)字后,觸發(fā)中斷中斷服務(wù)程序獲取具體的數(shù)字, 并相應(yīng)控制LED1、LED2或LED3燈點(diǎn)亮USART中斷連接USART中斷相關(guān)函數(shù)USART中斷配置函數(shù)voidUSART_ITConfig(USART_TypeDef*USARTx,uint16_tUSART_IT,FunctionalState

NewState)

獲取中斷狀態(tài)函數(shù)ITStatus

USART_GetITStatus(USART_TypeDef*USARTx,uint16_tUSART_IT)

清除中斷標(biāo)志函數(shù)voidUSART_ClearITPendingBit(USART_TypeDef*USARTx,uint16_tUSART_IT)USART中斷標(biāo)志和事件標(biāo)志中斷請求中斷標(biāo)志事件標(biāo)志CTS改變USART_IT_CTSUSART_FLAG_CTSLIN中止檢測中斷USART_IT_LBDUSART_FLAG_LBD發(fā)送數(shù)據(jù)寄存器空中斷USART_IT_TXEUSART_FLAG_TXE發(fā)送完成中斷USART_IT_TCUSART_FLAG_TC接收數(shù)據(jù)寄存器非空中斷USART_IT_RXNEUSART_FLAG_RXNE空閑線檢測中斷USART_IT_IDLEUSART_FLAG_IDLE校驗錯中斷USART_IT_PEUSART_FLAG_PE錯誤中斷USART_IT_ERR溢出錯誤中斷USART_IT_OREUSART_FLAG_ORE噪聲錯誤中斷USART_IT_NEUSART_FLAG_NE幀錯誤中斷USART_IT_FEUSART_FLAG_FEUSART中斷初始化(1)NVIC初始化配置

……NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn; ……(2)USART初始化配置

……(3)USART中斷配置USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);USRAT1中斷服務(wù)程序voidUSART1_IRQHandler(void){uint8_tch;LED_Off_all();if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET){ch=(uint8_t)USART_ReceiveData(USART1); printf("%c\n",ch); switch(ch) { case'1':LED_On(1);printf("LED1燈亮\n");break;

……

}}}軟件模擬運(yùn)行嵌入式系統(tǒng)導(dǎo)論主講教師:第8章STM32的DMA接口本章內(nèi)容提要8.1DMA控制器8.2DMA應(yīng)用示例:USART接口的DMA傳輸8.3DMA、USART和GPIO的綜合應(yīng)用數(shù)據(jù)傳送方式程序查詢傳送中斷傳送DMA傳送8.1DMA控制器DMA傳送希望克服程序控制傳送的不足:外設(shè)→CPU→存儲器外設(shè)←CPU←存儲器直接存儲器存取DMA:外設(shè)→存儲器外設(shè)←存儲器CPU釋放總線,由DMA控制器管理查詢要等,中斷太煩,來個直接的DMA傳送過程1)DMA預(yù)處理2)DMA請求和應(yīng)答3)DMA傳送DMA讀:存儲器→外設(shè)DMA寫:存儲器←外設(shè)4)增減地址和計數(shù),判斷傳送是否完成STM32的DMA控制器直接存儲器存取DMA(DirectMemoryAccess)利用系統(tǒng)總線直接在外設(shè)與存儲器之間進(jìn)行 大量和高速數(shù)據(jù)傳輸?shù)姆椒⊿TM32設(shè)計有2個DMA控制器單元DMA1單元,支持7個DMA通道DMA2單元,支持5個DMA通道具有多達(dá)12個獨(dú)立的可配置DMA通道支持存儲器到存儲器、外設(shè)到存儲器、 存儲器到外設(shè)和外設(shè)到外設(shè)的自動傳輸每個通道都支持軟件觸發(fā)DMA框圖DMA1各通道的請求外設(shè)通道1通道2通道3通道4通道5通道6通道7ADC1ADC1SPI/I2SSPI1_RXSPI1_TXSPI/I2S2_RXSPI/I2S2_TXUSARTUSART3_TXUSART3_RXUSART1_TXUSART1_RXUSART2_RXUSART2_TXI2CI2C2_TXI2C2_RXI2C1_TXI2C1_RXTIM1TIM1_CH1TIM1_CH4TIM1_TRIGTIM1_COMTIM1_UPTIM1_CH3TIM2TIM2_CH3TIM2_UPTIM2_CH1TIM2_CH2TIM2_CH4TIM3TIM3_CH3TIM3_CH3TIM3_UPTIM3_CH1TIM3_TRIGTIM4TIM4_CH1TIM4_CH2TIM4_CH3TIM4_UPDMA1各條通道連接的外設(shè)參考手冊STM32主要外設(shè)都支持DMADMA2各通道的請求外設(shè)通道1通道2通道3通道4通道5ADC3ADC3SPI/I2S3SPI/I2S3_RXSPI/I2S3_TXUART4UART4_RXUART4_TXSDIOSDIOTIM5TIM1_CH1TIM1_CH4TIM1_TRIGTIM1_COMTIM1_UPTIM6/DAC_Channel1TIM6_UP/DAC_Channel1TIM7TIM7_UP/DAC_Channel2TIM8TIM8_CH3TIM8_UPTIM8_CH4TIM8_TRIGTIM8_COMTIM8_CH1TIM8_CH2DMA2各條通道連接的外設(shè)DMA通道的優(yōu)先級和中斷每個DMA通道可以由應(yīng)用程序賦予4個優(yōu)先級之一(很高、高級、中級和低級)在仲裁階段,高優(yōu)先級的通道優(yōu)先獲得總線響應(yīng)相同優(yōu)先級時,通道號小的通道優(yōu)先獲得總線響應(yīng)每個DMA通道都可以在3個時刻產(chǎn)生中斷請求DMA傳輸過半HTIFDMA傳輸完成TCIFDMA傳輸錯誤TEIF每個DMA通道都有自己的中斷向量(除大容量產(chǎn)品中,DMA2通道4和DMA2通道5的中斷被映射在同一個中斷向量上)DMA通道的寄存器每個DMA通道由4個寄存器控制配置寄存器CCR定義DMA傳輸?shù)奶匦詡鬏敂?shù)量寄存器CNDTR保存?zhèn)鬏數(shù)臄?shù)據(jù)個數(shù)外設(shè)地址寄存器CPAR保存外設(shè)的地址存儲器地址寄存器CMAR保存存儲器的地址中斷操作由兩個中斷寄存器控制中斷狀態(tài)寄存器ISR中斷標(biāo)志清除寄存器IFCR參考手冊DMA寄存器寄存器縮寫寄存器中文名稱DMA_CCR配置寄存器DMA_CNDTR傳輸數(shù)量寄存器DMA_CPAR外設(shè)地址寄存器DMA_CMAR存儲器地址寄存器DMA_ISR中斷狀態(tài)寄存器DMA_IFCR中斷標(biāo)志清除寄存器8.2DMA應(yīng)用示例:USART接口的DMA傳輸【例8-1】將主存一個數(shù)據(jù)塊采用DMA方式傳輸?shù)経SART1發(fā)送接口(TX)DMA傳輸前,讓所有LED燈滅DMA傳輸中,處理器繼續(xù)執(zhí)行程序讓LED1燈亮DMA傳輸后,產(chǎn)生中斷讓LED2燈亮將USART1端口連接PC機(jī)串口,重定向在PC機(jī)遠(yuǎn)程終端程序中顯示傳輸結(jié)果使用DMA方式進(jìn)行USART1發(fā)送屬于DMA1單元的通道4(USART1_TX)DMA傳輸?shù)拈_發(fā)方法使用DMA傳輸之前,需要進(jìn)行DMA初始化配置(1)開啟DMA時鐘:RCC_AHBPeriphClockCmd函數(shù)(2)如果使用中斷,進(jìn)行DMA的NVIC配置(3)DMA傳輸?shù)膮?shù)配置:DMA_Init函數(shù)(4)允許DMA傳輸:DMA_Cmd函數(shù)(5)如果使用中斷,設(shè)置DMA傳輸何時產(chǎn)生中斷:

DMA_ITConfig函數(shù)當(dāng)進(jìn)行DMA傳輸時,需要進(jìn)行DMA請求例如,USART使用USART_DMACmd函數(shù)開始DMA傳輸后,處理器可以繼續(xù)執(zhí)行程序啟動DMA單元時鐘使用STM32庫函數(shù)

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMAx,ENABLE);DMAx是DMA1或DMA2直接寄存器編程通過允許RCC單元的AHB時鐘寄存器實(shí)現(xiàn)

RCC->AHBENR|=0x000000001; //允許DMA時鐘DMA初始化DMA初始化函數(shù)

voidDMA_Init(DMA_Channel_TypeDef*DMAy_Channelx,DMA_InitTypeDef*DMA_InitStruct)按照DMA_InitStruct結(jié)構(gòu)變量初始化DMAy通道x(y=1、2,x=1~12)DMA_InitStruct是指向DMA_InitTypeDef結(jié)構(gòu)體的指針,包含對DMA通道的配置信息幫助文檔DMA初始化結(jié)構(gòu)類型DMA_InitTypeDeftypedef

struct{uint32_tDMA_PeripheralBaseAddr; /*外設(shè)基地址*/uint32_tDMA_MemoryBaseAddr;/*存儲器基地址*/uint32_tDMA_DIR; /*傳輸方向:外設(shè)是源還是目的*/uint32_tDMA_BufferSize; /*緩沖區(qū)大小*/uint32_tDMA_PeripheralInc; /*外設(shè)地址是否增量*/uint32_tDMA_MemoryInc; /*存儲器地址是否增量*/uint32_tDMA_PeripheralDataSize; /*外設(shè)數(shù)據(jù)寬度*/uint32_tDMA_MemoryDataSize; /*存儲器數(shù)據(jù)寬度*/uint32_tDMA_Mode;

/*操作模式*/

uint32_tDMA_Priority; /*軟件優(yōu)先級*/uint32_tDMA_M2M; /*是否存儲器到存儲器傳輸*/}DMA_InitTypeDef;DMA_InitTypeDef成員-1成員1:DMA_PeripheralBaseAddr,外設(shè)基地址本例的外設(shè)是USART1數(shù)據(jù)寄存器(USART1_DR)需要用戶定義給出這個地址(STM32庫沒有定義)成員2:DMA_MemoryBaseAddr,存儲器基地址通常是用戶程序定義的主存緩沖區(qū)首地址成員3:DMA_DIR,傳輸方向選擇外設(shè)是源(DMA_DIR_PeripheralSRC)還是目的(DMA_DIR_PeripheralDST)成員4:DMA_BufferSize,緩沖區(qū)大小傳輸?shù)臄?shù)據(jù)量(直接給出數(shù)值)單位是成員7給出的DMA_PeripheralDataSizeDMA_InitTypeDef成員-2成員5:DMA_PeripheralInc,外設(shè)地址增量允許(DMA_PeripheralInc_Enable)禁止(DMA_PeripheralInc_Disable)成員6:DMA_MemoryInc,存儲器地址增量允許(DMA_MemoryInc_Enable)禁止(DMA_MemoryInc_Disable)成員7:DMA_PeripheralDataSize,外設(shè)數(shù)據(jù)寬度字節(jié)(DMA_PeripheralDataSize_Byte)半字(DMA_PeripheralDataSize_HalfWord)字(DMA_PeripheralDataSize_Word)DMA_InitTypeDef成員-3成員8:DMA_MemoryDataSize,存儲器數(shù)據(jù)寬度字節(jié)(DMA_MemoryDataSize_Byte)半字(DMA_MemoryDataSize_HalfWord)字(DMA_MemoryDataSize_Word)成員9:DMA_Mode,操作模式正常(DMA_Mode_Normal):一次性傳輸循環(huán)(DMA_Mode_Circular):自動重復(fù)傳輸DMA_InitTypeDef成員-4成員10:DMA_Priority,軟件優(yōu)先級選擇通道的4個優(yōu)先級之一很高(DMA_Priority_VeryHigh)高級(DMA_Priority_High)中級(DMA_Priority_Medium)低級(DMA_Priority_Low)成員11:DMA_M2M,存儲器到存儲器傳輸允許(DMA_M2M_Enable)禁止(DMA_M2M_Disable)DMA初始化配置頭文件dma.h配置DMA傳輸?shù)耐庠O(shè)基地址(USART1數(shù)據(jù)寄存器DR)(DMA_InitStructure.DMA_PeripheralBaseAddr)STM32庫的頭文件沒有定義USART1_DR地址查閱STM32參考手冊USART1的起始地址(0x40013800)數(shù)據(jù)寄存器DR在USART的偏移量(0x04)相加得到USART1_DR地址(0x40013804)

#defineUSART1_DR_Base0x40013804#defineSENDBUF_SIZE0x4000 //緩沖區(qū)大小voidDMA1_Config(void);DMA配置源文件dma.c-1/*DMA的中斷配置函數(shù)*/voidNVIC_Config(void){NVIC_InitTypeDef

NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel=DMA1_Channel4_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);}DMA配置源文件dma.c-2//USART1進(jìn)行DMA傳送的初始化配置(含中斷配置)uint8_t

SendBuf[SENDBUF_SIZE];//發(fā)送緩沖區(qū)voidDMA1_Config(void){DMA_InitTypeDefDMA_InitStructure;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE); NVIC_Config(); /*配置DMA中斷

*/

//設(shè)置DMA源:串口數(shù)據(jù)寄存器地址

DMA_InitStructure.DMA_PeripheralBaseAddr=USART1_DR_Base;DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)SendBuf;/*內(nèi)存地址(要傳輸?shù)淖兞康闹羔?*/

DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;/*方向:從內(nèi)存到外設(shè)*/DMA配置源文件dma.c-3

DMA_InitStructure.DMA_BufferSize=SENDBUF_SIZE; /*傳輸大小*/

DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable; /*外設(shè)地址不增*/

DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;

/*內(nèi)存地址自增*/

DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;

/*外設(shè)數(shù)據(jù)單位,字節(jié)*/

DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;

/*內(nèi)存數(shù)據(jù)單位,字節(jié)*/

DMA_InitStructure.DMA_Mode=DMA_Mode_Normal; /*DMA模式:一次傳輸,不循環(huán)*/DMA配置源文件dma.c-4

DMA_InitStructure.DMA_Priority=MA_Priority_Medium; /*優(yōu)先級:中*/DMA_InitStructure.DMA_M2M=DMA_M2M_Disable; /*禁止內(nèi)存到內(nèi)存的傳輸 */

DMA_Init(DMA1_Channel4,&DMA_InitStructure);

/*配置DMA1的4通道*/

DMA_Cmd(DMA1_Channel4,ENABLE); /*允許DMA1的4通道進(jìn)行DMA傳輸

*/

DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE); /*設(shè)置DMA1的4通道DMA傳輸完成產(chǎn)生中斷*/}幫助文檔進(jìn)行DMA傳輸?shù)闹鞒绦騧ain.c-1int

main(void){ inti; USART1_Config();

//

USART1配置:1152008-N-1

DMA1_Config();

LED_Config();

LED_Off_all(); //LED燈全滅

for(i=0;i<SENDBUFF_SIZE;i++) {SendBuf[i]='A'; //填充緩沖區(qū)

}進(jìn)行DMA傳輸?shù)闹鞒绦騧ain.c-2

printf("\r\nDMA傳輸開始\r\n"); //USART1接口發(fā)出DMA請求

USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE); LED_On(1); //點(diǎn)亮LED1燈

while(1) { //循環(huán)

}}中斷服務(wù)程序stm32f10x_it.cvoidDMA1_Channel4_IRQHandler(void){ //判斷是否為DMA發(fā)送完成中斷

if(DMA_GetFlagStatus(DMA1_FLAG_TC4)==SET)

{LED_On(2);

//LED2燈亮

DMA_ClearFlag(DMA1_FLAG_TC4);

//清除標(biāo)志

printf("\r\nDMA傳輸結(jié)束\r\n");} }8.3DMA、USART和GPIO的綜合應(yīng)用【例8-2】按鍵控制的應(yīng)用項目按下KEY1鍵,觸發(fā)KEY1中斷, 讓3個LED燈逐個點(diǎn)亮、并停留在LED3燈上按下KEY2鍵,觸發(fā)KEY2中斷,

讓主存數(shù)據(jù)DMA傳輸給USART1發(fā)送接口

DMA傳輸前、滅燈,DMA傳輸中、LED1燈亮,

DMA傳輸后、LED2燈亮USART接口連接PC機(jī)串口,

在PC機(jī)上查閱發(fā)送結(jié)果KEY2鍵中斷能夠打斷KEY1鍵中斷【例8-2】綜合應(yīng)用項目分析源程序文件文件功能led.c和led.hLED燈初始化和驅(qū)動程序key.c和key.h按鍵初始化和驅(qū)動程序key.ini軟件模擬按鍵的調(diào)試函數(shù)usart1.c和usart1.hUSART1初始化和驅(qū)動程序exti.c和exti.hEXTI初始化和驅(qū)動程序dma.c和dma.hDMA初始化和驅(qū)動程序nvic.c和nvic.hNVIC的中斷配置程序stm32f10x_it.c和stm32f10x_it.h中斷服務(wù)程序main.c主程序文件嵌入式系統(tǒng)導(dǎo)論主講教師:第9章STM32的定時器接口本章內(nèi)容提要9.1系統(tǒng)時鐘(SysTick)9.2STM32看門狗9.3STM32定時器(TIMx)9.4STM32實(shí)時時鐘(RTC)定時器基于計數(shù)器電路實(shí)現(xiàn)STM32微控制器的定時器接口系統(tǒng)時鐘(SysTick)看門狗WatchDog獨(dú)立看門狗(IWDG)獨(dú)窗口看門狗(WWDG)通用定時器基本定時器(TIM6和TIM7)通用定時器(TIM2、TIM3、TIM4和TIM5)高級控制定時器(TIM1和TIM8)實(shí)時時鐘RTC9.1系統(tǒng)時鐘(SysTick)Corte-M3在內(nèi)核包含的簡單定時器該定時器的時鐘源可以來自CM3內(nèi)部時鐘(FCLK),或CM3外部時鐘(STCLK)在STM32微控制器中,SysTick的時鐘源可以是:“AHB時鐘”、或者“AHB時鐘/8”SysTick定時器是一個24位遞減計數(shù)器設(shè)置初值、允許計數(shù),每來一個時鐘,計數(shù)值減1計數(shù)值減為0,計數(shù)器被自動載入初值、繼續(xù)計數(shù)同時內(nèi)部標(biāo)志COUNTFLAG被置位、并觸發(fā)中斷SysTick中斷連接中斷控制器NVIC,異常號為15SysTick寄存器SysTick是CM3內(nèi)核的定時單元參閱“Cortex-M3一般用戶手冊”(不是“STM32參考手冊”)寄存器縮寫寄存器中文名稱SysTick_CTRL控制和狀態(tài)寄存器SysTick_LOAD重載值寄存器SysTick_VAL當(dāng)前值寄存器SysTick_CALIB校準(zhǔn)值寄存器控制和狀態(tài)寄存器(SysTick_CTRL)用于控制SysTick工作和獲取計數(shù)歸0的狀態(tài)名稱功能ENABLE計數(shù)器使能:0=禁止SysTick定時器,1=允許SysTick定時器TICKINTSysTick異常請求使能:0=不觸發(fā)異常請求,1=觸發(fā)異常請求(中斷)CLKSOURCE選擇時鐘源:0=外部時鐘,1=處理器時鐘COUNTFLAG計數(shù)狀態(tài):上次讀取后定時器計數(shù)到0,返回1SysTick寄存器編程(1)禁止SysTick定時器(因為SysTick可能已經(jīng)被允許了)

SysTick->CTRL=0;//關(guān)閉SysTick(2)寫入重載值

SysTick->LOAD=256-1;//假設(shè)計數(shù)值為256(3)清除當(dāng)前值為0(向當(dāng)前值寄存器SysTick_VAL寫入任何值)

SysTick->VAL=0;(4)允許SysTick定時器

SysTick->CTRL=5;//使用處理器時鐘SysTick結(jié)構(gòu)定義系統(tǒng)時鐘SysTick屬于Cortex內(nèi)核部件驅(qū)動程序定義在core_cm3.h(不是core_cm3.c)文件SysTick寄存器的結(jié)構(gòu)類型

typedef

struct {__IOuint32_tCTRL; __IOuint32_tLOAD; __IOuint32_tVAL; __Iuint32_tCALIB; }SysTick_Type;有關(guān)地址定義的語句如下:

#defineSCS_BASE(0xE000E000) #defineSysTick_BASE(SCS_BASE+0x0010) #defineSysTick((SysTick_Type*)SysTick_BASE)SysTick配置函數(shù)_STATIC__INLINEuint32_tSysTick_Config(uint32_tticks){if((ticks-1UL)>SysTick_LOAD_RELOAD_Msk){return(1UL); }

SysTick->LOAD=(uint32_t)(ticks-1UL);NVIC_SetPriority(SysTick_IRQn,(1UL<<__NVIC_PRIO_BITS)-1UL);

SysTick->VAL=0UL;

SysTick->CTRL=SysTick_CTRL_CLKSOURCE_Msk|

SysTick_CTRL_TICKINT_Msk|

SysTick_CTRL_ENABLE_Msk;return(0UL);}初始化、并啟動SysTick計數(shù)器和中斷設(shè)置每隔ticks脈沖引起一次中斷配置成功返回0值,不成功則返回1值SysTick_Config函數(shù)-11、將ticks參數(shù)作為重載值賦給重載值寄存器(SysTick_LOAD)定時時間T是:T=ticks×(1/f)秒f是時鐘源的時鐘頻率2、使用NVIC_SetPriority函數(shù) 配置系統(tǒng)時鐘中斷(SysTickIRQ)為15如果要改變SysTick中斷的優(yōu)先級,使用

NVIC_SetPriority(SysTick_IRQn,...)(定義在core_cm3.h文件)SysTick_Config函數(shù)-23、復(fù)位SysTick計數(shù)器(清零)4、設(shè)置控制和狀態(tài)寄存器(SysTick_CTRL)允許計數(shù)和中斷選擇處理器時鐘源(STM32是“AHB時鐘”)如果使用STM32的“AHB時鐘/8”直接編程控制和狀態(tài)寄存器(SysTick_CTRL) 設(shè)置CLKSOURCE(D2位)為0使用STM32庫的SysTick_CLKSourceConfig函數(shù)(在misc.c文件中)SysTick應(yīng)用示例:精確定時SysTick可服務(wù)于操作系統(tǒng)也可用于精確定時、時間測量等系統(tǒng)時鐘72MHz,最小的計時單位(時鐘周期)(1/72)×10-6秒、即72分之一的微秒結(jié)合GPIO控制LED燈的示例【例9-1】使用SysTick精確的硬件定時主程序需要對SysTick進(jìn)行初始化例如配置1ms產(chǎn)生一次中斷SysTick初始化主程序SysTick_Config函數(shù)配置1ms產(chǎn)生一次中斷

if(SysTick_Config(SystemCoreClock/1000)){

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論