单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 861|回复: 1
收起左侧

控制stm32开发版的LED闪烁周期实验

[复制链接]
小沉牧 发表于 2018-9-18 20:15 | 显示全部楼层 |阅读模式
实验报告

实验课程名称:嵌入式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如何将程序下载过程,也对整个调试的过程充满了兴趣,更加了解了嵌入式这门课程;在这个过程中也让我明白了集思广益的重要性。
  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. 以下是调用的函数代码
  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.   *              延时功能初始化
  148.   */
  149. void delay_Init(u8 fsc)
  150. {
  151.               //配置系统滴答时钟源
  152.               SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
  153.             
  154.               //系统总线最高时钟频率进行8分频后得到的值
  155.               my_us = fsc/8;
  156.               my_ms = (fsc/8)*1000;
  157. }

  158. /**
  159.   *  微秒延时函数
  160.   */
  161. void delay_us(u32 us)
  162. {
  163.               u32 uTime = 0;
  164.             
  165.               //Systick寄存器配置
  166.               SysTick->LOAD = us*my_us;  //自动装载值
  167.               SysTick->VAL = 0x00;              //Systick定时器当前值
  168.               SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;              //使能Systick定时器
  169.             
  170.               do{
  171.                             uTime = SysTick->CTRL;
  172.               }while(!(uTime & (1<<16)));
  173.             
  174.               SysTick->VAL = 0x00;              //Systick定时器当前值
  175.               SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;              //关闭Systick定时器
  176. }

  177. /**
  178.   *  毫秒延时函数
  179.   */
  180. void delay_ms(u32 ms)
  181. {
  182.               u32 mTime = 0;
  183.             
  184.               //Systick寄存器配置
  185.               SysTick->LOAD = ms*my_ms;  //自动装载值
  186.               SysTick->VAL = 0x00;              //Systick定时器当前值
  187.               SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;              //使能Systick定时器
  188.             
  189.               do{
  190.                             mTime = SysTick->CTRL;
  191.               }while(!(mTime & (1<<16)));
  192.             
  193.               SysTick->VAL = 0x00;              //Systick定时器当前值
  194.               SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;              //关闭Systick定时器
  195. }

  196. /**
  197.   *  秒延时函数
  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函数
  212. #if 1            
  213. #pragma import(__use_no_semihosting)            
  214. //标准库需要的支持函数               
  215. struct __FILE
  216. {
  217.               int handle;
  218. };

  219. FILE __stdout;      
  220. //定义_sys_exit()以避免使用半主机模式   
  221. void _sys_exit(int x)
  222. {
  223.               x = x;
  224. }
  225. //重定义fputc函数
  226. int fputc(int ch, FILE *f)
  227. {              
  228.               while((USART1->SR&0X40)==0);//循环发送,直到发送完毕  
  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.               //开启串口时钟和GPIO时钟
  240.               RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //使能串口1IO口的时钟
  241.               RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //使能串口1通道时钟
  242.             
  243.               //配置串口1相应IO口,将其模式设置为复用模式 -- 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对应引脚复用映射
  253.               GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);                                                                                     //GPIOA9复用为USART1
  254.               GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);                                                                                     //GPIOA10复用为USART1
  255.             
  256.               //配置并初始化串口结构体参数
  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.               //配置内嵌向量中断控制器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. }
复制代码
完整的Word格式文档51黑下载地址:
控制stm32开发版的LED闪烁周期.docx (807.64 KB, 下载次数: 0)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

jxchen 发表于 2019-2-4 15:26 | 显示全部楼层
下来学习一下~~~~~~~~~~~~~~~~~~~~~~~~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51hei电子论坛2群 联系QQ:125739409;技术交流QQ群219535678

Powered by 单片机教程网

快速回复 返回顶部 返回列表