實驗報告
實驗課程名稱:嵌入式linux 實驗項目名稱:控制stm32開發版的LED閃爍周期 實驗類型:實驗型
實驗目的與要求 - 熟悉相關操作環境的安裝。
- 掌握putty ,flymcu 和keilu visiin等相關軟件的操作方法。
- 了解和掌握stm32相關的基本知識,學會設置stm32的gpio輸出在控制led燈。
| 實驗原理 1.STM32開發板上面 LED 的接線圖 LED 燈是接到單片機的 PC 口的 PC0 到 PC7。而 點 亮一盞LED的原理就是把相應LED接到單片機的相應的IO口輸出低電平, IO 口 輸出為高電平就能夠熄滅 LED(由圖中得LED燈都是共陽極接高電平,所以 當所接開發板的引腳輸出低電平時,有電流流過LED燈,燈才亮)。 2.STM32GPIO的8種工作模式(輸入4種+輸出4種)。 | 驗設備與軟件環境 1、硬件:STM32 2、軟件:keil uVision5,FlyMcu,PortHelper,putty 3、操作系統windows 10
| 實驗過程與結果 實驗過程: 1、連接開發板 gpio初始化配置,由于STM32的GPIO工作模式有8種(輸入4種+輸出4種),所以在GPIO輸出之前要先對要操作的GPIO進行配置。 2、打開keil5進行代碼編寫(部分貼圖) 3、使用FlyMcu將編譯好的程序文件下載到開發板 加載好生成的hex文件后,就可以點擊"開始編程"了,等待一小會,就會看到下載完成,通過鍵盤輸入時間間隔就看到小燈閃爍了。 4、利用串口調試工具PortHelper進行調試。 實驗結果: | 操作異常問題與解決方案 - 代碼指令有誤,檢查不仔細。解決辦法:重新更正代碼,
- 所用stm32開發板略于復雜,有些端口指令不明確;解決辦法:積極詢問老師以及同學,查詢資料。
| 實驗總結 通過控制led閃爍的學習,基本掌握了stm32開發版的相關知識, 更加深刻了解了FlyMcu如何將程序下載過程,也對整個調試的過程充滿了興趣,更加了解了嵌入式這門課程;在這個過程中也讓我明白了集思廣益的重要性。 |
- 以下是主代碼
- #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); }
-
- }
-
- 以下是調用的函數代碼
- (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;
-
- /**
- * 延時功能初始化
- */
- void delay_Init(u8 fsc)
- {
- //配置系統滴答時鐘源
- SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
-
- //系統總線最高時鐘頻率進行8分頻后得到的值
- my_us = fsc/8;
- my_ms = (fsc/8)*1000;
- }
-
- /**
- * 微秒延時函數
- */
- void delay_us(u32 us)
- {
- u32 uTime = 0;
-
- //Systick寄存器配置
- SysTick->LOAD = us*my_us; //自動裝載值
- SysTick->VAL = 0x00; //Systick定時器當前值
- SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //使能Systick定時器
-
- do{
- uTime = SysTick->CTRL;
- }while(!(uTime & (1<<16)));
-
- SysTick->VAL = 0x00; //Systick定時器當前值
- SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //關閉Systick定時器
- }
-
- /**
- * 毫秒延時函數
- */
- void delay_ms(u32 ms)
- {
- u32 mTime = 0;
-
- //Systick寄存器配置
- SysTick->LOAD = ms*my_ms; //自動裝載值
- SysTick->VAL = 0x00; //Systick定時器當前值
- SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //使能Systick定時器
-
- do{
- mTime = SysTick->CTRL;
- }while(!(mTime & (1<<16)));
-
- SysTick->VAL = 0x00; //Systick定時器當前值
- SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //關閉Systick定時器
- }
-
- /**
- * 秒延時函數
- */
- void delay_s(u32 s)
- {
- u32 i = 0;
-
- for(;i<s; i++)
- {
- delay_ms(500);
- delay_ms(500);
- }
- }
-
- (usart.h)
- #include "usart.h"
-
- //加入以下代碼,支持printf函數
- #if 1
- #pragma import(__use_no_semihosting)
- //標準庫需要的支持函數
- struct __FILE
- {
- int handle;
- };
-
- FILE __stdout;
- //定義_sys_exit()以避免使用半主機模式
- void _sys_exit(int x)
- {
- x = x;
- }
- //重定義fputc函數
- int fputc(int ch, FILE *f)
- {
- while((USART1->SR&0X40)==0);//循環發送,直到發送完畢
- 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;
-
- //開啟串口時鐘和GPIO時鐘
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //使能串口1IO口的時鐘
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //使能串口1通道時鐘
-
- //配置串口1相應IO口,將其模式設置為復用模式 -- 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對應引腳復用映射
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9復用為USART1
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10復用為USART1
-
- //配置并初始化串口結構體參數
- 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
- //配置內嵌向量中斷控制器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);
- }
復制代碼 完整的Word格式文檔51黑下載地址:
控制stm32開發版的LED閃爍周期.docx
(807.64 KB, 下載次數: 8)
2018-9-18 20:15 上傳
點擊文件名下載附件
|