找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 7365|回復(fù): 1
收起左側(cè)

控制stm32開發(fā)版的LED閃爍周期實(shí)驗(yàn)

[復(fù)制鏈接]
ID:399677 發(fā)表于 2018-9-18 20:15 | 顯示全部樓層 |閱讀模式
實(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ò)程中也讓我明白了集思廣益的重要性。
  1. 以下是主代碼
  2. #include "stm32f4xx.h"
  3. #include "led.h"
  4. #include "delay.h"
  5. #include "usart.h"
  6. u8 Res = '1';
  7. int led_num;

  8. int main(void)
  9. {
  10.             
  11.               NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //éè???òá??D??×é
  12.             
  13.               LED_Init();
  14.               delay_Init(168);
  15.               USART1_Init(115200);

  16.             
  17.               while(1)
  18.               {  
  19.                             printf("recive : %c\n", Res);
  20.     led_num=Res-'0';
  21.                             if(led_num==1)
  22.                             {
  23.                                           GPIO_ResetBits(GPIOF, GPIO_Pin_9);
  24.                                          
  25.                                           delay_haomiao(500);
  26.                            
  27.                                           GPIO_SetBits(GPIOF, GPIO_Pin_9);
  28.                                          
  29.                                           delay_haomiao(500);
  30.                             }
  31.                             else if(led_num==2)
  32.                             {
  33.                                           GPIO_ResetBits(GPIOF, GPIO_Pin_9);
  34.                                          
  35.                                           delay_haomiao(1000);
  36.                            
  37.                                           GPIO_SetBits(GPIOF, GPIO_Pin_9);
  38.                                          
  39.                                           delay_haomiao(1000);
  40.                             }
  41.                             else if(led_num==3)
  42.                             {
  43.                                           GPIO_ResetBits(GPIOF, GPIO_Pin_9);
  44.                                           delay_miao(1);
  45.                                           delay_haomiao(500);
  46.                            
  47.                                           GPIO_SetBits(GPIOF, GPIO_Pin_9);
  48.                                           delay_miao(1);
  49.                                           delay_haomiao(500);
  50.                             }
  51.                             else if(led_num==4)
  52.                             {
  53.                                           GPIO_ResetBits(GPIOF, GPIO_Pin_9);
  54.                                          
  55.                                           delay_miao(2);
  56.                            
  57.                                           GPIO_SetBits(GPIOF, GPIO_Pin_9);
  58.                                          
  59.                                           delay_miao(2);
  60.                             }
  61.                             else if(led_num==5)
  62.                             {
  63.                                           GPIO_ResetBits(GPIOF, GPIO_Pin_9);
  64.                                           delay_miao(2);
  65.                                           delay_haomiao(500);
  66.                            
  67.                                           GPIO_SetBits(GPIOF, GPIO_Pin_9);
  68.                                           delay_miao(2);
  69.                                           delay_haomiao(500);
  70.                             }
  71.                             else if(led_num==6)
  72.                             {
  73.                                           GPIO_ResetBits(GPIOF, GPIO_Pin_9);
  74.                                          
  75.                                           delay_miao(3);
  76.                            
  77.                                           GPIO_SetBits(GPIOF, GPIO_Pin_9);
  78.                                          
  79.                                           delay_miao(3);
  80.                             }
  81.                             else if(led_num==7)
  82.                             {
  83.                                           GPIO_ResetBits(GPIOF, GPIO_Pin_9);
  84.                                           delay_miao(3);
  85.                                           delay_haomiao(500);
  86.                            
  87.                                           GPIO_SetBits(GPIOF, GPIO_Pin_9);
  88.                                           delay_miao(3);
  89.                                           delay_haomiao(500);
  90.                             }
  91.                             else if(led_num==8)
  92.                             {
  93.                                           GPIO_ResetBits(GPIOF, GPIO_Pin_9);
  94.                                           delay_miao(4);
  95.                            
  96.                                           GPIO_SetBits(GPIOF, GPIO_Pin_9);
  97.                                           delay_miao(4);
  98.                             }
  99.                             else if(led_num==9)
  100.                             {
  101.                                           GPIO_ResetBits(GPIOF, GPIO_Pin_9);
  102.                                           delay_miao(4);
  103.                                           delay_haomiao(500);
  104.                            
  105.                                           GPIO_SetBits(GPIOF, GPIO_Pin_9);
  106.                                           delay_miao(4);
  107.                                           delay_haomiao(500);
  108.                             }
  109.               }
  110. }


  111. void USART1_IRQHandler(void)
  112. {
  113.             
  114.               if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  115.               {
  116.                            
  117.                             USART_ClearITPendingBit(USART1,USART_IT_RXNE);

  118.                             Res = USART_ReceiveData(USART1);                }

  119. }

  120. 以下是調(diào)用的函數(shù)代碼
  121. (led.c)

  122. #include "led.h"

  123. void LED_Init(void)
  124. {
  125.               GPIO_InitTypeDef GPIO_InitStructure;
  126.             
  127.               //ê1?üGPIOAê±?ó
  128.               RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
  129.             
  130.               //????GPIO2?êy
  131.               GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
  132.               GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  133.               GPIO_InitStructure.GPIO_Speed = GPIO_Fast_Speed;
  134.               GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  135.               GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  136.             
  137.               GPIO_Init(GPIOF, &GPIO_InitStructure);
  138.             
  139.               GPIO_SetBits(GPIOF, GPIO_Pin_9);
  140.               GPIO_SetBits(GPIOF, GPIO_Pin_10);
  141. }


  142. (delay.h)
  143. #include "delay.h"

  144. u8  my_us = 0;
  145. u16 my_ms = 0;

  146. /**
  147.   *              延時(shí)功能初始化
  148.   */
  149. void delay_Init(u8 fsc)
  150. {
  151.               //配置系統(tǒng)滴答時(shí)鐘源
  152.               SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
  153.             
  154.               //系統(tǒng)總線最高時(shí)鐘頻率進(jìn)行8分頻后得到的值
  155.               my_us = fsc/8;
  156.               my_ms = (fsc/8)*1000;
  157. }

  158. /**
  159.   *  微秒延時(shí)函數(shù)
  160.   */
  161. void delay_us(u32 us)
  162. {
  163.               u32 uTime = 0;
  164.             
  165.               //Systick寄存器配置
  166.               SysTick->LOAD = us*my_us;  //自動(dòng)裝載值
  167.               SysTick->VAL = 0x00;              //Systick定時(shí)器當(dāng)前值
  168.               SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;              //使能Systick定時(shí)器
  169.             
  170.               do{
  171.                             uTime = SysTick->CTRL;
  172.               }while(!(uTime & (1<<16)));
  173.             
  174.               SysTick->VAL = 0x00;              //Systick定時(shí)器當(dāng)前值
  175.               SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;              //關(guān)閉Systick定時(shí)器
  176. }

  177. /**
  178.   *  毫秒延時(shí)函數(shù)
  179.   */
  180. void delay_ms(u32 ms)
  181. {
  182.               u32 mTime = 0;
  183.             
  184.               //Systick寄存器配置
  185.               SysTick->LOAD = ms*my_ms;  //自動(dòng)裝載值
  186.               SysTick->VAL = 0x00;              //Systick定時(shí)器當(dāng)前值
  187.               SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;              //使能Systick定時(shí)器
  188.             
  189.               do{
  190.                             mTime = SysTick->CTRL;
  191.               }while(!(mTime & (1<<16)));
  192.             
  193.               SysTick->VAL = 0x00;              //Systick定時(shí)器當(dāng)前值
  194.               SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;              //關(guān)閉Systick定時(shí)器
  195. }

  196. /**
  197.   *  秒延時(shí)函數(shù)
  198.   */
  199. void delay_s(u32 s)
  200. {
  201.               u32 i = 0;
  202.             
  203.               for(;i<s; i++)
  204.               {
  205.                             delay_ms(500);
  206.                             delay_ms(500);
  207.               }
  208. }

  209. (usart.h)
  210. #include "usart.h"

  211. //加入以下代碼,支持printf函數(shù)
  212. #if 1            
  213. #pragma import(__use_no_semihosting)            
  214. //標(biāo)準(zhǔn)庫(kù)需要的支持函數(shù)               
  215. struct __FILE
  216. {
  217.               int handle;
  218. };

  219. FILE __stdout;      
  220. //定義_sys_exit()以避免使用半主機(jī)模式   
  221. void _sys_exit(int x)
  222. {
  223.               x = x;
  224. }
  225. //重定義fputc函數(shù)
  226. int fputc(int ch, FILE *f)
  227. {              
  228.               while((USART1->SR&0X40)==0);//循環(huán)發(fā)送,直到發(fā)送完畢  
  229.               USART1->DR = (u8) ch;     
  230.               return ch;
  231. }
  232. #endif

  233. void USART1_Init(uint32_t baud)              //初始化串口1
  234. {
  235.               GPIO_InitTypeDef GPIO_InitStructure;
  236.               USART_InitTypeDef USART_InitStructure;
  237.               NVIC_InitTypeDef NVIC_InitStructure;
  238.             
  239.               //開啟串口時(shí)鐘和GPIO時(shí)鐘
  240.               RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //使能串口1IO口的時(shí)鐘
  241.               RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //使能串口1通道時(shí)鐘
  242.             
  243.               //配置串口1相應(yīng)IO口,將其模式設(shè)置為復(fù)用模式 -- PA9  PA10
  244.               GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
  245.               GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  246.               GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  247.               GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  248.               GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed;
  249.             
  250.               GPIO_Init(GPIOA, &GPIO_InitStructure);
  251.             
  252.               //串口1對(duì)應(yīng)引腳復(fù)用映射
  253.               GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);                                                                                     //GPIOA9復(fù)用為USART1
  254.               GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);                                                                                     //GPIOA10復(fù)用為USART1
  255.             
  256.               //配置并初始化串口結(jié)構(gòu)體參數(shù)
  257.               USART_InitStructure.USART_BaudRate = baud;
  258.               USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  259.               USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  260.               USART_InitStructure.USART_StopBits = USART_StopBits_1;
  261.               USART_InitStructure.USART_Parity = USART_Parity_No;
  262.               USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

  263.               USART_Init(USART1, &USART_InitStructure);

  264. #if 1
  265.               //配置內(nèi)嵌向量中斷控制器NVIC
  266.               NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  267.               NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
  268.               NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
  269.               NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  270.             
  271.               NVIC_Init(&NVIC_InitStructure);

  272.               //打開串口1中斷
  273.               USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  274. #endif

  275.               //打開串口1
  276.               USART_Cmd(USART1, ENABLE);
  277. }
復(fù)制代碼
完整的Word格式文檔51黑下載地址:
控制stm32開發(fā)版的LED閃爍周期.docx (807.64 KB, 下載次數(shù): 8)



評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:18591 發(fā)表于 2019-2-4 15:26 | 顯示全部樓層
下來(lái)學(xué)習(xí)一下~~~~~~~~~~~~~~~~~~~~~~~~~
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表