freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

六腳爬蟲機器人的機械結構以及控制程序設計(編輯修改稿)

2025-07-20 00:42 本頁面
 

【文章內(nèi)容簡介】 特率的配置,對于PSCU板,其所需波特率為2400bps,(ZIGBEE)則需要9600bps,需對USART重新配置。而是否需要USART時鐘配置,則根據(jù)實際需要,如果單純是控制舵機,時鐘配置這一段可省略。當然在配置USART之前需要進行兩項工作,首先和GPIO一樣需配置時鐘:RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE)。因為STM32板有多個USART串口,常用的有1~3,而USARTUSART3的時鐘配置不同于USART1,因為它們在APB1上,而后者在APB2上。應如下配置:RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE)。配置完時鐘,便需配置GPIO口,U1在上節(jié)已配置,UU3的配置與U1一致,但是需要更換I/O口。具體見下表:USARTPINGPIOAFIOUSART1TXPA9PB6RXPA10PB7USART2TXPA2PD5RXPA3PD6USART3TXPB10PC10(PD8)RXPB11PC11(PD9) 串行通信GPIO口及復用GPIO口注:表中的AFIO列為復用I/O口配置完USART后,便是如何使用了,這包括數(shù)據(jù)發(fā)送和接收。㈠發(fā)送單個字節(jié)函數(shù)一:char ser_putbyte (char data) {USART_SendData(USART1, (unsigned char) data)。 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)。 USART1DR = (data amp。 0xFF)。 return (data)。} 函數(shù)二:int SendChar (int ch){ USART_SendData(USART1, (unsigned char) ch)。 while (!(USART1SR amp。 USART_FLAG_TXE))。 return (ch)。 }上述兩個函數(shù)的功能等同,在寫程序時可以隨意調(diào)用,()函數(shù)便調(diào)用了上述的函數(shù)一。㈡接收一個字節(jié)u8 RByte(void){ u8 out=0。 while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET){} //等待接收完畢 out = (USART_ReceiveData(USART1))。 //接收一個字節(jié) return out。 } 該函數(shù)用于接收單個字節(jié),在無線通信時可用到。㈢發(fā)送一個字符串void Print_String(u8 *p)//發(fā)送一串數(shù)據(jù) { while(*p) { USART_SendData(USART1, *p++)。 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) {} } } 當連續(xù)發(fā)送的字符很多時,可以選用該函數(shù)以字符串形式發(fā)送。㈣接收一個字符串void SerialIn(u8 *buf,u8 len){ unsigned char i。 for (i = 0。 i len。 i++) buf[i] = RByte()。 }同樣,當需要連續(xù)發(fā)送多個字節(jié)數(shù)據(jù)時,則可選用該函數(shù)。上面提到的都是USART1的設置以及拓展功能函數(shù)的書寫。而其它串口通信的設置與U1一致,功能函數(shù)則只需將U1換成U2或U3即可。由于主板的問題,本項目中并未使用UU3來實現(xiàn)其它串口通信,而是將所有的串口通信均由U1來實現(xiàn),這也是權宜之計,即采用分時復用的原理。具體說來,就是發(fā)聲傳感器和無線傳感器都需要通過異步傳輸來與處理器通信。對于每個傳感器以及PSCU,它們能夠識別的信號是由特定字符串組成的。這樣,只要將PAPA10口多引出幾個引腳,分別接到傳感器以及PSCU的相應口即可,在傳輸指令時,分時傳送,對于無法識別的字符串,則不處理,這樣便解決了串口不夠的問題。如果要實現(xiàn)搶占,則將它們配置成中斷模式即可,并配置好優(yōu)先級。 外部中斷設置與應用當主控制板遇到異常時,便會觸發(fā)中斷,并進行處理。NVIC,中文叫做嵌套矢量中斷控制器,是用來處理中斷的對于STM32F107的普通用戶來說,只要掌握EXTI線中斷,USART中斷以及TIM中斷即可。下面僅對EXTI中斷作簡略介紹。外部中斷/事件控制器(EXTI)由19個產(chǎn)生事件/中斷請求的邊沿檢測器組成。每個輸入線可獨立地配置輸入類型和對應的觸發(fā)事件(上升沿、下降沿或雙邊沿觸發(fā))每個輸入線都可以被獨立地屏蔽,由掛起寄存器保持著狀態(tài)線的中斷要求。如果要產(chǎn)生外部中斷,首先必須配置好并激活中斷線。配置內(nèi)容包括:根據(jù)需要的邊沿檢測設置2個觸發(fā)寄存器、在中斷屏蔽寄存器的相應位寫1以允許中斷請求。當外部中斷線上出現(xiàn)設定的邊沿信號時,將產(chǎn)生一個中斷請求等待處理。完成中斷服務后,可以清除該中斷請求。下面具體介紹如何配置硬件中斷/事件請求。(1)首先要了解中斷線與I/O口的關系,PA~PE的0~15口分別對應EXTI的0~15口;EXTI16與PVD輸出連接、EXTI17與RTC鬧鐘事件連接、EXTI18與USB喚醒事件連接。 中斷線與GPIO口對應關系(2)對EXTI線配置,以EXTI0為例,配置函數(shù)如下:void NVIC_Configuration(void){ NVIC_InitTypeDef NVIC_InitStructure。 ①ifdef VECT_TAB_RAMNVIC_SetVectorTable(NVIC_VectTab_RAM,0x0)。 ②elseNVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0)。 ③endif NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1)。 ④ = EXTI0_IRQn。 ⑤ = 1。 ⑥ = 0。 ⑦ = ENABLE。 ⑧NVIC_Init(amp。NVIC_InitStructure)。 } ⑨①~③為中斷地址配置;④表示選擇優(yōu)先級1組,即占先式優(yōu)先級以1位數(shù)字表示,副優(yōu)先級以三位數(shù)字表示, 中斷優(yōu)先級分組⑤表示選用EXTI0中斷線,注意在有些教材中等號右邊為EXTI0_IRQChannel,但在實際操作中,可能無法編譯,應寫成上面形式。如果是選用中斷線EXTI11,應寫作EXTI15_10_IRQn;EXTI8則為EXTI9_5_IRQn。⑥為配置占先式優(yōu)先級(主優(yōu)先級):高占先式優(yōu)先級的中斷會打斷當前的主程序/中斷程序運行,即所謂的中斷嵌套。優(yōu)先級數(shù)值越大,優(yōu)先級越低。⑦為配置副優(yōu)先級(子優(yōu)先級):在占先式優(yōu)先級相同的情況下。在低副優(yōu)先級中斷運行中,高副優(yōu)先級的中斷要等待已被響應的低副優(yōu)先級中斷執(zhí)行結束后才能得到響應—非搶斷式響應(不能嵌套)。但如果同時這兩個中斷同時到達,則先執(zhí)行中斷優(yōu)先級高的,執(zhí)行完后,再執(zhí)行低優(yōu)先級中斷;如果兩個中斷的所有優(yōu)先級均一樣,則哪個中斷先到達,就先執(zhí)行哪個中斷。對于副優(yōu)先級,數(shù)值越大,優(yōu)先級越低。(3)對中斷線進行I/O口配置,每個中斷線對應5個I/O口,所以在使用前,一定要先進行I/O口配置。仍以EXTI0為例,由開發(fā)板原理圖可知,PA0可直接配置為EXTI0中斷,無需電路設計。如有需要,配置其它中斷。 PA0中斷線電路配置程序為:void EXTI_Configuration(void){ EXTI_InitTypeDef EXTI_InitStructure。 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0)。 ① = EXTI_Line0。 ② = EXTI_Mode_Interrupt。 = EXTI_Trigger_Falling。 ③ = ENABLE。 EXTI_Init(amp。EXTI_InitStructure)。 }①即表示選用PA0配置中斷;②表示中斷線為EXTI0。③表示下降沿觸發(fā)中斷。(4)配置中斷處理程序外部中斷關鍵在于使用,下面為通過EXTI0中斷來控制LED燈的程序:void EXTI0_IRQHandler(void){ if(EXTI_GetITStatus(EXTI_Line0)!= RESET) { ledflash()。 //LED閃爍函數(shù), EXTI_ClearITPendingBit(EXTI_Line0)。 //清除中斷屏蔽位 } } 只要改變ledflash()行,即可在中斷產(chǎn)生時,進入不同的中斷處理程序。由此多配置幾個中斷線,并配合行走程序,便可設計一個手柄(或控制面板)來控制使機器人完成前進后退等動作。 在開發(fā)板上還配備一個PC13的中斷引腳,其電路圖與PA0一致,但是在調(diào)試過程中卻出現(xiàn)了bug,無法調(diào)通。雖然沒有進行任何重映射,但程序中必須加入AFIO使能這一行,PC13的中斷程序才能執(zhí)行。在調(diào)試過程中需要注意這一點。 系統(tǒng)時鐘與定時器設置與應用CortexM3 的內(nèi)核中包含一個4 位的遞減計數(shù)器——SysTick 時鐘。當設定了SysTick的初值并使能后,每經(jīng)過 1 個系統(tǒng)時鐘周期,計數(shù)值就減 1。當計數(shù)到 0 時,SysTick 計數(shù)器便自動重裝初值并繼續(xù)計數(shù),同時內(nèi)部的 COUNTFLAG 標志會置位,觸發(fā)中斷 (如果中斷使能情況下)。由此,可以利用Systick的上述特點,來編寫Delay()函數(shù),來實現(xiàn)精確延遲。系統(tǒng)時鐘為 72MHz,SysTick 的最高頻率為9MHz(最大為HCLK / 8),那么每次計數(shù)器減1 所用的時間是1/9M,計數(shù)器的初值如果是9,那么每次計數(shù)器減到0,時間經(jīng)過(1/9M) * 9= ,即1μs。首先書寫延遲的初始化程序:void delay_init(char SYSCLK) { SysTickCTRL amp。= 0xfffffffb。 ① fac_us = SYSCLK / 8。 ② fac_ms = (int)fac_us * 1000。 ③ fac_s = (int)fac_ms * 1000。 } ④①根據(jù)STK控制寄存器知,將0~2位設置成3,16位設置為1,則意味著:開啟Systick功能、開啟Systick中斷、使用HCLK/8作為Systick時鐘、上次讀取本寄存器后,Systick已經(jīng)數(shù)到了0;②根據(jù)①選用的時鐘書寫,調(diào)用時應寫作delay_init(72);③、④可根據(jù)需要書寫。然后書寫延遲程序,以毫秒延遲為例:void delay_ms(int nms) { //毫秒級延遲 u32 temp。 SysTickLOAD = (u32)nms * fac_ms。 //load the time SysTickVAL = 0x00。 //clear the counter SysTickCTRL = 0x01 。 //start the counter do { temp = SysTickCTRL。 } while(temp amp。 0x01 amp。amp。 !(temp amp。 (116)))。//wait for the time SysTickCTRL = 0x00。 //close the counter SysTickVAL = 0X00。 //clear the counter }該程序即是指當計數(shù)到設定值后,Systick的第16位控制位會自動清零,從而使函數(shù)結束,停止計數(shù),達到精確延時的目的。在實際應用中,當配置了延遲秒級的函數(shù)時,同樣會出現(xiàn)問題,可能是計數(shù)器溢出,無法延遲到設定值,此時不妨將原先的函數(shù)分多段書寫,例如如果需要延遲10s,可以寫兩行delay_s(5)。 定時器配置STM32F10x處理器內(nèi)部有4個定時器,其中TIM1為高級控制定時器,TIMTIM3和TIM4為3個獨立的通用定時器。通用定時器是一個可編程預分頻器驅動的16位自動裝載計數(shù)器,適用于多種場合。通用定時器是完全獨立地,它們可以一起同步工作。以配置TIM2為例,其程序如下:void TIM2_Configuration(void){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure。 = 0xffff。 ① = 71。 ② = 0x0。 ③ = TIM_CounterMode_Up。 ④ TIM_TimeBaseInit(TIM2, amp。TIM_TimeBaseStructure)。 }
點擊復制文檔內(nèi)容
高考資料相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1