實(shí)驗(yàn)報(bào)告
實(shí)驗(yàn)課程名稱:嵌入式linux 實(shí)驗(yàn)項(xiàng)目名稱:控制stm32開發(fā)版的LED閃爍周期 實(shí)驗(yàn)類型:實(shí)驗(yàn)型
實(shí)驗(yàn)?zāi)康呐c要求 - 熟悉相關(guān)操作環(huán)境的安裝。
- 掌握putty ,flymcu 和keilu visiin等相關(guān)軟件的操作方法。
- 了解和掌握stm32相關(guān)的基本知識(shí),學(xué)會(huì)設(shè)置stm32的gpio輸出在控制led燈。
| 實(shí)驗(yàn)原理 1.STM32開發(fā)板上面 LED 的接線圖 LED 燈是接到單片機(jī)的 PC 口的 PC0 到 PC7。而 點(diǎn) 亮一盞LED的原理就是把相應(yīng)LED接到單片機(jī)的相應(yīng)的IO口輸出低電平, IO 口 輸出為高電平就能夠熄滅 LED(由圖中得LED燈都是共陽(yáng)極接高電平,所以 當(dāng)所接開發(fā)板的引腳輸出低電平時(shí),有電流流過(guò)LED燈,燈才亮)。 2.STM32GPIO的8種工作模式(輸入4種+輸出4種)。 | 驗(yàn)設(shè)備與軟件環(huán)境 1、硬件:STM32 2、軟件:keil uVision5,F(xiàn)lyMcu,PortHelper,putty 3、操作系統(tǒng)windows 10
| 實(shí)驗(yàn)過(guò)程與結(jié)果 實(shí)驗(yàn)過(guò)程: 1、連接開發(fā)板 gpio初始化配置,由于STM32的GPIO工作模式有8種(輸入4種+輸出4種),所以在GPIO輸出之前要先對(duì)要操作的GPIO進(jìn)行配置。 2、打開keil5進(jìn)行代碼編寫(部分貼圖) 3、使用FlyMcu將編譯好的程序文件下載到開發(fā)板 加載好生成的hex文件后,就可以點(diǎn)擊"開始編程"了,等待一小會(huì),就會(huì)看到下載完成,通過(guò)鍵盤輸入時(shí)間間隔就看到小燈閃爍了。 4、利用串口調(diào)試工具PortHelper進(jìn)行調(diào)試。 實(shí)驗(yàn)結(jié)果: | 操作異常問(wèn)題與解決方案 - 代碼指令有誤,檢查不仔細(xì)。解決辦法:重新更正代碼,
- 所用stm32開發(fā)板略于復(fù)雜,有些端口指令不明確;解決辦法:積極詢問(wèn)老師以及同學(xué),查詢資料。
| 實(shí)驗(yàn)總結(jié) 通過(guò)控制led閃爍的學(xué)習(xí),基本掌握了stm32開發(fā)版的相關(guān)知識(shí), 更加深刻了解了FlyMcu如何將程序下載過(guò)程,也對(duì)整個(gè)調(diào)試的過(guò)程充滿了興趣,更加了解了嵌入式這門課程;在這個(gè)過(guò)程中也讓我明白了集思廣益的重要性。 |
- 以下是主代碼
- #include "stm32f4xx.h"
- #include "led.h"
- #include "delay.h"
- #include "usart.h"
- u8 Res = '1';
- int led_num;
-
- int main(void)
- {
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //éè???òá??D??×é
-
- LED_Init();
- delay_Init(168);
- USART1_Init(115200);
-
-
- while(1)
- {
- printf("recive : %c\n", Res);
- led_num=Res-'0';
- if(led_num==1)
- {
- GPIO_ResetBits(GPIOF, GPIO_Pin_9);
-
- delay_haomiao(500);
-
- GPIO_SetBits(GPIOF, GPIO_Pin_9);
-
- delay_haomiao(500);
- }
- else if(led_num==2)
- {
- GPIO_ResetBits(GPIOF, GPIO_Pin_9);
-
- delay_haomiao(1000);
-
- GPIO_SetBits(GPIOF, GPIO_Pin_9);
-
- delay_haomiao(1000);
- }
- else if(led_num==3)
- {
- GPIO_ResetBits(GPIOF, GPIO_Pin_9);
- delay_miao(1);
- delay_haomiao(500);
-
- GPIO_SetBits(GPIOF, GPIO_Pin_9);
- delay_miao(1);
- delay_haomiao(500);
- }
- else if(led_num==4)
- {
- GPIO_ResetBits(GPIOF, GPIO_Pin_9);
-
- delay_miao(2);
-
- GPIO_SetBits(GPIOF, GPIO_Pin_9);
-
- delay_miao(2);
- }
- else if(led_num==5)
- {
- GPIO_ResetBits(GPIOF, GPIO_Pin_9);
- delay_miao(2);
- delay_haomiao(500);
-
- GPIO_SetBits(GPIOF, GPIO_Pin_9);
- delay_miao(2);
- delay_haomiao(500);
- }
- else if(led_num==6)
- {
- GPIO_ResetBits(GPIOF, GPIO_Pin_9);
-
- delay_miao(3);
-
- GPIO_SetBits(GPIOF, GPIO_Pin_9);
-
- delay_miao(3);
- }
- else if(led_num==7)
- {
- GPIO_ResetBits(GPIOF, GPIO_Pin_9);
- delay_miao(3);
- delay_haomiao(500);
-
- GPIO_SetBits(GPIOF, GPIO_Pin_9);
- delay_miao(3);
- delay_haomiao(500);
- }
- else if(led_num==8)
- {
- GPIO_ResetBits(GPIOF, GPIO_Pin_9);
- delay_miao(4);
-
- GPIO_SetBits(GPIOF, GPIO_Pin_9);
- delay_miao(4);
- }
- else if(led_num==9)
- {
- GPIO_ResetBits(GPIOF, GPIO_Pin_9);
- delay_miao(4);
- delay_haomiao(500);
-
- GPIO_SetBits(GPIOF, GPIO_Pin_9);
- delay_miao(4);
- delay_haomiao(500);
- }
- }
- }
-
-
- void USART1_IRQHandler(void)
- {
-
- if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
- {
-
- USART_ClearITPendingBit(USART1,USART_IT_RXNE);
-
- Res = USART_ReceiveData(USART1); }
-
- }
-
- 以下是調(diào)用的函數(shù)代碼
- (led.c)
-
- #include "led.h"
-
- void LED_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- //ê1?üGPIOAê±?ó
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
-
- //????GPIO2?êy
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
- GPIO_InitStructure.GPIO_Speed = GPIO_Fast_Speed;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
-
- GPIO_Init(GPIOF, &GPIO_InitStructure);
-
- GPIO_SetBits(GPIOF, GPIO_Pin_9);
- GPIO_SetBits(GPIOF, GPIO_Pin_10);
- }
-
-
- (delay.h)
- #include "delay.h"
-
- u8 my_us = 0;
- u16 my_ms = 0;
-
- /**
- * 延時(shí)功能初始化
- */
- void delay_Init(u8 fsc)
- {
- //配置系統(tǒng)滴答時(shí)鐘源
- SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
-
- //系統(tǒng)總線最高時(shí)鐘頻率進(jìn)行8分頻后得到的值
- my_us = fsc/8;
- my_ms = (fsc/8)*1000;
- }
-
- /**
- * 微秒延時(shí)函數(shù)
- */
- void delay_us(u32 us)
- {
- u32 uTime = 0;
-
- //Systick寄存器配置
- SysTick->LOAD = us*my_us; //自動(dòng)裝載值
- SysTick->VAL = 0x00; //Systick定時(shí)器當(dāng)前值
- SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //使能Systick定時(shí)器
-
- do{
- uTime = SysTick->CTRL;
- }while(!(uTime & (1<<16)));
-
- SysTick->VAL = 0x00; //Systick定時(shí)器當(dāng)前值
- SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //關(guān)閉Systick定時(shí)器
- }
-
- /**
- * 毫秒延時(shí)函數(shù)
- */
- void delay_ms(u32 ms)
- {
- u32 mTime = 0;
-
- //Systick寄存器配置
- SysTick->LOAD = ms*my_ms; //自動(dòng)裝載值
- SysTick->VAL = 0x00; //Systick定時(shí)器當(dāng)前值
- SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //使能Systick定時(shí)器
-
- do{
- mTime = SysTick->CTRL;
- }while(!(mTime & (1<<16)));
-
- SysTick->VAL = 0x00; //Systick定時(shí)器當(dāng)前值
- SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //關(guān)閉Systick定時(shí)器
- }
-
- /**
- * 秒延時(shí)函數(shù)
- */
- void delay_s(u32 s)
- {
- u32 i = 0;
-
- for(;i<s; i++)
- {
- delay_ms(500);
- delay_ms(500);
- }
- }
-
- (usart.h)
- #include "usart.h"
-
- //加入以下代碼,支持printf函數(shù)
- #if 1
- #pragma import(__use_no_semihosting)
- //標(biāo)準(zhǔn)庫(kù)需要的支持函數(shù)
- struct __FILE
- {
- int handle;
- };
-
- FILE __stdout;
- //定義_sys_exit()以避免使用半主機(jī)模式
- void _sys_exit(int x)
- {
- x = x;
- }
- //重定義fputc函數(shù)
- int fputc(int ch, FILE *f)
- {
- while((USART1->SR&0X40)==0);//循環(huán)發(fā)送,直到發(fā)送完畢
- USART1->DR = (u8) ch;
- return ch;
- }
- #endif
-
- void USART1_Init(uint32_t baud) //初始化串口1
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- //開啟串口時(shí)鐘和GPIO時(shí)鐘
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //使能串口1IO口的時(shí)鐘
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //使能串口1通道時(shí)鐘
-
- //配置串口1相應(yīng)IO口,將其模式設(shè)置為復(fù)用模式 -- PA9 PA10
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
- GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed;
-
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- //串口1對(duì)應(yīng)引腳復(fù)用映射
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9復(fù)用為USART1
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10復(fù)用為USART1
-
- //配置并初始化串口結(jié)構(gòu)體參數(shù)
- USART_InitStructure.USART_BaudRate = baud;
- USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
- 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_Init(USART1, &USART_InitStructure);
-
- #if 1
- //配置內(nèi)嵌向量中斷控制器NVIC
- NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-
- NVIC_Init(&NVIC_InitStructure);
-
- //打開串口1中斷
- USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
- #endif
-
- //打開串口1
- USART_Cmd(USART1, ENABLE);
- }
復(fù)制代碼 完整的Word格式文檔51黑下載地址:
控制stm32開發(fā)版的LED閃爍周期.docx
(807.64 KB, 下載次數(shù): 8)
2018-9-18 20:15 上傳
點(diǎn)擊文件名下載附件
|