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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

嵌入式系統(tǒng)導論嵌入式系統(tǒng)導論主講教師:第6章CM3異常和STM32中斷本章內容提要6.1Cortex-M3的異常6.2STM32的中斷應用6.3EXTI應用示例:按鍵中斷數(shù)據(jù)傳送方式程序查詢傳送中斷傳送DMA傳送6.1Cortex-M3的異常異常(Exception)是導致程序流程改變的事件ARM的中斷(Interrupt)是異常的一種類型中斷通常由外設或外部輸入產生有些情況下也可以由軟件激發(fā)針對中斷的異常處理程序也被稱為中斷服務程序ISR異常由嵌套向量中斷控制器NVIC處理(NestedVectoredInterruptController)CM3異常的來源中斷請求IRQ(IntrruptRequest)通常來自片上外設或經(jīng)I/O端口的外部中斷輸入非屏蔽中斷NMI(Non-MaskableInterrupt)請求可來自看門狗定時器或供電電壓下降探測電路系統(tǒng)時鐘(滴答)SysTick,可以產生周期性中斷請求可用于嵌入式操作系統(tǒng)的時間記錄或者作為監(jiān)督的定時控制處理器本身也是異常事件的來源例如,失效事件、軟件異常等復位是一種特殊的異常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)先級以及處理器當前的優(yōu)先級有些異常(復位、NMI和HardFalult)具有固定優(yōu)先級是一個負值,表示其優(yōu)先級高于其他優(yōu)先級其他異常的優(yōu)先級可以編程確定,范圍是0~255異常優(yōu)先級數(shù)值越小、優(yōu)先權越高CM3支持3個固定最高優(yōu)先級和256級可編程優(yōu)先級但實際支持的優(yōu)先級有半導體芯片設計者決定多數(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ōu)先級3~8位的優(yōu)先級寄存器又分成兩個部分組優(yōu)先級(GroupPriority)確定是否可以打斷正在執(zhí)行的中斷,實現(xiàn)嵌套早期技術手冊中,被稱為搶占優(yōu)先級(Pre-emptionPriority)子優(yōu)先級(Sub-Priority)只用于在相同組優(yōu)先級,多個子優(yōu)先級同時出現(xiàn)時 高優(yōu)先權(低優(yōu)先級值)的異常首先被處理也有譯為響應優(yōu)先級嵌套向量中斷控制器NVICNVIC是處理器的一部分,可以編程處理異常和中斷的配置、優(yōu)先權和中斷屏蔽6.2STM32的中斷應用STM32具有多達68個中斷(不包括16個Cortex-M3中斷線)STM32把編號-3~6的中斷定義為系統(tǒng)異常編號7開始的是外部中斷(所有外設都具有中斷請求能力)編號為負的3個中斷不能設置優(yōu)先級其他都可以自行設置不同型號STM32微控制器的向量表略有區(qū)別啟動文件包含了其支持的所有中斷并給出了中斷服務函數(shù)名STM32

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

voidNVIC_PriorityGroupConfig(uint32_t

NVIC_PriorityGroup)參數(shù)NVIC_PriorityGroup對應5組分配形式NVIC_PriorityGroup_0~NVIC_PriorityGroup_4使用中斷一定要在工程項目中添加misc.c文件STM32的5組優(yōu)先級配置組號組(搶占)優(yōu)先級子(響應)優(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結構typedef

struct{uint8_tNVIC_IRQChannel;uint8_tNVIC_IRQChannelPreemptionPriority;uint8_tNVIC_IRQChannelSubPriority;

FunctionalState

NVIC_IRQChannelCmd;}

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

為每個中斷請求的GPIO引腳指明外部中斷EXTI線為每個中斷請求引腳進行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的復用功能(AFIO)時鐘STM32的I/O引腳,不僅能夠作為通用I/O端口GPIO還可以作為片上外設(如串口、ADC等)的I/O引腳這稱為復用I/O端口AFIO大多數(shù)GPIO都有默認的復用功能部分GPIO還有重映射功能把原來是A引腳的默認復用功能,映射到B引腳使用當把GPIO用作EXTI外部中斷或者使用重映象功能時必須在設置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初始化配置調用stm32f10x_exti.c中的EXTI初始化配置

voidEXTI_Init(EXTI_InitTypeDef*EXTI_InitStruct)參數(shù)EXTI_InitStruct是指向EXTI_InitTypeDef結構的指針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)等待中斷}中斷服務程序stm32f10x_it.c專用于編寫中斷服務函數(shù)中斷服務函數(shù)名必須與啟動代碼中定義的相同KEY1(PA0)的中斷服務函數(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ù),用于確認發(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)表明中斷還沒有處理結束嵌入式系統(tǒng)導論主講教師:第7章

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

CD:載波檢測(DCD)

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

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

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

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

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

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

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE)

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

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

RCC_APB2PeriphClockCmd(RCC_APB2Perih_GPIOA,ENABLE)

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

voidUSART_Init(

USART_TypeDef*USARTx,USART_InitTypeDef*USART_InitStruct)

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

struct{uint32_tUSART_BaudRate;/*通信波特率*/uint16_tUSART_WordLength;/*數(shù)據(jù)位數(shù)*/uint16_tUSART_StopBits;/*停止位數(shù)*/uint16_tUSART_Parity;/*校驗模式*/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ù)默認設備:鍵盤和顯示器要使用scanf和printf函數(shù),需要重定向將輸入的信息重新定向來自外設(USART1端口)將輸出的信息重新定向去到外設(USART1端口)用戶可以重新編寫C語言的庫函數(shù)當C編譯器檢查到與C庫函數(shù)相同名稱的函數(shù)時優(yōu)先采用用戶編寫的函數(shù),實現(xiàn)重定向1.編寫fputc函數(shù)2.編寫fgetc函數(shù)3.不使用半主機模式printfHello×USART的數(shù)據(jù)收發(fā)函數(shù)接收數(shù)據(jù)的函數(shù)uint16_tUSART_ReceiveData(USART_TypeDef*USARTx)函數(shù)調用的返回值就是最新接收的數(shù)據(jù)發(fā)送數(shù)據(jù)的函數(shù)voidUSART_SendData(USART_TypeDef*USARTx,uint16_tData)參數(shù)Data就是要發(fā)送的數(shù)據(jù)雖然是一個16位數(shù)據(jù),實際上只使用其低8位1.編寫fputc函數(shù)在C標準庫函數(shù)中,printf函數(shù)實質是一個宏需要調用fputc實現(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改變標志,UART4和UART5上不可用)·USART_FLAG_LBD(LIN中止檢測標志)·USART_FLAG_TXE(發(fā)送數(shù)據(jù)寄存器空標志)·USART_FLAG_TC(發(fā)送完成標志)·USART_FLAG_RXNE(接收數(shù)據(jù)寄存器非空標志)·USART_FLAG_IDLE(空閑線檢測標志)·USART_FLAG_ORE(溢出錯誤標志)·USART_FLAG_NE(噪聲錯誤標志)·USART_FLAG_FE(幀錯誤標志)·USART_FLAG_PE(校驗錯標志)返回值USART_FLAG說明置位(SET)或復位(RESET)幫助文檔2.

編寫fgetc函數(shù)標準輸入函數(shù)scanf函數(shù)通過調用fputc實現(xiàn)int

fgetc(int

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

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

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

清除中斷標志函數(shù)voidUSART_ClearITPendingBit(USART_TypeDef*USARTx,uint16_tUSART_IT)USART中斷標志和事件標志中斷請求中斷標志事件標志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中斷服務程序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;

……

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

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

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

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

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

struct{uint32_tDMA_PeripheralBaseAddr; /*外設基地址*/uint32_tDMA_MemoryBaseAddr;/*存儲器基地址*/uint32_tDMA_DIR; /*傳輸方向:外設是源還是目的*/uint32_tDMA_BufferSize; /*緩沖區(qū)大小*/uint32_tDMA_PeripheralInc; /*外設地址是否增量*/uint32_tDMA_MemoryInc; /*存儲器地址是否增量*/uint32_tDMA_PeripheralDataSize; /*外設數(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,外設基地址本例的外設是USART1數(shù)據(jù)寄存器(USART1_DR)需要用戶定義給出這個地址(STM32庫沒有定義)成員2:DMA_MemoryBaseAddr,存儲器基地址通常是用戶程序定義的主存緩沖區(qū)首地址成員3:DMA_DIR,傳輸方向選擇外設是源(DMA_DIR_PeripheralSRC)還是目的(DMA_DIR_PeripheralDST)成員4:DMA_BufferSize,緩沖區(qū)大小傳輸?shù)臄?shù)據(jù)量(直接給出數(shù)值)單位是成員7給出的DMA_PeripheralDataSizeDMA_InitTypeDef成員-2成員5:DMA_PeripheralInc,外設地址增量允許(DMA_PeripheralInc_Enable)禁止(DMA_PeripheralInc_Disable)成員6:DMA_MemoryInc,存儲器地址增量允許(DMA_MemoryInc_Enable)禁止(DMA_MemoryInc_Disable)成員7:DMA_PeripheralDataSize,外設數(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):自動重復傳輸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基地址(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進行DMA傳送的初始化配置(含中斷配置)uint8_t

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

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

*/

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

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

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

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

DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable; /*外設地址不增*/

DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;

/*內存地址自增*/

DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;

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

DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;

/*內存數(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; /*禁止內存到內存的傳輸 */

DMA_Init(DMA1_Channel4,&DMA_InitStructure);

/*配置DMA1的4通道*/

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

*/

DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE); /*設置DMA1的4通道DMA傳輸完成產生中斷*/}幫助文檔進行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ū)

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

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

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

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

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

if(DMA_GetFlagStatus(DMA1_FLAG_TC4)==SET)

{LED_On(2);

//LED2燈亮

DMA_ClearFlag(DMA1_FLAG_TC4);

//清除標志

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

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

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

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

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

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

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

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

typedef

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

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

if(SysTick_Config(SystemCoreClock/1000)){

溫馨提示

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

評論

0/150

提交評論