掌握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)控制电平变化来达到流水灯的效果。