stm32學(xué)習(xí)之三
GPIO的功能是多樣的,驅(qū)動(dòng)LED燈,獲得按鍵的輸入信息……。
本文引用地址:http://m.butianyuan.cn/article/201612/325173.htm對(duì)于驅(qū)動(dòng)LED燈,按照上面就需要對(duì)GPIO進(jìn)行配置。
基本知識(shí)掌握:
2013年4月24日:
下午:
stm32學(xué)習(xí)的原因:
1、從內(nèi)核上:一般人開(kāi)始學(xué)習(xí)的時(shí)候,都是從arm7開(kāi)始的,但是自從stm32開(kāi)發(fā)板出現(xiàn)后,就發(fā)現(xiàn)了人們更多的在
使用了stm32了。
2、從用途上:stm32微控制器在工業(yè)控制上、消費(fèi)電子、手持設(shè)備、汽車(chē)電子、安防監(jiān)控等眾多領(lǐng)域得到廣泛的
應(yīng)用,而且其高性?xún)r(jià)比,適合手工DIY的優(yōu)點(diǎn)。
arm7與stm32的比較:
Cortext-32的速度比arm7塊三分之一,功耗低四分之一,并且能夠?qū)崿F(xiàn)更小芯片面積,利于將更多功能整合在更小的
芯片尺寸中。cortex-m3處理器結(jié)合了執(zhí)行Thumb-2指令的32為哈佛微體系結(jié)構(gòu)和系統(tǒng)外設(shè),包括Nested Vec-tored interrupt
Controller和Arbiter總線(xiàn)。、
在工控領(lǐng)域,用戶(hù)要求具有更快的中斷速度,cortex-m3采用了Tail-Chaining中斷技術(shù),完全基于硬件進(jìn)行中斷處理,
最多可減少12個(gè)時(shí)鐘周期數(shù),在實(shí)際應(yīng)用中可減少百分之七十的中斷數(shù)目。
了解AVR:
AVR可以說(shuō)是一款很成功的一款芯片,功耗低,性能強(qiáng)。較之前的51,性能提高了好幾個(gè)檔次。AVR的外設(shè)很豐富,一般的
項(xiàng)目都能滿(mǎn)足。
但是自從STM32出現(xiàn)之后,AVR就"退出江湖了"。
因?yàn)樗鷖tm32是沒(méi)法比的。
3、使用方便:
1、支持串口下載
2、所有的IO端口都可以產(chǎn)生中斷
3、技術(shù)資料多
4、支持SWD下載
5、復(fù)用IO口重映射功能
注意:
編譯軟件:
1、MDK還是IAR?
一般的都是使用的MDK
2、固件庫(kù)還是寄存器?
一般的都要用,都要學(xué)。
IAR占的編譯代碼速度,占的flash等等都是比MDK好,但是都不是很大。
但是一般都不用IAR
但是:
keil(被ARM收購(gòu)了):
1、界面友好
2、配置簡(jiǎn)單
3、操作簡(jiǎn)單
stm32最小系統(tǒng)(能使單片機(jī)工作的系統(tǒng)):
1、電源
2、復(fù)位
3、時(shí)鐘
4、下載電路(很多人都認(rèn)為這個(gè)不屬于最小系統(tǒng),但是完整的還是加上的)
主要是注意一個(gè)是時(shí)鐘。
注意時(shí)鐘的分配,來(lái)源,幾路走出等。
1、系統(tǒng)時(shí)鐘的初始化函數(shù)。
2、延時(shí)函數(shù)的實(shí)現(xiàn)。
軟件延時(shí)是比較簡(jiǎn)單的方法,它利用CPU執(zhí)行一循環(huán)語(yǔ)句來(lái)產(chǎn)生延時(shí)的效果。
對(duì)于stm32來(lái)說(shuō),執(zhí)行一條指令只有幾十個(gè)ns,進(jìn)行for循環(huán),要實(shí)現(xiàn)N毫秒的x值非常大,而且由于系統(tǒng)的頻率的
寬廣,很難計(jì)算出延時(shí)N毫秒的精確值。
軟件延時(shí)不占用定時(shí)器資源,但占用CPU資源,它的延時(shí)精度不高,適合應(yīng)用在對(duì)延時(shí)精度不高的場(chǎng)合。
十分要注意的是:
GPIO的配置,很重要的一方面就是時(shí)鐘的給予,沒(méi)有時(shí)鐘,就算一切都配置好了,也是徒勞的。
程序:
LED的頭文件的相關(guān)信息:
#ifndef _LED_H
#define _LED_H
#include "stm32f10x.h"
#define ON 1
#define OFF 0
#define LED1(a) if (a)
GPIO_ResetBits(GPIOC,GPIO_Pin_3);
else
GPIO_SetBits(GPIOC,GPIO_Pin_3)
#define LED2(a) if (a)
GPIO_ResetBits(GPIOC,GPIO_Pin_4);
else
GPIO_SetBits(GPIOC,GPIO_Pin_4)
#define LED3(a) if (a)
GPIO_ResetBits(GPIOC,GPIO_Pin_5);
else
GPIO_SetBits(GPIOC,GPIO_Pin_5)
void LED_GPIO_Config(void);
#endif
這里有一個(gè)很重要的define,對(duì)于這次的程序來(lái)說(shuō),是非常小的,用到的不多的話(huà),一般不用這樣定義的。但同時(shí)也要看到這個(gè)程序的定義
的技巧性。
然后寫(xiě)上led.c的相關(guān)GPIO配置信息,
#include "led.h"
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);
}
再個(gè)就是主程序的調(diào)用問(wèn)題:
/******************** (C) COPYRIGHT 2013**************************
* 文件名 :main.c
* 描述 :用3.5.0版本建的工程模板。
* 實(shí)驗(yàn)平臺(tái):野火STM32開(kāi)發(fā)板應(yīng)該是STM32F103VET6
* 庫(kù)版本 :ST3.5.0
*
* 作者 :wit_yuan
* 版本 : v1.0
* 時(shí)間 : 2013年4月27日
**********************************************************************************/
#include "stm32f10x.h"
#include "led.h"
void delay(__IO uint32_t time);
/*
* 函數(shù)名:main
* 描述 : 主函數(shù)
* 輸入 :無(wú)
* 輸出 : 無(wú)
*/
int main(void)
{
LED_GPIO_Config();
LED1(ON);
delay(0x0FFFFFFF);
LED1(OFF);
}
void delay(__IO uint32_t time)
{
for(;time>0;time--);
}
需要注意的是,時(shí)鐘給予的是72MHZ,那么這個(gè)程序延時(shí)的話(huà),應(yīng)該是30多秒。結(jié)果證明也是差不多時(shí)間。
注意:
由于用到了時(shí)鐘的相關(guān)配置,因此需要加上頭文件的。
#include "stm32f10x_rcc.h"
評(píng)論