GPIO的功能是多样的,驱动LED灯,获得按键的输入信息……。
对于驱动LED灯,按照上面就需要对GPIO进行配置。
基本知识掌握:
2013年4月24日:
下午:
stm32学习的原因:
1、从内核上:一般人开始学习的时候,都是从arm7开始的,但是自从stm32开发板出现后,就发现了人们更多的在
使用了stm32了。
2、从用途上:stm32微控制器在工业控制上、消费电子、手持设备、汽车电子、安防监控等众多领域得到广泛的
应用,而且其高性价比,适合手工DIY的优点。
arm7与stm32的比较:
Cortext-32的速度比arm7块三分之一,功耗低四分之一,并且能够实现更小芯片面积,利于将更多功能整合在更小的
芯片尺寸中。cortex-m3处理器结合了执行Thumb-2指令的32为哈佛微体系结构和系统外设,包括Nested Vec-tored interrupt
Controller和Arbiter总线。、
在工控领域,用户要求具有更快的中断速度,cortex-m3采用了Tail-Chaining中断技术,完全基于硬件进行中断处理,
最多可减少12个时钟周期数,在实际应用中可减少百分之七十的中断数目。
了解AVR:
AVR可以说是一款很成功的一款芯片,功耗低,性能强。较之前的51,性能提高了好几个档次。AVR的外设很丰富,一般的
项目都能满足。
但是自从STM32出现之后,AVR就"退出江湖了"。
因为它跟stm32是没法比的。
3、使用方便:
1、支持串口下载
2、所有的IO端口都可以产生中断
3、技术资料多
4、支持SWD下载
5、复用IO口重映射功能
注意:
编译软件:
1、MDK还是IAR?
一般的都是使用的MDK
2、固件库还是寄存器?
一般的都要用,都要学。
IAR占的编译代码速度,占的flash等等都是比MDK好,但是都不是很大。
但是一般都不用IAR
但是:
keil(被ARM收购了):
1、界面友好
2、配置简单
3、操作简单
stm32最小系统(能使单片机工作的系统):
1、电源
2、复位
3、时钟
4、下载电路(很多人都认为这个不属于最小系统,但是完整的还是加上的)
主要是注意一个是时钟。
注意时钟的分配,来源,几路走出等。
1、系统时钟的初始化函数。
2、延时函数的实现。
软件延时是比较简单的方法,它利用CPU执行一循环语句来产生延时的效果。
对于stm32来说,执行一条指令只有几十个ns,进行for循环,要实现N毫秒的x值非常大,而且由于系统的频率的
宽广,很难计算出延时N毫秒的精确值。
软件延时不占用定时器资源,但占用CPU资源,它的延时精度不高,适合应用在对延时精度不高的场合。
十分要注意的是:
GPIO的配置,很重要的一方面就是时钟的给予,没有时钟,就算一切都配置好了,也是徒劳的。
程序:
LED的头文件的相关信息:
#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
这里有一个很重要的define,对于这次的程序来说,是非常小的,用到的不多的话,一般不用这样定义的。但同时也要看到这个程序的定义
的技巧性。
然后写上led.c的相关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);
}
再个就是主程序的调用问题:
/******************** (C) COPYRIGHT 2013**************************
* 文件名 :main.c
* 描述 :用3.5.0版本建的工程模板。
* 实验平台:野火STM32开发板 应该是STM32F103VET6
* 库版本 :ST3.5.0
*
* 作者 :wit_yuan
* 版本 : v1.0
* 时间 : 2013年4月27日
**********************************************************************************/
#include "stm32f10x.h"
#include "led.h"
void delay(__IO uint32_t time);
/*
* 函数名:main
* 描述 : 主函数
* 输入 :无
* 输出 : 无
*/
int main(void)
{
LED_GPIO_Config();
LED1(ON);
delay(0x0FFFFFFF);
LED1(OFF);
}
void delay(__IO uint32_t time)
{
for(;time>0;time--);
}
需要注意的是,时钟给予的是72MHZ,那么这个程序延时的话,应该是30多秒。结果证明也是差不多时间。
注意:
由于用到了时钟的相关配置,因此需要加上头文件的。
#include "stm32f10x_rcc.h"
上一篇:stm32学习之四
下一篇:基于STM32的PWM输出
推荐阅读最新更新时间:2024-03-16 15:13