1. 程式人生 > >普中PZ6806開發板 STM32學習筆記2 使用暫存器點亮一個LED

普中PZ6806開發板 STM32學習筆記2 使用暫存器點亮一個LED

LED 模組電路

在這裡插入圖片描述

我們程式目的是要讓PC0輸出低電平。如果要閃爍,就是讓PC0在高低電平間切換。

STM32 啟動檔案

1. 開啟模板檔案

在這裡插入圖片描述

2. 開啟專案

在這裡插入圖片描述
啟動檔案的功能解析:

  • 初始化堆疊指標SP;
  • 初始化程式計數器指標PC;
  • 設定堆、棧的大小
  • 設定中斷向量表的入口地址;
  • 配置外部SRAM作為資料儲存器(這個由使用者配置,一般的開發板可沒有外部SRAM)
  • 呼叫SystemInit()函式配置STM32的系統時鐘。
  • 設定 C 庫的分支入口“__main"(最終用來呼叫 main 函式)

3. stm32f10x.h

要操作STM32暫存器,我們就需要使用C語言對其封裝,這部分程式放在stm32f10x.h中 。
操作任何外設前,必須開啟外設的時鐘。

// GPIO¹ÒÔØÔÚblock2£¨ËùÓÐƬÄÚÍâÉ裩
#define PERIPH_BASE       ((unsigned int)0x40000000)
#define APB2PERIPH_BASE   (PERIPH_BASE+0x00010000)
#define GPIOC_BASE        (APB2PERIPH_BASE + 0x1000)
#define GPIOC_CRL         *(unsigned int*)(GPIOC_BASE+0x00)
#define GPIOC_CRH         *(unsigned int*)(GPIOC_BASE+0x04)
#define GPIOC_IDR         *(unsigned int*)(GPIOC_BASE+0x08)
#define GPIOC_ODR         *(unsigned int*)(GPIOC_BASE+0x0C)
#define GPIOC_BSRR        *(unsigned int*)(GPIOC_BASE+0x10)
#define GPIOC_BRR         *(unsigned int*)(GPIOC_BASE+0x14)
#define GPIOC_LCKR        *(unsigned int*)(GPIOC_BASE+0x18)
#define AHBPERIPH_BASE    (PERIPH_BASE + 0X20000)
#define RCC_BASE          (AHBPERIPH_BASE + 0x1000)
#define RC_APB2ENR        *(unsigned int*)(RCC_BASE + 0x18)

編寫點亮一個LED程式

#include "stm32f10x.h"

void SystemInit()
{
	//
}

int main()
{
	// 開啟GPIOC時鐘
	RCC_APB2ENR |=1<<4;
	// 設定工作模式
	GPIOC_CRL &= ~(0x0f<<(4 * 0));
	GPIOC_CRL |= (3<<4*0);
	GPIOC_BSRR=(1<<(16+0));
	while(1)
	{
		
	}
}

閃爍

#include "stm32f10x.h"
typedef unsigned int u32;

void SystemInit()
{
	//
}
// 簡單延時函式
void delay(u32 i){
	while(i--);
}

int main()
{
	RCC_APB2ENR |=1<<4;
	GPIOC_CRL &= ~(0x0f<<(4 * 0));
	GPIOC_CRL |= (3<<4*0);
	GPIOC_BSRR=(1<<(16+0));
	while(1)
	{
		GPIOC_BSRR = (1<<(16+0));  //點亮
		delay(0Xfffff);
		GPIOC_BSRR=(1<<(0)); //熄滅
		delay(0Xfffff);
	}
}

閃爍第二個LED燈:

#include "stm32f10x.h"
typedef unsigned int u32;

void SystemInit()
{
	// 
}
// 延時
void delay(u32 i){
	while(i--);
}

int main()
{
	RCC_APB2ENR |=1<<4;
	GPIOC_CRL &= ~(0x0f<<(4 * 1));
	GPIOC_CRL |= (3<<4*1);
	GPIOC_BSRR=(1<<(16+1));
	while(1)
	{
		GPIOC_BSRR = (1<<(16+1));  
		delay(0Xfffff);
		GPIOC_BSRR=(1<<(1)); 
		delay(0Xfffff);
	}
}