恭喜大家完成了C語言的學習,現在咱們來到咱們的硬件MCU階段,咱們這里的工程用的是keil,環境搭建不再贅述,希望大家在這一階段仍然學的愉快
1.資料部分
用的最多的就是STM32f103的手冊,搭配STM32F103ZET6的開發板
2.概念部分
嵌入式系統:
嵌入式系統是以應用為中心,以現代計算機技術為基礎,能夠根據用戶需求(功能、可靠性、成本、體積、功耗、環境等)靈活裁剪軟硬件模塊的專用計算機系統。
專用計算機:
專用計算機,專為解決某一特定問題而設計制造的電子計算機。一般擁有固定的存儲程序。如控制軋鋼過程的軋鋼控制計算機,計算導彈彈道的專用計算機等,解決特定問題的速度快、可靠性高,且結構簡單、價格便宜。
單片機:
單片機MCU(Single-Chip Microcomputer)是一種集成電路芯片,是采用超大規模集成電路技術把具有數據處理能力的中央處理器CPU、隨機存儲器RAM、只讀存儲器ROM、多種I/O口和中斷系統、定時器/計數器等功能(可能還包括顯示驅動電路、脈寬調制電路、模擬多路轉換器、A/D轉換器等電路)集成到一塊硅片上構成的一個小而完善的微型計算機系統,在工業控制領域廣泛應用。從上世紀80年代,由當時的4位、8位單片機,發展到現在的300M的高速單片機。
CPU:
中央處理器(Central Processing Unit,簡稱CPU)作為計算機系統的運算和控制核心,是信息處理、程序運行的最終執行單元。CPU自產生以來,在邏輯結構、運行效率以及功能外延上取得了巨大發展。?
ARM:
arm公司:
ARM處理器是英國Acorn有限公司設計的低功耗成本的第一款RISC微處理器。全稱為Advanced RISC Machine。ARM處理器本身是32位設計,但也配備16位指令集,一般來講比等價32位代碼節省達35%,卻能保留32位系統的所有優勢。
arm架構:
ARM架構,曾稱進階精簡指令集機器(Advanced?RISC?Machine)更早稱作Acorn?RISC Machine,是一個32位精簡指令集(RISC)處理器架構。還有基于ARM設計的派生產品,重要產品包括Marvell的XScale架構和德州儀器的OMAP系列。
我們現在使用的單片機都是基于ARM架構(精簡指令集使用的是匯編)下的產物,有了架構之后,根據不同的架構設計不同的芯片
咱們現在使用的芯片就是ST公司設計的。
意法半導體(ST)集團于1987年6月成立,是由意大利的SGS微電子公司和法國Thomson半導體公司合并而成。1998年5月,SGS-THOMSON Microelectronics將公司名稱改為意法半導體有限公司。意法半導體是世界最大的半導體公司之一,2006年全年收入98.5億美元,2007年前半年公司收入46.9億美元
ARM公司和ST公司的關系:
ARM公司主要是設計芯片處理器(圖紙)不去生產芯片,ST公司得到授權之后,可以在ARM公司的處理器基礎上,去擴展芯片功能,比如添加ADC 串口 定時器.......,ST公司對芯片設計完善之后,交由專門的芯片制造公司進行生產。
寄存器:(按位存儲)
寄存器的功能是存儲二進制代碼,它是由具有存儲功能的觸發器組合起來構成的。一個觸發器可以存儲1位二進制代碼,故存放n位二進制代碼的寄存器,需用n個觸發器來構成。
觸發器:
雙穩態觸發器是一種具有記憶功能的
邏輯單元電路。它能儲存一位二進制碼。它有兩個穩定的工作狀態,在外加信號觸發下電路可從一種穩定的工作狀態轉換到另一種穩定的工作狀態。
邏輯單元:
邏輯單元(LU)是進入IBM系統網絡體系結構(SNA)的
網絡端口,通過它用戶可以訪問網絡資源,或一個程序員與另一個程序員通信。
3.初識單片機
1.單片機的資源
2.驅動LED燈(經典案例--入門)
1.LED燈在哪一個IO口上連接
什么是IO口:單片機中的輸入輸出管腳
單片機中的IO口的表示方式:
PG2--(p--port G--端口序號 2--特定端口下的引腳順序--序列號)
G端口中的第二個管腳
PA0--端口A中的第0個管腳
每一個端口中最多有幾個引腳???16個
PA16---不存在的
我們的單片機總共由144個管腳,但是可以供我們使用的管腳是112個,7個端口(A B C D E F G)
3.查看原理圖:
低電平:0V--1.5V 數字量:0
由原理圖可得到,LED燈(D0)連接的是單片機中的PB5管腳:
D0--亮--PB5輸出一個低電平
D0--滅--PB5輸出一個高電平
單片機開發中,前期最重要的就是如何判斷一個IO口的輸入輸出功能
輸出--驅動外部電路,根據IO口的電平狀態,執行相關的功能 led
輸入--MCU用于檢測外部電路的電平狀態的改變,KEY
4.根據手冊編寫代碼
內存的區分:
GPIO功能描述
IO口輸入輸出方式8種:
?
輸出:
通用開漏輸出:通用的開漏輸出,只能輸出低電平,無法輸出高電平,只能處于高阻態(斷路)
通用推挽輸出:既可以輸出高電平,也可以輸出低電平。
復用開漏輸出:具有通用開漏的特性,但是他的應用場合都是在單片機中除了IO口輸出單一的開關量之外的,其他外設功能設置,比如IIC。
復用推挽輸出:具有通用推挽的特性,但是他的應用場合都是在單片機中除了IO口輸出單一的開關量之外的,其他外設功能設置,比如SPI 串口 定時器.......。
輸入:
浮空輸入:既不連接高電平也不連接低的電平(初始狀態),當前管腳的狀態完全由外部設備決定,這一種輸入方式在51單片機是很危險的。但是在STM32中可以接受的,內部會去處理這個引腳的電平狀態,一般都會外加上拉或者下拉電阻。
上拉輸入:在IO口作為輸入狀態的時候,連接上拉電阻,起始狀態---高電平
下拉輸入:在IO口作為輸入狀態的時候,連接下拉電阻,起始狀態---低電平
模擬輸入:主要是用于AD轉換
復用功能參考列表:
在以上手冊的第31頁:
時鐘
在我們的單片機中時鐘的大小,主要是決定了單片機處理器處理數據的快慢。
內核:
時鐘大小:72MHZ
內存大小:
256 to 512 Kbytes of Flash memory---相當于硬盤 up to 64 Kbytes of SRAM--相當于運行內存
單片機中的io口中,每一個端口都有一個獨立的時鐘,那么也就是說,你在使用某一個IO口的時候,必須要先操作時鐘(打開)
5.操作PB5步驟:
1.打開時鐘
由上圖可得,B端口時鐘連接在APB2總線上的
時鐘的配置在我們的中文參考手冊的第六章節
RCC_APB2ENR |=0X01
2.配置PB5工作模式--通用推挽輸出
復位值:寄存器的初始數值
20--23--0010
當寄存器的初始值不為零,或者當前不知道寄存器的初始值是多少,建議先清零需要操作的位,然后再次執行相關操作。
3.輸出高電平或者低電平
PB5拉高---GPIOB |=(0X01PB5拉低---GPIOB &=~(0X01
6.寫代碼驅動LED燈
編寫代碼的步驟:
1.打開B端口的時鐘
2.配置PB5管腳
3.設置PB5的輸出狀態(高電平或者低電平)
添加文件:
保存文件到以下路徑中:(api是我們自己新建的文件夾)
.h文件的保存方式和路徑與.c文件是一樣的;
添加文件到工程:
添加.h文件到工程:
寄存器的編寫方式:
led.c#include "led.h" void Led_Config(void){ // 1.打開B端口的時鐘 RCC->APB2ENR |=(0X01<<3);//2.配置PB5管腳 GPIOB->CRL &=~(0x0f<<20); GPIOB->CRL |=(0x02<<20);//3.設置PB5的輸出狀態(高電平或者低電平) GPIOB->ODR |=(0X01<<5);}
led.h#ifndef _LED_H_
#define _LED_H_
#include "stm32f10x.h"//stm32中的相關宏定義類型等存在的位置
void Led_Config(void); #endif
main.c#include "stm32f10x.h" // 相當于51單片機中的 #include <reg51.h> #include "led.h"
void delay(u32 tim)
int main(void) {
// 來到這里的時候,系統的時鐘已經被配置成72M。Led_Config();
while(1)
{ GPIOB->ODR |=(0X01<<5); delay(2000000);
GPIOB->ODR &=~(0X01<<5); delay(2000000); }
}
void delay(u32 tim){ while(tim--); }
庫函數的編寫方式:
//庫函數的編寫方式
void led_Init(void)
{
GPIO_InitTypeDef gpio_initsources;//打開時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);gpio_initsources.GPIO_Pin=GPIO_Pin_5;gpio_initsources.GPIO_Mode=GPIO_Mode_Out_PP;gpio_initsources.GPIO_Speed=GPIO_Speed_2MHz;//配置PB5//void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);GPIO_Init(GPIOB,&gpio_initsources);}
main.c
main.c
int main(void)
{// 來到這里的時候,系統的時鐘已經被配置成72M。//Led_Config();//寄存器led_Init();while(1){
// GPIOB->ODR |=(0X01<<5);GPIO_SetBits(GPIOB,GPIO_Pin_5);delay(2000000);
// GPIOB->ODR &=~(0X01<<5);GPIO_ResetBits(GPIOB,GPIO_Pin_5);delay(2000000);}
}
安裝一個STLINK的驅動:
網上找一個直接按照提示安裝即可
下載完成之后,直接運行。