




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、2018 年物聯網實習學院:計通學院專業:物聯網工程班級(講臺):物聯 1602學號:41624637裝 訂 時 間:2018 年7 月 18 日科技大學實驗學院:計通學院專業:物聯網工程班級:物聯 1602:學號:41624637實驗日期:2018 年 7 月18 日實驗名稱:I/O 口位輸出(流水燈)實驗實驗目的:1.結合 MDK5,掌握 STM32 的編程與調試步驟。能理解 STM32 庫函數和寄存器編程的學會使用 I/O 口進行輸出的方法。能看懂控制輸出的關鍵代碼。5.能獨立完成最小系統板與模塊間的硬件接線。實驗材料硬件準備STM32 最小系統板一塊。流水燈模塊(發光二極管 8 個,3
2、30 電阻 8 個,排針 9P,萬能板一塊)。杜邦線 9 根。SWD 仿真器一個(或 CH340 串口線一根)。軟件準備:1.2.3.4.前提已經安裝好 MDK5,并成功。打開“庫函數”文件夾,將其中的“LED”文件夾。返回主目錄,打開“2. 流水燈”文件夾中的“USER”文件夾,粘貼。返回“2. 流水燈”文件夾,進入“USER”文件夾啟動工程文件。實驗內容:初始化內部 SysTick 定時器,為系統分配時鐘等。初始化外設,將 PA.0PA.7 引腳通過 void LED_Init(void)函數進行初始化,將上述的引腳設置為通用的 I/O 口,推挽輸出。循環改變引腳的電平特性。8 個 LED
3、,采用共陽設計,當引腳輸出低電平時,LED 燈被點亮;當引腳輸出時,LED 燈熄滅。在本實驗中,實驗過程:使用庫函數和寄存器兩種方法來設置 I/O 口的高低電平。初始化 LED,設置 PA0-PA7 為輸出口:void LED_Cfg(void)GPIO_InitTypeDef led_gpio;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);/ 使能端口A 的時鐘/* LED I/O 配置 */led_gpio.GPIO_Pin= GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2|GPIO_Pin_3|GPIO
4、_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6|GPIO_Pin_7;led_gpio.GPIO_Mode=GPIO_Mode_Out_PP;/通用推挽輸出led_gpio.GPIO_Speed=GPIO_Speed_2MHz;/2MHzGPIO_Init(GPIOA, &led_gpio);/* 配置完成后關閉所有 LED */LED1_OFF;LED2_OFF;LED3_OFF;LED4_OFF;LED5_OFF;LED6_OFF;LED7_OFF;LED8_OFF;設置 LED 的輸出狀態,并進行#define,使其更容易使用。/* 控制 LED1-LED4(直接操作寄
5、存器) */#define LED1_TOGGLEGPIOA-ODR = GPIO_Pin_0/ PA0 輸出相反狀態 -LED1 狀態反轉#define LED1_OFFGPIOA-BSRR = GPIO_Pin_0/ PA0 輸出- LED1關#defineLED1_ONGPIOA-BRR=GPIO_Pin_0/ PA0 輸出低電平LED1開#defineLED2_TOGGLEGPIOA-ODR =GPIO_Pin_1/LED2 狀態反轉#defineLED2_OFFGPIOA-BSRR =GPIO_Pin_1/LED2 關#defineLED2_ONGPIOA-BRR=GPIO_Pin_
6、1/LED2 開#defineLED3_TOGGLEGPIOA-ODR =GPIO_Pin_2#defineLED3_OFFGPIOA-BSRR =GPIO_Pin_2#defineLED3_ONGPIOA-BRR=GPIO_Pin_2#defineLED4_TOGGLEGPIOA-ODR =GPIO_Pin_3#defineLED4_OFFGPIOA-BSRR =GPIO_Pin_3#defineLED4_ONGPIOA-BRR=GPIO_Pin_3/* 控制 LED5-LED8(調用庫函數) */#define LED5_OFFGPIO_SetBits(GPIOA, GPIO_Pin_4)
7、/ PA4 輸出高電平 - LED5 關#define LED5_ONGPIO_ResetBits(GPIOA, GPIO_Pin_4)/ PA4 輸出低電平 - LED5 開#defineLED6_OFFGPIO_SetBits(GPIOA, GPIO_Pin_5)#defineLED6_ONGPIO_ResetBits(GPIOA, GPIO_Pin_5)#defineLED7_OFFGPIO_SetBits(GPIOA, GPIO_Pin_6)#defineLED7_ONGPIO_ResetBits(GPIOA, GPIO_Pin_6)#defineLED8_OFFGPIO_SetBit
8、s(GPIOA, GPIO_Pin_7)#defineLED8_ONGPIO_ResetBits(GPIOA,GPIO_Pin_7)在主函數中設置 while 循環,使其循環開關。while(1)LED1_ON;Delay_ms(200);LED1_OFF;LED2_ON;Delay_ms(200);LED2_OFF;LED3_ON;Delay_ms(200);LED3_OFF;LED4_ON;Delay_ms(200);LED4_OFF;LED5_ON;Delay_ms(200);LED5_OFF;LED6_ON;Delay_ms(200);LED6_OFF;LED7_ON;Delay_ms
9、(200);LED7_OFF;LED8_ON;Delay_ms(200);LED8_OFF;在此過程中需要實現基于 STM32 內部 SysTick 定時器的精確延時,分別實現了SysTick 定時器的初始化,以及毫秒(ms)、微妙(us)級別的精確延時。#include delay.hsic u8fac_us = 0;/us 延時倍乘數sic u16 fac_ms = 0;/ms 延時倍乘數void delay_init() /初始化延遲函數,SYSTICK 的時鐘固定為 HCLK 時鐘的 1/8SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_D
10、iv8);/ 選擇外部時鐘 HCLK/8fac_us=SystemCoreClock/8000000; /為系統時鐘的 1/8fac_ms=(u16)fac_us*1000;/非 ucos 下,代表每個 ms 需要的 systick 時鐘數void delay_us(u32 nus)/nus 為要延時的 us 數.u32 temp;SysTick-LOAD=nus*fac_us; /時間加載SysTick-VAL=0 x00;/清空計數器SysTick-CTRL|=SysTick_CTRL_ENABLE_Msk ;/開始倒數dotemp=SysTick-CTRL;while(temp&0 x0
11、1&!(temp&(1CTRL&=SysTick_CTRL_ENABLE_Msk;/關閉計數器SysTick-VAL =0X00;/清空計數器/SysTick-LOAD 為 24 位寄存器,所以,最大延時為:/nms=0 x*8*1000/SYSCLKvoid delay_ms(u16 nms)/SYSCLK為 Hz,nms為 ms, 對 72M 條件下,nmsLOAD=(u32)nms*fac_ms;/時間加載(SysTick-LOAD 為 24bit)SysTick-VAL =0 x00;/清空計數器SysTick-CTRL|=SysTick_CTRL_ENABLE_Msk ;/開始倒數d
12、otemp=SysTick-CTRL;while(temp&0 x01&!(temp&(1CTRL&=SysTick_CTRL_ENABLE_Msk;/關閉計數器SysTick-VAL =0X00;/清空計數器測試:程序成功運行后,8 個LED 燈會循環依次點亮熄滅??萍即髮W實驗學院:計通學院專業:物聯網工程班級:物聯 1602:學號:41624637實驗日期:2018年 7 月18 日實驗名稱I/O 口位輸入(按鍵)實驗實驗目的學習GPIO 口輸出的基本操作。掌握如何設定GPIO 口為通用I/O 口。掌握利用內部SysTick 定時器實現精確延時。實驗材料STM32 最小系統板一塊。流水燈模
13、塊。普通按鍵模塊。蜂鳴器模塊。SSWD 仿真器一個(或 CH340 串口線一根)。軟件準備:1.前提已經安裝好 MDK5,并成功。2.如流水燈實驗,將 led、bell 和 key 對應的文件夾拷到“USER”文件夾中,并在工程中添加。實驗內容初始化內部 SysTick 定時器、LED,為系統分配時鐘等。將 PB.8PB.11 引腳通過 Scan_Key_Configuration()函數進行初始化,將上述的引腳設置為通用的 I/O 口,上拉輸入。3. 通過直接操作庫函數方式或位帶操作方式來PB.8PB.11 引腳狀態來檢測按鍵是否按下。當有按下按鍵時,保存相應鍵值。主函數中根據鍵值來控制相應
14、的 LED 亮滅。實驗過程初始化 LED 燈、按鍵和蜂鳴器,設置控制 LED 和蜂鳴器的管腳為推挽輸出,檢測按鍵的管腳為上拉輸入。在這里設置 PA0-PA7 為 LED 燈的輸出口,不過用不了這么多,設置 PB0 控制蜂鳴器,PB8-PB11 為按鍵的輸 。void LED_Cfg(void)GPIO_InitTypeDef led_gpio;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);/ 使能端口A 的時鐘/* LED I/O 配置 */ led_gpio.GPIO_PinGPIO_Pin_3= GPIO_Pin_0 | GPIO
15、_Pin_1 | GPIO_Pin_2|GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6|GPIO_Pin_7;led_gpio.GPIO_Mode led_gpio.GPIO_Speed=GPIO_Mode_Out_PP; GPIO_Speed_2MHz;/ 通用推挽輸出/ 2MHzGPIO_Init(GPIOA, &led_gpio);/* 配置完成后關閉所有 LED */ LED1_OFF;LED2_OFF; LED3_OFF; LED4_OFF; LED5_OFF; LED6_OFF; LED7_OFF; LED8_OFF;void Bell_Cfg(void)
16、GPIO_InitTypeDef bell_gpio; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);/* 蜂鳴器 I/O 配置 */ bell_gpio.GPIO_Pin bell_gpio.GPIO_Mode bell_gpio.GPIO_Speed=GPIO_Pin_0; GPIO_Mode_Out_PP; GPIO_Speed_2MHz;/ 通用推挽輸出/ 2MHzGPIO_Init(GPIOB, &bell_gpio);/* 配置完成后關閉蜂鳴器 */ BELL_OFF;void Key_Cfg(void)GPIO_InitT
17、ypeDef key_gpio; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);/* 按鍵 I/O 配置 */key_gpio.GPIO_Pin= GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 GPIO_Pin_11;|key_gpio.GPIO_Mode = GPIO_Mode_IPU;/ 上拉輸入GPIO_Init(GPIOB, &key_gpio);在他們所對應的頭文件 key.h bell.h led.h 中,將幾個比較重要的庫函數進行#define 重定義,方便編程使用。讀按鍵使用 GPIO_Re
18、adInputDataBit 庫函數。#define KEY1_STA Key1 狀態 #define KEY2_STA Key2 狀態 #define KEY3_STA Key3 狀態 #define KEY4_STA Key4 狀態GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_8) / 讀按鍵GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9) / 讀按鍵GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10) / 讀按鍵GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) /
19、 讀按鍵還是使用GPIO_SetBits 和GPIO_ResetBits 庫函數來對控制蜂鳴器的管腳置1 和 0。#define #define #defineBELL_ON BELL_OFF BELL_TOGGLEGPIO_SetBits(GPIOB, GPIO_Pin_0) GPIO_ResetBits(GPIOB, GPIO_Pin_0)/ 蜂鳴器響/ 蜂鳴器停狀態反轉GPIOB-ODR = GPIO_Pin_0/至于 LED,可以參考流水燈實驗,使用 GPIO_SetBits 和 GPIO_ResetBits 庫函數來控制,在這里就不再解釋。下面開始進入主程序,要使用 while 循環
20、檢測按鍵是否有按下,然后還需要進行消抖,即檢測到按鍵按下后,執行相應的操作。在此過程中要等一會再次檢測,避免因按鍵抖動導致的電位變化,引起相應操作。while (1)/* 按鍵 Key1 和 Key3 */if (KEY1_STA = KEY_DN) |否有按鍵按下Delay_ms(1);(KEY3_STA = KEY_DN)/ 檢測是/ 延時消抖if (KEY1_STA = KEY_DN)while (KEY1_STA = KEY_DN); LED1_TOGGLE;else if (KEY3_STA = KEY_DN)while (KEY3_STA = KEY_DN); BELL_TOGGL
21、E;/ 確認是否按鍵 Key1 按下/ 等待按鍵/ 確認是否按鍵 Key3 按下/ 等待按鍵/* 按鍵 Key2 和 Key4 */if (KEY2_STA = KEY_DN) |否有按鍵按下Delay_ms(1);(KEY4_STA = KEY_DN)/ 檢測是/ 延時消抖if (KEY2_STA = KEY_DN)LED2_ON;while (KEY2_STA = KEY_DN); LED2_OFF;else if (KEY4_STA = KEY_DN)BELL_ON;while (KEY4_STA = KEY_DN); BELL_OFF;/ 確認是否按鍵 Key2 按下/ 確認是否按鍵
22、Key4 按下消抖的過程中,需要使用延時函數。不過這次沒有用到內部定時器,而是使用了簡單的循環進行計算延時。void Delay_ms(uu16_t i,16_t u16_Time_ms)j;/ 循環計數變量for (i = 0;i u16_Time_ms; i+)for (j = 0; j DR);的數據/接收到if(USART_RX_STA&0 x8000)=0)/接收未完成if(USART_RX_STA&0 x4000)/接收到了 0 x0dif(Res!=0 x0a)USART_RX_STA=0;/接收錯誤,重新開始else USART_RX_STA|=0 x8000;else /還沒
23、收到 0X0D/接收完成了if(Res=0 x0d)USART_RX_STA|=0 x4000;else USART_RX_BUFUSART_RX_STA&0X3USART_RX_STA+;=Res ;if(USART_RX_STA(USART_REC_LEN-1)USART_RX_STA=0;/接收數據錯誤,重新開始接收#ifdef OS_TICKS_PER_SEC了./如果時鐘節拍數定義了,說明要使用 ucosIIOS#endifExit();在 main 函數中,使用 while 循環使程序一直運行,借助接收狀態標記USART_RX_STA 的值,判斷是否有輸入以及它的長度值。如果有輸入
24、,則依次將緩沖區的內容寫入 DR 并發送出去。否則就過一段時間提示程序正在運行。 while(1)if(USART_RX_STA&0 x8000)len=USART_RX_STA&0 x3;/得到此次接收到的數據長度prf(rn 您發送的消息為:rn);for(t=0;tDR=USART_RX_BUFt;while(USART1-SR&0X40)=0);/等待發送結束prf(rnrn);/換行USART_RX_STA=0;elsetimes+; if(times%5000=0)prf(rn 串口實驗rn);if(times%200=0)prf(請輸入數據,以回車鍵結束rn);if(times%
25、30=0)LED0=!LED0;/閃爍 LED,提示系統正在運行. delay_ms(10);把程序到單片機,將 CH340 的 USB 端接電腦,接單片機的 5V,低電平接單片機的 GND,TXD 接單片機的 PA10,RXD 接單片機的 PA9.打開串口調試助手,設置好程序中相同的波特率,隨便輸入一個字符串,進行調試。測試調試助手的屏幕會顯示你發送給單片機,單片機又自動傳回的字符串??萍即髮W實驗學院:計通學院專業:物聯網工程班級:物聯 1602:學號:41624637實驗日期:2018年 7 月18 日實驗名稱定時器中斷實驗實驗目的學會使用 STM32 的通用定時器。結合中斷理解定時器的具
26、體應用。實驗材料 硬件準備:1.2.3.STM32 最小系統板一塊。LED 燈 1 個,杜邦線 2 根。SWD 仿真器一個(或 CH340 串口線一根)。軟件準備:1. MDK5。實驗內容TIM3 時鐘使能。初始化定時器參數,設置自動重裝值,分頻系數,計數方式等。設置定時器允許更新中斷。定時器中斷優先級設置。允許定時器工作,也就是使能定時器。編寫中斷服務函數。實驗過程先做一點零碎的工作,去 led.c 中設置 LED 燈初始化函數,以供正式實驗使用。本實驗中,只要 LED0 和LED1 就可以,LED0 用來表示程序正在運行,LED1 則用來表示定時器中斷的操作。void LED_Init(v
27、oid)GPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);/使,PB 端口時鐘/LED0-PA.0 端口配GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_
28、InitStructure);化GPIOA.8GPIO_SetBits(GPIOA,GPIO_Pin_0);/推挽輸出/IO 口速度為 50MHz/ 根據設定參數初始/PA.8 輸出高/LED1-PA.1 端口配置,GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;推挽輸出GPIO_Init(GPIOA, &GPIO_InitStructure);為 50MHz GPIO_SetBits(GPIOA,GPIO_Pin_1);/推挽輸出,IO 口速度/PD.2 輸出高進入time.c 中,設置TIM3 通用定時器的初始化函數。首 先 要 使 用 函 數 RCC_A
29、PB1PeriphClockCmd來使能 TIM3 ,再用 TIM_TimeBaseInit 函數來設置五個主要參數。在這個函數中,參數的設置也是通過結構體TIM_TimeBaseInitTypeDef 來進行的。和其他初始化函數不同的是,時鐘初始化函數中,會有兩個參數:arr 和psc。 PSC 是用來設置分頻系數n 的,該系數對時鐘進行分頻,也就是系統時鐘頻率的 n 分之一,然后提供給計數器,作為計數器的時鐘。arr 是設置自動重載計數周期值,從 0 計數到ARR 的值,就觸發一次中斷,然后再重新開始計數。該段代碼如下:RCC_APB1PeriphClockCmd(RCC_APB1Peri
30、ph_TIM3, ENABLE); /時鐘使能 TIM_TimeBaseStructure.TIM_Period = arr; /設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值計數到 5000 為 500msTIM_TimeBaseStructure.TIM_Prescaler =psc; /設置用來作為TIMx 時鐘頻率除數的預分頻值10Khz 的計數頻率TIM_TimeBaseStructure.TIM_ClockDivi= 0; /設置時鐘分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMo
31、de_Up;/TIM 向上計數模式TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx 的時間基數使用定時器中斷,就必須和使用其他中斷一樣,打開中斷并設置優先級。這段代碼非常類似,只不過這里改成了時鐘中斷。TIM_ITConfig(/使能或者失能指定的TIM 中斷TIM3, /TIM2TIM_IT_Update , ENABLE/使能);NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;/TIM3 中斷NVIC_InitStruct
32、ure.NVIC_IRQChannelPreemptionPriority = 0;/先占優先級 0 級NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;/從優先級 3 級 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /IRQ 通道被使能 NVIC_Init(&NVIC_InitStructure);/根據 NVIC_InitStruct 中指定的參數初始化外設 NVIC 寄存器剛才的步驟中是設置好了TIM3,最后還要用 TIM_Cmd(TIM3, ENABLE)函數來打開 TIM3,這點一定
33、不能忘記,很多人設置結束后忘記打開,導致時鐘中斷完全不能用,檢查半天才發現這里有一個BUG。到這里才算是完成TIM3 的初始化函數。下面來編寫 TIM3 中斷服務程序。該服務程序的很簡單:使用us 函數檢查時鐘中斷是否發生,如果發生了,就操作一下 LED1,TIM_GetITS然后清除中斷標志位。void TIM3_IRQHandler(void)/TIM3 中斷if (TIM_GetITSus(TIM3, TIM_IT_Update) != RESET) /檢查指定的TIM 中斷發生與否:TIM 中斷源);/ 清除 TIMx 的中斷待處理TIM_ClearITPendingBit(TIM3,
34、 TIM_IT_Update位:TIM 中斷源LED1=!LED1;main 函數中,需要設置一下中斷分組,并且調用 LED 和定時器的初始化函數。接下來的事情就是 while(1)循環,讓程序永遠運行下去,這個可以用 LED0 的閃爍來表示。測試后,LED1 以較快的速度不停閃爍,表示程序一直在循環運行中。LED2則以較慢的速度變化狀態(從亮變滅,或從滅變亮),每次變化表示時鐘中斷被觸發了一次??萍即髮W實驗學院:計通學院專業:物聯網工程班級:物聯 1602:學號:41624637實驗日期:2018年 7 月18 日實驗名稱發生器的使用實驗實驗目的1.2.3.理解(脈沖寬度調制)的基本原理。學
35、會設置輸出,了解參數影響。使用輸出三角波。實驗材料 硬件準備:1.2.3.STM32 最小系統板一塊。LED 燈 1 個,杜邦線 2 根。SWD 仿真器一個(或 CH340 串口線一根)。軟件準備:1. MDK5。實驗內容脈寬調制(,Pulse Width Modulation)是一種模擬控制方脈沖寬度調制,利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術。在宏觀上往往輸出“三角波”、“正弦波”這種高低不平的波形,但微觀上,它其實是控制占空比,輸出一系列幅值相等、脈沖長短來代替所需要的波形高度。對于周期內脈沖寬度不相等的脈沖,用這些要做的 LED 來說,輸出占空比越高,LED 看
36、起來就越亮,并不是輸出電壓越高就越亮的,一定要分清這個概念。使用,一般是結合定時器,不是定時器中斷,主要工作如下:開啟 TIM1 時鐘,配置 PA8 為復用輸出。設置 TIM1 的 ARR 和 PSC。3.設置 TIM1_CH1 的模式及通道方向, 使能 TIM1 的 CH1 輸出。4.5.6.使能 TIM1。設置 MOE 輸出,使能輸出。修改 TIM1_CCR1 來控制占空比。實驗過程先開啟 TIM1 的時鐘,這點相信大家看了這么多代碼,應該明白了。這里還要配置 PA8 為復用輸出,這是因為 TIM1_CH1 通道將使用 PA8 的復用功能作為輸出。因為 PA8 是復用輸出,所以也需要使通的
37、設置一下。8 的時鐘,接下來 PA8 還需要普RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA設時鐘使能/設置該引腳為復用輸出功能,輸出 TIM1 CH1 的ENABLE);/, ENABLE);/使能 GPIO 外脈沖波形GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; /TIM_CH1 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;/復用推挽輸出 GPIO_InitStructure.
38、GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);本身就是定時器產生的,本次實驗選用 TM1 定時器,這是一個高級定時器,設置方法和之前的 TM3 很相似,只不過必要的參數多了 1 個。同樣的,在這里用結構體來設置。TIM_TimeBaseStructure.TIM_Period = arr; /設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值80KTIM_TimeBaseStructure.TIM_Prescaler =psc; /設置用來作為 TIMx 時鐘頻率除數的預分頻值不分頻TIM_Time
39、BaseStructure.TIM_ClockDivi Tck_tim= 0; / 設置時鐘分割:TDTS =TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;上計數模式/TIM 向TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);/根據TIM_TimeBaseInitStruct 中指定的參數初始化 TIMx 的時間基數除了定時器實驗里介紹的 arr 和 psc 兩個寄存器(平時也是變量名)外,在這里要認識一下 CCR1 捕獲/比較寄存器。根據設置的極性不同,它可以一個變量,控制計數
40、器中的數大于或小于這個變量使,輸出占空比。脈沖,由此控制接下來,要設置 TIM1_CH1 為模式(默認是凍結的),因為的 LED都是低電平亮,而希望當 CCR1 的值小的時候,LED 就暗,CCR1 值大的時候,LED 就亮,所以在庫函數中要通過配置 TIM1_CCMR1 的相關位來控制 TIM1_CH1 的模式。通道設置是通過函數 TIM_OC1Init()TIM_OC4Init()來設置的,不同的通道的設置函數不一樣,這里TIM_OC1Init()。使用的是通道 1,所以使用的函數是TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_脈沖寬度調制模式 2
41、2; /選擇定時器模式:TIMTIM_OCInitStructure.TIM_OutputSe = TIM_OutputS出使能e_Enable; /比較輸TIM_OCInitStructure.TIM_Pulse = 0; /設置待裝入捕獲比較寄存器的脈沖值 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; / 輸 出 極性:TIM 輸出比較極性高TIM_OC1Init(TIM1, &TIM_OCInitStructure); /根據 TIM_OCInitStruct 中指定的參數初始化外設 TIMx回到主函數中,設置一個變量
42、 led0val 來控制占空比。這里要認識一下pare1()庫函數,它有兩個參數,第一個參數是定時器,第二個參數是一個小于 arr 的整數,它與 arr 的比值就是占空比。main(void)u16 led0val=0; u8 dir=1;delay_init();/延時函數初始化TIM1_Init(899,0);/不分頻。頻率=72000/(899+1)=80Khzwhile(1)delay_us(500); if(dir)led0val+;else led0 if(led0 if(led0val-; val300)dir=0; val=0)dir=1; pare1(TIM1,led0val
43、);測試直接將 PA8 和 PA0-PA7 中任何的呼吸燈現象。接起來即可,可以觀察到 LED 亮度循環變化科技大學實驗學院:計通學院專業:物聯網工程班級:物聯 1602:學號:41624637實驗日期:2018 年 7 月18 日實驗名稱板上串口 DMA 發送實驗實驗目的區分 DMA 和普通傳送方式的區別。學會使用 DMA 進行數據傳輸,體會使用 DMA 的優點。實驗材料 硬件準備:STM32 最小系統板一塊。CH340 串口線一根。軟件準備:MDK5。串接口調試助手。實驗內容1.2.3.4.使能 DMA 時鐘。初始化 DMA 通道 4 參數。使能串口 DMA 發送。使能 DMA1 通道 4
44、,啟動傳輸。5.查詢 DMA 傳輸狀態。實驗過程因為涉及時序問題,肯定是要對DMA 進行時鐘使能的。調用函數初始化DMA 的時候,需要用到三個參數:DMA 通道及其外設為串口、器,數據長度。接下來,需要用結構體 DMA_InitStructure 來配置 DMA。該結構體的變量較多,比較重要的有:DMA_PeripheralBaseAddr 用來設置 DMA 傳輸的外設址;數DMA_MemoryBaseAddr 為內存址,也就是存放 DMA 傳輸數據的內存地址;DMA_DIR 設置數據傳輸方向,決定是從外設數據到內存還送從內存數據發送到外設,也就是外設是源地還是目的地;DMA_Priority
45、 是中斷的優先級。其他的都是一些關于數據長度等具體方面的操作,有RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);可以探討一下。/使能 DMA 傳輸DMA_DeInit(DMA_CHx);dtr;/將 DMA 的通道 1 寄存器重設為缺省值DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;/DMA 外設 ADC址DMA_InitStructure.DMA_MemoryBaseAddr = cmar;/DMA 內存址DMA_InitStructure.DMA_DIR = DMA_DIR_Periphe
46、ralDST;/數據傳輸方向,從內存發送到外設DMA_InitStructure.DMA_BufferSize = cndtr;/DMA 通道的 DMA 緩存的大小DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;外設地址寄存器不變/DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;存器遞增/內存地址寄DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;/數據寬度為 8
47、 位DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; /數據寬度為 8 位DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;/工作在正常緩存模式 DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; /DMA 通道 x 擁有中優先級DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;/DMA 通道x 沒有設置為內存到內存傳輸DMA_Init(DMA_CHx, &DMA_InitStruct
48、ure);/根據 DMA_InitStruct 中指定的參數初始化 DMA 的通道 USART1_Tx_DMA_Channel 所標識的寄存器在主函數中,要使能串口的 DMA 功能:USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);使能串口 DMA 后,在使用 DMA 的時候,要使能通道,這個是在 DMA 的調用函數中進行的。DMA_Cmd(DMA_CHx, ENABLE);/使能 USART1 TX DMA1 所指示的通道main.c 中設置一個字符串,將其存入 DMA 的發送區中。DMA 的發送長度在第一步中都有設置,現在可以直接用了。址以及const
49、 u8 TEXT_TO_SEND=科技大學 DMA 串口實驗;for(i=0;iTEXT_LENTH;i+)/填充 ASCII 字符集數據SendBuffi=TEXT_TO_SENDi;/TEXT_TO_SEND 語句SendBuffTEXT_LENTH=0 x0d; /換行符占 2 個字符SendBuffTEXT_LENTH+1=0 x0a;在主函數中循環輸出。注意在實際過程中,發出傳輸命令后可以去做一些別的事,結束之后再回來檢查有沒有傳輸完成。在本實驗中就不過多演示。 while(1)USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);MYDMA_Ena
50、ble(DMA1_Channel4);/開始一次 DMA 傳輸!/等待 DMA 傳輸完成,此時來做另外一些事,點燈/實際應用中,傳輸數據期間,可以執行另外的任務while(1)if(DMA_GetFlagSus(DMA1_FLAG_TC4)!=RESET)/等待通道 4傳輸完成DMA_ClearFlag(DMA1_FLAG_TC4);/清除通道 4 傳輸完成標志break;delay_ms(100);CH340 線連接電腦和單片機,打開串口調試助手,注意設置波特率為 9600。測試CH340 接線參考串口通信實驗,打開調試助手后,每秒會自動接收一條信息“科技大學 IMA 串口實驗”,完全一樣。
51、科技大學實驗學院:計通學院專業:物聯網工程班級:物聯 1602:學號:41624637實驗日期:2018年 7 月18 日實驗名稱ADC 模數轉換實驗實驗目的1.2.3.了解 ADC 工作原理。 掌握 ADC 的配置方法。結合串口,了解 ADC 常用的使用方法。實驗材料 硬件準備:1.2.3.STM32 最小系統板一塊。CH340 串口線一根。單獨的杜邦線一根(接電壓信號用)。軟件準備:MDK5。串接口調試助手。實驗內容1.2.3.4.使能 DMA 時鐘。初始化 DMA 通道 4 參數。使能串口 DMA 發送。使能 DMA1 通道 4,啟動傳輸。5.查詢 DMA 傳輸狀態。實驗過程ADC 通道
52、 1 在 PA1 上,所以,先要使能PORTA 的時鐘,然后設置 PA1 為模擬輸入。使能 GPIOA 和 ADC 時鐘用 RCC_APB2PeriphClockCmd 函數,設置 PA1 的輸入方式,使用 GPIO_Init 函數即可。開啟 ADC1 時鐘之后,要復位 ADC1,將 ADC1 的全部寄存器重設為缺省值之后就可以通過 RCC_CFGR 設置 ADC1 的分頻因子。分頻因子要確保 ADC1 的時鐘(ADCCLK)不要超過 14Mhz,否則容易失靈。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1,E
53、NABLE );/使能 ADC1 通道時鐘RCC_ADCCLKConfig(RCC_PCLK2_Div6);/設置 ADC 分頻因子 6 72M/6=12,ADC最大時間過 14M/PA1 作為模擬通道輸入引腳GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure);/模擬輸入引腳下面開始用結構體 ADC_InitStructure 進行 ADC1 的模式配置,設置單次轉換模式、觸發方式選擇、數據對齊方
54、式等都在這一步實現。同時,還要設置ADC1 規則序列的相關信息,這里只有一個通道,并且是單次轉換的,所以設置規則序列中通道數為 1。ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;式:ADC1 和 ADC2 工作在獨立模式/ADC工 作 模ADC_InitStructure.ADC_ScanConvMode = DISABLE; /模數轉換工作在單通道模式ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; /模數轉換工作在單次轉換模式ADC_InitStructure.ADC_Externa
55、lTrigConv/轉換由軟件而不是外部觸發啟動=ADC_ExternalTrigConv_None;ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;對齊/ADC 數據右 ADC_InitStructure.ADC_NbrOfChannel = 1;道的數目/順序進行規則轉換的 ADC 通ADC_Init(ADC1, &ADC_InitStructure);數初始化外設 ADCx 的寄存器/根據 ADC_InitStruct 中指定的參使能并校準 ADC1 是非常重要的,不像其他固件,ADC 的使能速度較慢,并且不校準的話會使結果有很
56、大偏差。在這里需要一段確定使能和校準完畢的代碼。ADC_Cmd(ADC1, ENABLE);/使能指定的 ADC1ADC_ResetCalibration(ADC1); /使能復位校準while(ADC_GetResetCalibrationSus(ADC1);/等待復位校準結束ADC_StartCalibration(ADC1); /開啟 AD 校準while(ADC_GetCalibrationSus(ADC1); /等待校準結束設置結束后,就可以用庫函數來ADC 的值了。要做的就是設置規則序列 1 里面的通道,采樣順序,以及通道的采樣周期,然后啟動 ADC 轉換。在轉換結束后,ADC 轉
57、換結果值。ADC_RegularChannelConfig()函數可以設置規則序列通道以及采樣周期,再用 ADC_SoftwareStartConvCmd() 函 數 來 從 軟 件 開 啟 ADC , 之 后 可 以 用ADC_GetConverValue()函數獲取轉換結果。這里采用了多次采樣取平均值,使結果更加準確。u16 Get_Adc(u8 ch)/設置指定 ADC 的規則組通道,一個序列,采樣時間ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );/ADC1,ADC 通道,采樣時間為 239.5 周期A
58、DC_SoftwareStartConvCmd(ADC1, ENABLE);/使能指定的 ADC1 的軟件轉換啟動功能while(!ADC_GetFlagSus(ADC1, ADC_FLAG_EOC );/等待轉換結束return ADC_GetConver轉換結果Value(ADC1);/返回最近一次 ADC1 規則組的u16 Get_Adc_Average(u8 ch,u8 times)u32 temp_val=0; u8 t;for(t=0;ttimes;t+)temp_val+=Get_Adc(ch); delay_ms(5);return temp_val/times;這次照例要用串
59、口發送結果給電腦,不過不用傳統方法和 DMA,這里可以直接用 PRF 在串口助手打印,和普通的C 語言一樣。main(void)u16 adcx; float temp;delay_init(); uart_init(9600); Adc_Init(); while(1)/延時函數初始化/串口初始化為 9600/ADC 初始化adcx=Get_Adc_Average(ADC_Channel_1,10);prf(讀到的 ADC 值是%drn,adcx);temp=(float)adcx*(3.3/4096); adcx=temp;prf(測得的電壓為%f 伏rnrn,temp);delay_ms
60、(500);測試CH340 接線參考串口通信實驗,PA1 連接 GND 端或 3.3V手后,隔一段時間會收到單片機的測試值。,打開調試助科技大學實驗學院:計通學院專業:物聯網工程班級:物聯 1602:學號:41624637實驗日期:2018年 7 月18 日實驗名稱I/O 口組輸出(掃描數碼管)實驗實驗目的理解數碼管顯示字形的原理。理解數碼管位選掃描的原理。實驗材料 硬件準備:1.2.3.STM32 最小系統板一塊。數碼管模塊。SWD 仿真器一個(或 CH340 串口線一根)。軟件準備:1.MDK5。實驗內容1.2.3.4.關閉 SWD 調試功能。初始化 I/O 口,并進行時鐘使能。設置數碼管
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 冠狀動脈造影及支架植入術
- 2-6邏輯運算的公式
- 原發性肝癌患者護理查房 2
- 上海市浦東新區浦東2025年招生伯樂馬模擬考試(三)生物試題含解析
- 山西財經大學華商學院《中外設計史》2023-2024學年第二學期期末試卷
- 上海海關學院《數理統計理論與方法》2023-2024學年第一學期期末試卷
- 新疆伊寧市第七中學重點達標名校2025年高中畢業班零診模擬考試英語試題含答案
- 山西警官職業學院《藥物分離工程》2023-2024學年第一學期期末試卷
- 九江理工職業學院《影視專業英語》2023-2024學年第一學期期末試卷
- 南京師范大學泰州學院《電氣安全》2023-2024學年第二學期期末試卷
- 第6-2章生料粉磨和熟料粉磨
- 2023年廣東學位英語試題學位英語考試真題(含答案)
- 冒泡排序算法課件
- 粵教版五年級下冊科學知識點
- 文言文《守株待兔》說課稿課件
- 生物礦物課件
- GB∕T 36765-2018 汽車空調用1,1,1,2-四氟乙烷(氣霧罐型)
- DB34-T 4243-2022 智慧醫院醫用耗材SPD驗收規范
- 《覺醒年代》朗誦稿
- 混凝土格構梁護坡施工方案設計
- 小學教育專業畢業論文
評論
0/150
提交評論