普中PZ6806開發板 STM32學習筆記2 使用暫存器點亮一個LED
阿新 • • 發佈:2018-12-30
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);
}
}