學習目標:
掌握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)控制電平變化來達到流水燈的效果,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/55703.html
標籤:AI
