




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
項目1搭建STM32開發環境任務1.1認識STM32F407開發板表1-1STM32F407開發板的外設引腳端口外設IO端口引腳外設IO端口引腳紅色LED0PF921按鍵KEY0PE43綠色LED1PF1022按鍵KEY1PE32蜂鳴器BEEPPF820按鍵KEY2PE21紅外接收端REMOTEPA8100按鍵KEY_UPPA034光敏傳感器LIGHT_SENSORPF719USB接口的電源控制腳USB_PWRPA15110溫濕度傳感器接口DHT11、DS18B20PG9124OLED/CAMERA接口的D1腳PC797
任務1.3創建STM32工程表1-2LED引腳的GPIO配置外設名(用戶標簽)IO引腳引腳模式(輸入/輸出)輸出電平(高/低)輸出模式(推挽/開漏)上拉/下拉傳輸速度LED0PF9輸出高推挽上拉高速LED1PF10輸出高推挽上拉高速任務實施2:MDK中編寫控制LED代碼步驟3:編寫控制LED閃爍的代碼intmain(void){HAL_Init(); /*初始化硬件抽象層HAL函數*/SystemClock_Config(); /*系統時鐘配置函數*/MX_GPIO_Init(); /*GPIO初始化函數*/while(1){……}}
任務1.4程序下載與調試拓展訓練:聲光報警器設計圖1-78LED和蜂鳴器的電路連接原理圖表1-5GPIO配置參數外設名IO引腳引腳模式(輸入/輸出)輸出初始電平(高/低)輸出模式(推挽/開漏)上下拉傳輸速度LED0PF9輸出高推挽上拉LED1PF10輸出低推挽上拉BEEPPF8輸出低推挽下拉備注:上表中的速度可以自己設定3.編寫代碼,編譯工程實現功能:蜂鳴器發聲,每秒鳴叫兩次。當蜂鳴器響時綠燈點亮,蜂鳴器不響時,紅燈點亮。while(1){/*USERCODEBEGIN3*/ HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10);//GPIO引腳電平翻轉 HAL_Delay(250);//延時}/*USERCODEEND3*/4.程序下載與調試1.通過USB連接開發板與計算機,使用串口下載。2.打開FlyMcu軟件,點擊瀏覽按鈕,打開蜂鳴器工程的1-2BEEP.hex文件。3.選擇串口,設置串口波特率為115200。4.勾選“編程前重裝文件”和勾選“編程后執行”。5.軟件界面左下方選擇“DTR的低電平復位,RTS高電平進BootLoader”選項,以實現一鍵下載功能。6.點擊“開始編程”按鈕,一鍵下載代碼到STM32上,下載成功后觀察是否實現現象是否符合預期目標。
思考練習一、單選題(C)1.STM32是基于ARM內核的幾位MCU系列芯片?A.8 B.16 C.32 D.64(C)2.STM32F4具有片上閃存是幾字節的?A.128KB B.512KB C.1M D.2M(D)3.STM32F4ZG芯片的引腳個數共有多少個?A.32 B.64 C.100 D.144(B)4.STM32F4芯片的CPU最大運算速度可達到多少MHz?A.256 B.168 C.144 D.128(A)5.探索者開發板上STM32F407芯片的PG6引腳,除了連接對應的IO引腳以外還連接了以下哪個模塊電路?A.WIRELESS B.FLASH C.SDCARD D.USB(A)6.STM32工程中,以下哪個文件夾放置了main.c文件?A.CORE/src B.CORE/inc C.DEVICE/CMSIS/src DEBUG二、填空題1.STM32F407ZG芯片上共有(114)個IO引腳,其中有(7)組IO寄存器,每組(16)個IO口。2.本書的STM32F4開發板中采用的MUC芯片是(STM32F407ZGT6)型號。3.CMSIS標準是“ARMCortex(微控制器軟件接口)標準”。4.STM32F407探索者開發板上的LED0和LED1是通過MCU輸出(低)電平點亮的,因此上下拉模式應配置為(上拉)。5.STM32F4采用一鍵下載電路,是利用串口的DTR和RTS信號,分別控制STM32的復位和B0,配合上位機軟件(FLYMCU)進行下載,需要設置:DTR(低)電平復位,RTS(高)電平進BootLoader。三、判斷題(對)1.STM32F4支持FPU(浮點運算)和DSP指令(對)2.STM32F407探索者開發板的復位按鍵是采用高電平復位。(錯)3.采用ST-LINK下載程序時,可以直接采用ST-LINK連接線直接供電。(對)4.串口下載程序時,可以直接采用USB串口供電。
項目2LED控制設計任務2.1八位跑馬燈設計2.1.2STM32F4的GPIO及其配置#include"gpio.h"voidMX_GPIO_Init(void){GPIO_InitTypeDefGPIO_InitStruct={0};/*使能GPIO時鐘*/__HAL_RCC_GPIOF_CLK_ENABLE();__HAL_RCC_GPIOH_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/*配置GPIO引腳的輸出初始電平為電平,LED會熄滅還是點亮?*/HAL_GPIO_WritePin(GPIOF,LED0_Pin|LED1_Pin,GPIO_PIN_SET);/*配置GPIO引腳*/GPIO_InitStruct.Pin=LED0_Pin|LED1_Pin; /*配置PF9和PF10引腳*/GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP;/*配置為輸出推挽模式*/GPIO_InitStruct.Pull=GPIO_PULLUP; /*配置為上拉*/GPIO_InitStruct.Speed=GPIO_SPEED_FREQ_HIGH;/*配置輸出速度為50MHz*/HAL_GPIO_Init(GPIOF,&GPIO_InitStruct); /*初始化F組IO*/}2.1.3GPIO相關的API函數【思考】GPIO端口使用用戶標簽方法編寫代碼,填入下列空位,實現對應的GPIO函數功能。1.寫GPIO引腳電平,使其輸出高、低電平:(1)使紅燈LED0點亮函數:HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_RESET);(2)使紅燈LED0熄滅函數:HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_SET);2.使紅燈輸出電平翻轉函數:HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);3.讀取紅燈引腳電平的函數:HAL_GPIO_ReadPin(LED0_GPIO_Port,LED0_Pin);任務實施步驟1:跑馬燈硬件電路設計表2-2八路跑馬燈引腳的GPIO配置外設名(用戶標簽)D1D2D3D4D5D6D7D8IO引腳PE6PB6PC7PB7PE5PC6PD7PD6引腳模式(輸入/輸出)輸出電平(高/低)輸出模式(推挽/開漏)上拉/下拉傳輸速度輸出高推挽上拉高速步驟2:CubeMX工程配置1.選芯片建工程打開CubeMX(或CubeIDE)軟件,開始新建STM32工程。或者點擊菜單命令Files→New→STM32Project,新建工程,選擇MCU界面中,輸入MCU型號為STM32F407ZGT6,工程命名為“2-1LED8”。2.配置時鐘源本例中使用高速內部時鐘HSI,作為PLL的時鐘源,通過PLL倍頻,使系統時鐘達到頻率72MHz。1.選擇RCC時鐘源:在Mode配置欄的第一個選項HighSpeedClock(HSE),設置值為Disable,即不啟用外部的高速振蕩源時鐘。第二個選項LowSpeedClock(LSE)設置值為Disable,即不使用外部的低速振蕩源。2.配置SYS:選擇SYS,配置Debug為SerialWire。其余參數默認。此時在右側的引腳預覽中,可以看到PA13和PA14引腳變成綠色,被使用。3.配置時鐘樹:在頁面上方選擇ClockConfiguration時鐘配置頁面。(1)設置PLL的來源為HSI內部高速時鐘,其頻率為16MHz。(2)當PLL的分頻系數M設置為8,主PLL分頻系數P為2時,主PLL倍頻系數N應設置為72。此時系統時鐘的時鐘源選擇PLLCLK,即可得到72MHz。填寫計算公式:SYSCLK=fHSI*N/(M*P)=16M*72/(8*2)=72MHz。(3)APB1分頻系數設為2,由此APB1CLK=36MHz,其值不能超過42MHz。APB2的分頻系數配置為1,由此APB2CLK=72MHz,其值不能超過84MHz。3.配置GPIO在Pinout&Configuration頁面,在Categories中選擇GPIO,按表2-2配置八位跑馬燈的8個LED引腳,設置GPIO為GPIO_Output模式。步驟3:編寫LED控制函數實現跑馬燈(1)分析系統時鐘初始化函數voidSystemClock_Config(void){……RCC_OscInitStruct.OscillatorType=RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSEState=RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState=RCC_PLL_ON;//作用是開啟PLL鎖相環RCC_OscInitStruct.PLL.PLLSource=RCC_PLLSOURCE_HSI;RCC_OscInitStruct.PLL.PLLM=8;RCC_OscInitStruct.PLL.PLLN=72;RCC_OscInitStruct.PLL.PLLP=RCC_PLLP_DIV2;RCC_OscInitStruct.PLL.PLLQ=4;……/*配置AHB分頻器為1(或填“不”)分頻,HCLK=72MHz*/RCC_ClkInitStruct.AHBCLKDivider=RCC_SYSCLK_DIV1;/*配置APB1分頻器為2分頻,PCLK1=36MHz*/RCC_ClkInitStruct.APB1CLKDivider=RCC_HCLK_DIV2;/*配置APB2分頻器為1(或填“不”)分頻,HCLK=72MHz*/RCC_ClkInitStruct.APB2CLKDivider=RCC_HCLK_DIV1;……}(2)查看文件main.h中的用戶標簽#defineD5_PinGPIO_PIN_5#defineD5_GPIO_PortGPIOE#defineD1_PinGPIO_PIN_6#defineD1_GPIO_PortGPIOE#defineD6_PinGPIO_PIN_6#defineD6_GPIO_PortGPIOC#defineD3_PinGPIO_PIN_7#defineD3_GPIO_PortGPIOC#defineD8_PinGPIO_PIN_6#defineD8_GPIO_PortGPIOD#defineD7_PinGPIO_PIN_7#defineD7_GPIO_PortGPIOD#defineD2_PinGPIO_PIN_6#defineD2_GPIO_PortGPIOB#defineD4_PinGPIO_PIN_7#defineD4_GPIO_PortGPIOB【思考】上述GPIO引腳宏定義是以什么規律排列的?答:按GPIO的組別和引腳順序進行定義的,如D5和D1都是第E組,引腳號分別是PE5和PE6,D6和D3都是第C組,引腳號分別是PC6和PC7,后面的請自己分析。(3)查看GPIO引腳初始化配置函數voidMX_GPIO_Init(void){GPIO_InitTypeDefGPIO_InitStruct={0};//GPIO初始化類型定義結構體/*GPIOPortsClockEnable*/__HAL_RCC_GPIOE_CLK_ENABLE();//使能D1和D5的GPIO時鐘__HAL_RCC_GPIOC_CLK_ENABLE();//使能D3和D6的GPIO時鐘__HAL_RCC_GPIOA_CLK_ENABLE();//使能SW模式下載調試引腳的GPIO時鐘__HAL_RCC_GPIOD_CLK_ENABLE();//使能D7和D8的GPIO時鐘__HAL_RCC_GPIOB_CLK_ENABLE();//使能D2和D4的GPIO時鐘/*配置GPIO引腳的輸出電平,使LED上電不亮*/HAL_GPIO_WritePin(GPIOE,D5_Pin|D1_Pin,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOC,D6_Pin|D3_Pin,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,D8_Pin|D7_Pin,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOB,D2_Pin|D4_Pin,GPIO_PIN_SET);/*配置E組的GPIO引腳*/GPIO_InitStruct.Pin=D5_Pin|D1_Pin;GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull=GPIO_PULLUP;GPIO_InitStruct.Speed=GPIO_SPEED_FREQ_HIGH;//根據自己的選擇配置填寫HAL_GPIO_Init(GPIOE,&GPIO_InitStruct);……//省略其他組的GPIO配置代碼}
拓展訓練:點亮RGB彩燈步驟1:硬件電路設計表2-3RGB燈的GPIO配置外設名(用戶標簽)IO引腳引腳模式(輸入/輸出)輸出初始電平(高/低)輸出模式(推挽/開漏)上下拉傳輸速度RLEDPC7輸出高推挽上拉中速GLEDPB6輸出高推挽上拉中速BLEDPE6輸出高推挽上拉中速步驟2:CubeMX工程配置1.選擇芯片,創建工程名為“2-1RGB”。2.系統時鐘設置:本例中使用高速內部時鐘HSI(頻率為16MHz),作為PLL的時鐘源,設置PLL的M和P分頻器分別為8和2,倍頻系數N為84,使系統時鐘達到頻率84MHz。APB1和APB2如果要滿足設計,其分頻系數最小值應該分別設置為2和1。
任務2.2按鍵控制LED設計任務實施步驟1:硬件電路設計表2-4按鍵控制LED的引腳GPIO配置外設名(用戶標簽)IO引腳引腳模式(輸入/輸出)輸出初始電平(高/低)輸出模式(推挽/開漏)上下拉傳輸速度KEY_UPPA0輸入————下拉KEY0PE4輸入————上拉KEY1PE3輸入————上拉KEY2PE2輸入————上拉BEEPPF8輸出低推挽下拉LED0PF9輸出高推挽上拉LED1PF10輸出高推挽上拉步驟2:CubeMX工程配置1.配置系統時鐘本例中使用高速外部時鐘HSE,作為PLL的時鐘源,通過PLL倍頻,使系統時鐘達到頻率168MHz。(1)打開CubeIDE或CubeMX軟件,點擊菜單命令Files→New→STM32Project,新建工程,選擇MCU界面中,輸入MCU型號為STM32F407ZGT6,工程名為“2-2KEY”。(2)配置時鐘源,點開SystemCore(系統內核設置),再點擊RCC配置啟用HSE時鐘源,設置值為Crystal/CeramicResonator。不使用外部的低速振蕩源LSE,設置值為Disable。此時在右側的引腳預覽中,可以看到PH0和PH1引腳變成綠色,說明引腳使用連接了外部高速晶振。(3)配置SYS:選擇SYS,配置Debug為SerialWire(SW模式)。其余參數默認。(4)配置時鐘樹,在頁面上方選擇ClockConfiguration配置時鐘樹。①PLL時鐘源選擇:選擇HSE,設置開發板板載的外部8M的晶振。②PLL的分頻系數M設置為4,倍頻系數N設置為168,分頻系數P配置為2。③系統時鐘時鐘源選擇PLLCLK,系統時鐘頻率達到168MHz。填寫計算公式:SYSCLK=8MHz×N/(M×P)=8MHz×168/(4×2)=168MHz。④外設時鐘APB1設置為4分頻,由此APB1CLK=42MHz,其值不能超過42MHz。⑤外設時鐘APB2設置為2分頻,由此APB2CLK=84MHz,其值不能超過84MHz。3.查看分析項目初始化代碼工程文件的初始化代碼生成后,請填寫以下實現代碼所在的文件名。1)在main.c文件中,聲明并編寫了系統時鐘配置函數SystemClock_Config()。2)在main.h文件中,宏定義了GPIO引腳的用戶標識。3)在gpio.h文件中,聲明了GPIO引腳的初始化函數MX_GPIO_Init()。4)在gpio.c文件中,編寫了MX_GPIO_Init()函數,配置了GPIO引腳。步驟4:編寫按鍵掃描函數及LED宏函數1.編寫key_led.h頭文件#ifndefKEY_LED_KEY_LED_H_#defineKEY_LED_KEY_LED_H_#include"main.h"#ifdefKEY_UP_Pin //如果宏定義了KEY_UP按鍵 /*將讀取按鍵IO的輸入電平直接定義為宏函數*/ #defineKEY0 HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin) #defineKEY1 HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin) #defineKEY2 HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin) #defineKEY_UP HAL_GPIO_ReadPin(KEY_UP_GPIO_Port,KEY_UP_Pin)#endif#ifdefLED0_Pin //如果宏定義了LED0 /*點亮紅燈,輸出低電平*/ /*熄滅紅燈,輸出高電平*/ //翻轉紅燈#endif#ifdefLED1_Pin//如果宏定義了LED1 /*點亮綠燈,輸出低電平*/ /*熄滅綠燈,輸出高電平*/ //翻轉綠燈#endif#ifdefBEEP_Pin//如果宏定義了蜂鳴器 /*蜂鳴器發聲,輸出高電平*/ /*蜂鳴器不響,輸出低電平*/ //翻轉蜂鳴器#endifuint8_tKEY_Scan(uint8_tmode);//聲明按鍵掃描函數#endif/*KEY_LED_KEY_LED_H_*/2.編寫key.c源文件#include"key_led.h"http://按鍵輸入檢測函數//mode:0,不支持連續按;1,支持連續按;//返回按鍵值,返回0是沒有任何按鍵按下;//注意此函數有響應優先級,KEY0>KEY1>KEY2>WK_UPuint8_tKEY_Scan(uint8_tmode){staticuint8_tkey_state=1;//初始化一次,按鍵松開狀態if(mode==1)key_state=1;//支持連按,按鍵是松開狀態/*如果之前按鍵是松開狀態,且有鍵按下*/if(key_state&&(KEY0==0||KEY1==0||KEY2==0||KEY_UP==1)){HAL_Delay(10);//作用是:按鍵按下消抖key_state=0;//作用是:標記這次按鍵已經按下if(KEY0==0) return1;//KEY0鍵按下,返回1elseif(KEY1==0) return2;//KEY1鍵按下,返回2elseif(KEY2==0) return3;//KEY2鍵按下,返回3elseif(KEY_UP==1) return4;//KEY_UP鍵按下,返回4}elseif(KEY0==1&&KEY1==1&&KEY2==1&&KEY_UP==0)//沒有鍵按下 key_state=1;//作用是:標記按鍵松開return0;//無按鍵按下,返回0}步驟5:實現按鍵控制LED設計2.編寫main主函數intmain(void){uint8_tkey;//存儲按鍵返回值HAL_Init();SystemClock_Config();MX_GPIO_Init();while(1){ key=KEY_Scan(0);//按鍵檢測 switch(key) { case1: //按下KEY0鍵,控制紅燈翻轉(用宏函數實現) RLED_Toggle(); break; case2: //按下KEY1鍵,控制綠燈翻轉(用宏函數實現) GLED_Toggle(); break; case3: //按下KEY2鍵,控制兩個燈同時翻轉(用宏函數實現) RLED_Toggle();GLED_Toggle(); break; case4://按下KEY_UP鍵,控制蜂鳴器翻轉(用宏函數實現) BEEP_Toggle(); break; }}}
任務2.3串口控制LED設計技能訓練1:串口發送信息步驟1:硬件電路設計表2-7串口控制LED的GPIO配置外設名(用戶標簽)IO引腳引腳模式輸出初始電平上下拉傳輸速度LED0PF9輸出推挽高上拉超高速LED1PF10輸出推挽高上拉超高速USART_TXPA9復用推挽——浮空超高速USART_RXPA10復用推挽——浮空超高速步驟4:分析串行通信配置代碼1.在CORE→Src文件夾中打開usart.c源文件,查看串口1初始化函數MX_USART1_UART_Init(),分析串口相關參數配置。UART_HandleTypeDefhuart1;voidMX_USART1_UART_Init(void){huart1.Instance=USART1;//串口1外設基地址huart1.Init.BaudRate=115200;//設置波特率為115200huart1.Init.WordLength=UART_WORDLENGTH_8B;//設置有效數據位為8位huart1.Init.StopBits=UART_STOPBITS_1;///設置停止位為1位huart1.Init.Parity=UART_PARITY_NONE;//設置奇偶校驗位為無huart1.Init.Mode=UART_MODE_TX_RX;//設置模式為發送和接收huart1.Init.HwFlowCtl=UART_HWCONTROL_NONE;//設置串口硬件控制流為關閉huart1.Init.OverSampling=UART_OVERSAMPLING_16;//設置過采樣為16倍if(HAL_UART_Init(&huart1)!=HAL_OK){Error_Handler();}/*USERCODEBEGINUSART1_Init2*//*USERCODEENDUSART1_Init2*/}4.串口的MSP初始化函數USART_MspInit()中,使能串口的時鐘、配置GPIO及中斷配置等參數。voidHAL_UART_MspInit(UART_HandleTypeDef*uartHandle){GPIO_InitTypeDefGPIO_InitStruct={0};if(uartHandle->Instance==USART1){/*USART1時鐘使能*/__HAL_RCC_USART1_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/**USART1GPIO引腳配置PA9>USART1_TX,PA10>USART1_RX*/GPIO_InitStruct.Pin=GPIO_PIN_9|GPIO_PIN_10;GPIO_InitStruct.Mode=GPIO_MODE_AF_PP;//GPIO模式:復用推挽GPIO_InitStruct.Pull=GPIO_NOPULL;//表示:沒有上下拉,即浮空狀態GPIO_InitStruct.Speed=GPIO_SPEED_FREQ_VERY_HIGH;//速度是100MHzGPIO_InitStruct.Alternate=GPIO_AF7_USART1;//復用為USART1HAL_GPIO_Init(GPIOA,&GPIO_InitStruct);/*USART1中斷設置*/HAL_NVIC_SetPriority(USART1_IRQn,3,3);//設置USART1中斷優先級HAL_NVIC_EnableIRQ(USART1_IRQn);//使能USART1中斷}}
拓展提高:串口控制RGB彩燈1.硬件電路設計請根據RGB燈拓展板的電路,在圖2-41中繪制RGB燈與STM32的連接電路原理圖。注意本例中選用的是共陽極RGB燈。圖2-41RGB燈的電路連接原理圖表2-8圖2-41RGB燈的電路連接原理圖燈顏色紅燈RLED綠燈GLED藍燈BLED紅√××綠×√×藍××√黃√√×青×√√紫√×√白√√√滅×××
思考練習一、選擇題(ABD)1.CMSIS分為哪幾個基本功能層?A.核內外設訪問層 B.中間件訪問層C.調試/跟蹤接口層 D.外設訪問層(ACE)2.系統時鐘SYSCLK可來源于哪幾個時鐘源?A.HSI B.LSI C.HSE D.LSE E.PLL(A)3.在STM32工程中,以下哪個文件夾是放置main.c的?A.CORE/src B.CORE/incC.DEVICE/CMSIS/include D.MDK-ARM(C)4.以下哪個是高速外部時鐘?A.HSI B.LSI C.HSE D.LSE E.PLL(C)5.STM32F407芯片要得到168MHz的時鐘主頻,如果采用外部高速時鐘8MHz作為PLL的時鐘源,分頻系數M和P分別為8和2,那么倍頻系數N應設置為多少?A.84 B.168 C.336 D.512(B)6.時鐘配置的函數是以下哪一個?A.MX_GPIO_Init(); B.SystemClock_Config();C.HAL_RCC_ClockConfig(); D.HAL_RCC_OscConfig();(D)7.端口模式寄存器名為什么?A.IDR B.ODR C.OTYPER D.MODER(D)8.以下哪個函數能讓引腳輸出電平翻轉?A.HAL_GPIO_Init(); B.HAL_GPIO_ReadPin();C.HAL_GPIO_WritePin(); D.HAL_GPIO_TogglePin();二、填空題1.在CubeIDE軟件中編寫程序完成后,可按快捷鍵(Ctrl)+(B),進行整個工程的編譯。在CubeMX軟件中,編譯工程的快捷鍵是(F7)。2.STM32F407芯片一共有(7)組IO口,每組IO口含下面(10)個寄存器,這些寄存器共同控制一組GPIO的(16)個IO口。3.GPIO的輸出模式有四種,分別是(開漏)輸出模式和(推挽)輸出模式,以及他們的復用功能模式。4.根據圖2-45所示電路分析,要點亮LED應該輸出(高)電平,初始狀態輸出電平設置為(低)電平,上下拉應設置為(下拉),LED引腳模式設置為(輸出推挽)模式。圖圖2-42填空題4電路5.STM32F407的共有(6)個串口,其中USART1位于(APB1)總線上,最高速率為(84MHz)。
項目3三人搶答器設計任務3.1搶答器按鍵模塊設計任務實施步驟1:外部中斷按鍵引腳配置表2-3三人搶答器外設引腳的GPIO配置用戶標簽IO引腳引腳模式觸發方式上下拉中斷優先級KEY_UPPA0EXTI0上升沿下拉2,0KEY0PE4EXTI4下降沿上拉2,1KEY1PE3EXTI3下降沿上拉2,1KEY2PE2EXTI2下降沿上拉2,1外設名(用戶標簽)IO引腳引腳模式輸出電平(高或低)上下拉傳輸速度BEEPPF8輸出推挽低下拉超高速LED0PF9輸出推挽高上拉超高速LED1PF10輸出推挽低上拉超高速D1PE6輸出推挽高上拉超高速D2PB6輸出推挽高上拉超高速D3PC7輸出推挽高上拉超高速表中的D1、D2、D3是搶答選手的對應的3個LED,開發板上沒有,可根據實際情況來選擇是否配置,如選用跑馬燈拓展板上的LED。步驟3:外部中斷代碼設計1.分析外部中斷的配置代碼(1)查看按鍵外部中斷的用戶標簽在main.h文件中查看按鍵的宏定義代碼,填寫其中空缺部分。#defineKEY2_Pin GPIO_PIN_2#defineKEY2_GPIO_Port GPIOE#defineKEY2_EXTI_IRQn EXTI2_IRQn#defineKEY1_Pin GPIO_PIN_3#defineKEY1_GPIO_Port GPIOE#defineKEY1_EXTI_IRQn EXTI3_IRQn#defineKEY0_Pin GPIO_PIN_4#defineKEY0_GPIO_Port GPIOE#defineKEY0_EXTI_IRQn EXTI4_IRQn#defineKEY_UP_Pin GPIO_PIN_0#defineKEY_UP_GPIO_Port GPIOA#defineKEY_UP_EXTI_IRQn EXTI0_IRQn(2)分析按鍵外部中斷的GPIO配置代碼打開gpio.c文件,可以在MX_GPIO_Init()函數中查看按鍵的外部中斷配置代碼,以下是提取了按鍵配置的代碼,請分析并填寫完整代碼功能。voidMX_GPIO_Init(void){GPIO_InitTypeDefGPIO_InitStruct={0};__HAL_RCC_GPIOE_CLK_ENABLE();//使能選手按鍵PE2/PE3/PE4引腳外設時鐘__HAL_RCC_GPIOA_CLK_ENABLE();//使能主持人按鍵PA0引腳外設時鐘……//省略其他外設的時鐘使能GPIO_InitStruct.Pin=KEY2_Pin|KEY1_Pin|KEY0_Pin;//配置選手按鍵GPIO_InitStruct.Mode=GPIO_MODE_IT_FALLING;//引腳模式為中斷下降沿觸發GPIO_InitStruct.Pull=GPIO_PULLUP;//配置為上拉HAL_GPIO_Init(GPIOE,&GPIO_InitStruct);GPIO_InitStruct.Pin=KEY_UP_Pin;//配置主持人按鍵GPIO_InitStruct.Mode=GPIO_MODE_IT_RISING;//引腳模式為中斷上升沿觸發GPIO_InitStruct.Pull=GPIO_PULLDOWN;//配置為下拉HAL_GPIO_Init(GPIOA,&GPIO_InitStruct);……//省略其他外設的GPIO配置HAL_NVIC_SetPriority(EXTI0_IRQn,2,0); //作用是設置主持人按鍵的中斷搶占優先級為2,相應優先級為0HAL_NVIC_EnableIRQ(EXTI0_IRQn); //作用是使能外部中斷線0HAL_NVIC_SetPriority(EXTI2_IRQn,2,1); //作用是設置選手按鍵的中斷搶占優先級為2,相應優先級為1,比主持人按鍵低HAL_NVIC_EnableIRQ(EXTI2_IRQn); //作用是使能外部中斷線2HAL_NVIC_SetPriority(EXTI3_IRQn,2,1);HAL_NVIC_EnableIRQ(EXTI3_IRQn); HAL_NVIC_SetPriority(EXTI4_IRQn,2,1);HAL_NVIC_EnableIRQ(EXTI4_IRQn); }2.編寫搶答器主函數代碼while(1){ if(state==0)//初始狀態 { GLED_ON();//點亮綠燈 printf("\r\n請按下主持人按鍵,準備開始搶答\r\n"); } elseif(state==1)//主持人鍵按下,開始搶答狀態 { RLED_Toggle();//紅燈閃爍 HAL_Delay(500);//每秒閃爍一次 } elseif(state==2)//搶答結束 { RLED_OFF();//熄滅紅燈 printf("\r\n%d號選手搶答成功!\r\n"\r\n\r\n",xuanshou); BEEP_ON();//蜂鳴器響 HAL_Delay(1000); //延時1秒 BEEP_OFF(); //蜂鳴器不響 state=0; //回初始狀態 }}}3.程序下載,測試搶答器按鍵功能【問題】請問該怎么修改代碼,才能使搶答成功后,蜂鳴器響的期間,不能進行下一次搶答?【解決方法】在外部中斷回調函數中,主持人按鍵消抖后,再次判斷KEY_UP是否按下的if條件中,增加同時判斷狀態是否是初始狀態的代碼:if(state==0&&KEY_UP==1)也就是只有在初始狀態,才能按下主持人按鍵。
任務3.2搶答器限時搶答設計技能訓練:通用定時器設計步驟1:通用定時器參數計算采用通用定時器TIM3進行0.5秒計時中斷,該定時器時鐘采用的是APB1總線時鐘(填APB1或APB2)。當系統時鐘為100MHz時,基本定時器TIM3的時鐘頻率fCLK為50M當定時器TIM3的預分頻系數PSC設置為(5000-1),要使定時器溢出時間為0.5秒,那么自動重裝載值(計數周期)ARR應設置為4999。計算公式為:由公式Tout=PSC+1×步驟2:通用定時器CubeMX工程配置1.創建工程,配置時鐘樹工程配置要求:使用外部高速時鐘配置PLL,使系統時鐘頻率達到100MHz,按照開發板上LED0和LED1的硬件電路,配置相應的GPIO端口,且上電時LED不亮。(1)創建STM32工程,芯片選擇為STM32F407ZGT6,工程名為“3-2TIMER”。(2)配置時鐘源及時鐘樹,使系統時鐘頻率達到100MHz。①選擇時鐘源:打開RCC界面,開啟高速外部時鐘(HSE)②配置時鐘樹:在頁面上方選擇ClockConfiguration時鐘配置頁面。設置PLL的來源為HSE外部高速時鐘,其頻率為8MHz。當PLL的分頻系數M設置為4,主PLL分頻系數P為2時,主PLL倍頻系數N應設置為100。此時系統時鐘的時鐘源選擇PLLCLK,即可得到100MHz。填寫計算公式:SYSCLK=fHSI*N/(M*P)=8M*100/(4*2)=100MHz為使APB1CLK和APB2CLK不超過規定值。APB1分頻系數最大可設為4,由此APB1CLK=25MHz。APB2的分頻系數設置與APB1的分頻系數一樣。3.配置通用定時器參數(3)在Configuration配置選項中,選擇ParameterSetting頁,配置參數如下:計數器設置:預分頻系數PSC為5000-1;計數周期(自動加載值)ARR為5000-1;計數方式選擇為中心對齊模式1;內部時鐘不分頻;關閉自動重裝載值。步驟3:實現通用定時器控制LED閃爍1.分析通用定時器TIM3配置的初始化函數voidMX_TIM3_Init(void){TIM_ClockConfigTypeDefsClockSourceConfig={0};TIM_MasterConfigTypeDefsMasterConfig={0};htim3.Instance=TIM3;htim3.Init.Prescaler=5000-1;//設置預分頻系數值,實際系數為5000htim3.Init.CounterMode=TIM_COUNTERMODE_CENTERALIGNED1;//計數模式是中心對齊1htim3.Init.Period=5000-1;//設置自動重裝載值,實際系數為5000htim3.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;htim3.Init.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_DISABLE;……//省略部分代碼}【拓展】如果在while循環中,修改紅燈的延時方式用計數方式實現,然后再下載到開發板會觀察到什么現象?【思考】為什么會出現這種現象?答:紅燈閃爍的時間會明顯慢于綠燈。這是因為通過循環執行延時函數來實現計時的方法,其延時精度不高,尤其是是多次重復執行,還會大大消耗CPU的工作時間,降低了工作效率,更加無法達到一個精確的延時時間。相比之下,定時器計時能夠提供毫秒甚至微秒級別的延時,且不會占用CPU資源,因為它允許CPU在等待期間執行其他任務,提高了系統的整體效率。
任務實施:搶答器限時搶答功能設計步驟1:基本定時器參數計算定時器TIM6時鐘采用的是APB1總線時鐘(填APB1或APB2),當系統時鐘為168MHz時,基本定時器TIM6的時鐘fCLK為84設置TIM6的預分頻系數PSC為(8400-1),要使定時器溢出時間為0.1秒,那么自動重裝載值ARR應設置為1000-1。步驟2:基本定時器CubeMX工程配置1.配置基本定時器參數點擊3-2BASIC_TIMER.ioc,在Categories中選擇Timers選中使用基本定時器TIM6。(1)在Mode下方,勾選Activated,使用該定時器。(2)在Configuration配置選項中,選擇ParameterSetting頁配置預分頻值PSC為8400-1,計數方式為向上(遞增),計數周期ARR為1000-1,關閉自動重裝載值,如圖3-15所示。步驟3:限時搶答代碼設計及浮點數輸出3.程序下載,測試搶答器倒計時功能打開串口調試助手,分別按下主持人按鍵和選手按鍵,測試搶答器電路功能是否正常。【問題1】當按下主持人按鍵,倒計時到0時,串口輸出“倒計時結束,無人搶答”和“0號選手搶答成功!”,應該怎么修改代碼才能不讓后面這句信息輸出?【解決方法】在while循環中的搶答結束,串口輸出“%d號選手搶答成功!”代碼之前,添加一個條件,判斷選手編號不是0, if(xuanshou!=0),然后再輸出信息【問題2】當倒計時到0時,發現串口輸出顯示“-0.0”,負號怎么處理?此處使用求絕對值的函數是什么?是abs()函數,還是fabs()函數?兩者有什么區別?【解決方法】對串口輸出的倒計時浮點數取其絕對值。abs()函數是對整數取其絕對值,fabs()函數是對浮點數數取其絕對值,本例應選用后者。修改printf函數的代碼為:printf("\r\n%.1f\r\n",fabs(num));【問題3】引入函數對浮點數取絕對值之后,出現圖3-22所示的警告怎么處理?【解決方法】在main.c文件開始添加頭文件math.h
任務3.3搶答器LCD界面設計技能訓練:TFTLCD顯示步驟1:TFTLCD硬件電路連接表3-10TFTLCD的背光引腳的GPIO配置外設名(用戶標簽)IO引腳引腳模式輸出電平(高或低)上下拉傳輸速度LCD_BLPB15輸出推挽低上拉高速將FSMC的IO引腳填入表3-11中。表3-11FSMC引腳的IO端口引腳名NE4A6NWENOEIO引腳PG12PF12PD5PD4引腳功能片選信號命令/數據控制信號寫信號讀信號引腳名D0D1D2D3D4D5D6D7IO引腳PD14PD15PD0PD1PE7PE8PE9PE10引腳名D8D9D10D11D12D13D14D15IO引腳PE11PE12PE13PE14PE15PD8PD9PD10步驟3:分析代碼移植LCD驅動文件1.分析FSMC配置相關函數打開fsmc.c文件,查看FSMC初始化函數和FSMC引腳配置,部分代碼如下。#include"fsmc.h"SRAM_HandleTypeDefhsram1;//Bank1子區4的外設對象變量,用于TFTLCD/*FSMC初始化函數*/voidMX_FSMC_Init(void){FSMC_NORSRAM_TimingTypeDefTiming={0};//基本時序FSMC_NORSRAM_TimingTypeDefExtTiming={0};//擴展時序/**子區4初始化,用于TFTLCD*/hsram1.Instance=FSMC_NORSRAM_DEVICE;//FSMCBank1寄存器地址hsram1.Extended=FSMC_NORSRAM_EXTENDED_DEVICE;/*hsram1.Init參數設置*/hsram1.Init.NSBank=FSMC_NORSRAM_BANK4;//Bank1子區4hsram1.Init.DataAddressMux=FSMC_DATA_ADDRESS_MUX_DISABLE;hsram1.Init.MemoryType=FSMC_MEMORY_TYPE_SRAM;hsram1.Init.MemoryDataWidth=FSMC_NORSRAM_MEM_BUS_WIDTH_16;//配置FSMCNORSRAMMEM總線寬度16位……//省略部分代碼,見fsmc.c文件/*時序設置*/Timing.AddressSetupTime=15;//配置地址建立時間為15個時鐘周期Timing.AddressHoldTime=15;Timing.DataSetupTime=60;//配置數據建立時間為15個時鐘周期Timing.BusTurnAroundDuration=0;Timing.CLKDivision=16;Timing.DataLatency=17;Timing.AccessMode=FSMC_ACCESS_MODE_A;//配置數據訪問為異步A模式/*擴展時序設置*/ExtTiming.AddressSetupTime=8;//配置擴展地址建立時間為15個時鐘周期ExtTiming.AddressHoldTime=15;ExtTiming.DataSetupTime=9;//配置擴展數據建立時間為15個時鐘周期ExtTiming.BusTurnAroundDuration=0;ExtTiming.CLKDivision=16;ExtTiming.DataLatency=17;ExtTiming.AccessMode=FSMC_ACCESS_MODE_A;//配置擴展數據訪問為異步A模式if(HAL_SRAM_Init(&hsram1,&Timing,&ExtTiming)!=HAL_OK)Error_Handler();//HAL_SRAM_Init()里會調用HAL_SRAM_MspInit()}staticuint32_tFSMC_Initialized=0;//靜態變量,表示是否進行過MSP初始化/*SRAM接口GPIO初始化函數,在HAL_SRAM_MspInit()里被調用*/staticvoidHAL_FSMC_MspInit(void){GPIO_InitTypeDefGPIO_InitStruct={0};if(FSMC_Initialized)//FSMC接口的GPIO初始化只需執行一次return;FSMC_Initialized=1;//表示已經進行了FSMC接口的GPIO初始化/*FSMC時鐘使能*/__HAL_RCC_FSMC_CLK_ENABLE();/**FSMCGPIO引腳配置PF12>FSMC_A6PD14>FSMC_D0……省略部分引腳,見fsmc.c文件*//*GPIO_InitStruct配置*/GPIO_InitStruct.Pin=GPIO_PIN_12;GPIO_InitStruct.Mode=GPIO_MODE_AF_PP;//配置GPIO為復用推挽模式GPIO_InitStruct.Pull=GPIO_NOPULL;//配置為浮空引腳(沒有上下拉)GPIO_InitStruct.Speed=GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Alternate=GPIO_AF12_FSMC;//作用是:把PF12引腳復用為FSMC引腳HAL_GPIO_Init(GPIOF,&GPIO_InitStruct);//初始化配置命令/數據控制信號PF12引腳……//省略部分GPIO配置代碼,見fsmc.c文件}2.移植LCD文件(3)查看lcd.h頭文件③LCD顯示的顏色使用RGB565格式。常用的顏色其RGB565取值見lcd.h以下部分代碼,請填寫完整。//畫筆顏色#defineWHITE 0xFFFF //白色#defineBLACK 0x0000 //黑色#defineBLUE 0x001F //藍色#defineBRED 0XF81F //紫色#defineGRED 0XFFE0 //黃色#defineGBLUE 0X07FF //青色#defineRED 0xF800 //紅色#defineMAGENTA 0xF81F //紫色#defineGREEN 0x07E0 //綠色#defineCYAN 0x07FF //青色#defineYELLOW 0xFFE0 //黃色#defineBROWN 0XBC40 //棕色#defineBRRED 0XFC07 //棕紅色#defineGRAY 0X8430 //灰色#defineORANGE 0XFD20 //橙色
思考練習一、選擇題(A)1.STM32F4微控制器的嵌套向量中斷控制器(NVIC)具有多少個可編程優先級?A.16 B.32 C.43 D.72(B)2.STM32F407xx的EXTI16連接到哪個中斷事件?A.外部IO口的輸入中斷 B.PVD輸出C.RTC鬧鐘事件 D.USBOTGFS喚醒事件(B)3.STM32F407xx供IO使用用的外部中斷線有幾個?A.8 B.16 C.22 D.32(D)4.以下哪個是外部中斷回調函數?A.EXTI_Init();B.EXTIx_IRQHandler(); C.EXTI_ClearITPendingBit();D.HAL_GPIO_EXTI_Callback();(C)5.STM32F407xx中16位的定時器有幾個?A.2 B.4 C.12 D.14二、填空題1.STM32F407xx內有(82)個可屏蔽中斷,器外部中斷/事件控制器(EXTI)支持(22)個事件中斷請求。2.STM32F407xx的PB12引腳對應EXTI的編號為(12)。3.STM32F407xx內置了(14)個定時器,分為三種類型,分別是(基本定時器)、(通用定時器)和(高級定時器)。4.STM32F407xx中的定時器TIM1和TIM8掛在(APB2)總線上,定時器TIM2~TIM7掛在(APB1)總線上。5.TFTLCD是(薄膜晶體管)液晶顯示器,ATK-4.3'TFTLCD的雙向數據線是(16)位的。
項目4智能調光燈設計任務4.1調光燈手動模式設計任務實施步驟1:PWM參數計算1.本例中PWM輸出控制LED0,使用的定時器是TIM14,通道CH1。在GPIO中將其配置為PWM引腳,配置參數請填入表4-3中。表4-3PWM引腳的GPIO配置外設名/用戶標簽IO引腳引腳模式上下拉LED0/PWMPF9復用推挽浮空KEY_UPPA0輸入下拉KEY0PE4輸入上拉KEY1PE3輸入上拉KEY2PE2輸入上拉2.本例中的定時器的時鐘在APB1總線上,當系統時鐘是168MHz時,該定時器的時鐘頻率fCLK為84M3.如果每次按鍵要實現10%的亮度改變,可以設置計數次數為100,即重裝載值ARR設置為(100-1),那么當比較值CCR分別設置為0、10、20……100時,就可以控制輸出電壓值按10%變化,相當于LED的亮度變化。當設置預分頻系數PSC為(1680-1)時,那么根據以下公式可以計算出定時器的Tout溢出時間為0.002s。T步驟3:實現按鍵調光燈設計1.分析PWM的配置代碼打開tim.c文件,可以在MX_TIM14_Init()函數中查看定時器TIM14的PWM配置初始化代碼。在HAL_TIM_Base_MspDeInit()函數中PWM(LED0)引腳的GPIO配置。voidMX_TIM14_Init(void){TIM_OC_InitTypeDefsConfigOC={0};htim14.Instance=TIM14;htim14.Init.Prescaler=1680-1;//設置系統時鐘的預分頻系數htim14.Init.CounterMode=TIM_COUNTERMODE_UP;//設置向上計數模式htim14.Init.Period=100-1;//設置自動重裝載值或計數周期htim14.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;htim14.Init.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_DISABLE;……//省略部分代碼sConfigOC.OCMode=TIM_OCMODE_PWM1;//PWM模式1sConfigOC.Pulse=0;sConfigOC.OCPolarity=TIM_OCPOLARITY_LOW;//設置有效電平為低電平sConfigOC.OCFastMode=TIM_OCFAST_DISABLE;……//省略部分代碼}voidHAL_TIM_Base_MspInit(TIM_HandleTypeDef*tim_baseHandle){if(tim_baseHandle->Instance==TIM14){__HAL_RCC_TIM14_CLK_ENABLE();//使能定時器14時鐘HAL_NVIC_SetPriority(TIM8_TRG_COM_TIM14_IRQn,0,0);//設置中斷分組優先級HAL_NVIC_EnableIRQ(TIM8_TRG_COM_TIM14_IRQn);//使能定時器中斷}}voidHAL_TIM_MspPostInit(TIM_HandleTypeDef*timHandle){GPIO_InitTypeDefGPIO_InitStruct={0};if(timHandle->Instance==TIM14){__HAL_RCC_GPIOF_CLK_ENABLE();//使能LED0的GPIOF組時鐘GPIO_InitStruct.Pin=GPIO_PIN_9;//配置PF9引腳GPIO_InitStruct.Mode=GPIO_MODE_AF_PP;//復用推挽模式GPIO_InitStruct.Pull=GPIO_PULLUP;//設置沒有上下拉或浮空引腳GPIO_InitStruct.Speed=GPIO_SPEED_FREQ_VERY_HIGH;//超高速GPIO_InitStruct.Alternate=GPIO_AF9_TIM14;//復用為定時器14引腳模式HAL_GPIO_Ini
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論