关于野火mini led的学习

学习目标:

掌握STM32野火mini控制led灯达到流水灯的目的


学习内容:

1.资源整合(包括μcos)

2.代码解读


学习时间:

周一上午8点—9点


学习产出:

1.资料查找及整合(包括μcos)
2.关于野火mini led的学习

一、资料整合
1.野火官网:https://www.firebbs.cn/forum.php
推荐官方软件:野火大学堂 云盘连接:https://pan.baidu.com/s/1anWUxJgTawtERMoD_8SSNw 提取码:vlh6(百度云下载)微信登陆即可,在安装选择资源获取地址的时候选择gitee效率高。
在这里插入图片描述
选择相关的学习资料下载即可,主要包括硬件资料(寄存器地址以及相关功能)
2.bilibili视频:https://www.bilibili.com/video/BV1rt411u7bv?from=search&seid=12868693686422743202
在这里插入图片描述
3.csdn关于ucos的博客:
在这里插入图片描述

二、代码解读

1.电路图查找:

在这里插入图片描述

(F103-MINI+原理图.pdf)电路图确定io口

led.h

#ifndef __LED_H
#define	__LED_H
#include "stm32f10x.h"
/*相关GPIO口设置*/
#define LED1_GPIO_PORT    	GPIOC		                /* GPIO端口 */
#define LED1_GPIO_CLK 	    RCC_APB2Periph_GPIOC		/* GPIO端口时钟*/
#define LED1_GPIO_PIN		GPIO_Pin_2			        /*小灯D4的端口*/

#define LED2_GPIO_PORT    	GPIOC			            /* GPIO端口 */
#define LED2_GPIO_CLK 	    RCC_APB2Periph_GPIOC		/* GPIO端口时钟*/
#define LED2_GPIO_PIN		GPIO_Pin_3			        /*小灯D5的端口*/

#define ON  0
#define OFF 1

/*直接操作寄存器*/
#define	digitalHi(p,i)		 {p->BSRR=i;}	 //既能控制管脚为高电平,也能控制管脚为低电平。寄存器高 16bit 写1 对应管脚为低电平,对寄存器低16bit写1对应管脚为高电平。简记为高低低高写 0 ,无动作

#define digitalLo(p,i)		 {p->BRR=i;}	 //BRR只写寄存器,只能控制io口为低电平,1为低电平,0无动作
#define digitalToggle(p,i) {p->ODR ^=i;} //ODR寄存器可读可写,高低电平均可控制,但是会因为中断而打断,1高0低


/*宏定义IO口*/
#define LED1_TOGGLE		 digitalToggle(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED1_OFF		   digitalHi(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED1_ON			   digitalLo(LED1_GPIO_PORT,LED1_GPIO_PIN)

#define LED2_TOGGLE		 digitalToggle(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED2_OFF		   digitalHi(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED2_ON			   digitalLo(LED2_GPIO_PORT,LED2_GPIO_PIN)

/*固件库控制*/
#define LED1(a)	if (a)	\
					GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);\
					else		\
					GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN)

#define LED2(a)	if (a)	\
					GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);\
					else		\
					GPIO_ResetBits(LED2_GPIO_PORT,LED2_GPIO_PIN)


void LED_GPIO_Config(void); //定义led的GPIO的初始化

#endif

led.c

#include "bsp_led.h"   

void LED_GPIO_Config(void)
{		
		/*GPIO_InitTypeDef类型结构体*/
		GPIO_InitTypeDef GPIO_InitStructure;
		/*开启led1和led2的外设时钟*/
		RCC_APB2PeriphClockCmd( LED1_GPIO_CLK | LED2_GPIO_CLK , ENABLE);
		/*选择GPIO的引脚*/
		GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;	
		/*推挽输出*/
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
		/*端口速率设置50MHz */   
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
		/*库函数调用,init GPIO*/
		GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);	
		/*选择要控制的GPIO引脚*/
		GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN;
		/*库函数调用,init GPIO*/
		GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);		
		/*关灯*/
		GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
		GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);
}

main.c

#include "stm32f10x.h"
#include "bsp_led.h"

#define SOFT_DELAY Delay(0x0FFFFF);

void Delay(__IO u32 nCount); 

int main(void)
{	
	/*LED端口初始化*/
	LED_GPIO_Config();	 
	while (1)
	{
		LED1_ON;		   // 亮
		SOFT_DELAY;
		LED1_OFF;		   //灭

		LED2_ON;		   //亮
		SOFT_DELAY;
		LED2_OFF;		   //灭

	}
}
void Delay(__IO uint32_t nCount)	 //简单的软件延时
{
	for(; nCount != 0; nCount--);
}

2.采用固件库控制

led.h

#define a 1

main.c

/*在while循环中*/
LED1(a);
SOFT_DELAY;
LED1(!a);
SOFT_DELAY;
LED2(a);
SOFT_DELAY;
LED2(!a);

led.h

#define a 1

main.c

/*在while循环中*/
LED1(a);
SOFT_DELAY;
LED1(!a);
SOFT_DELAY;
LED2(a);
SOFT_DELAY;
LED2(!a);

3.总结:
led.h文件宏定义IO口信息(GPIO_PORT口、GPIO_CLK时钟口、GPIO_PIN引脚)声明端口配置函数 void LED_GPIO_Config(void);
led.c文件GPIO_InitTypeDef GPIO_InitStructure;定义GPIO_InitTypeDef 结构体,便于设置输出模式以及端口速率,配合.h文件中的宏定义指定引脚配合GPIO_InitTypeDef结构体初始化所要控制的GPIO口,打开端口时钟(这一步就是32与51这些单片机不一样的地方,他可以很好的控制功耗,时钟就相当于开关,指定的打开,可以降低功耗)最后设置GPIO口的电平来控制灯的亮灭
main.c中间可以定义简单的软件延时搭配led.h中的宏定义或者直接通过GPIO_SetBits(GPIO_PORT,GPIO_PIN)和GPIO_ResetBits(GPIO_PORT,GPIO_PIN)控制电平变化来达到流水灯的效果。

猜你喜欢

转载自blog.csdn.net/visual_eagle/article/details/108573872
led