实验报告
实验课程名称:嵌入式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)
|