最近正在学习STM32,之前一直在用51和AVR单片机,都是八位机,第一次接触32位机,虽然是第一次接触但是根据经验无外乎就是那些东西,配置寄存器,驱动单片机工作。STM32的寄存器相比于51和avr来说可以说不是一个数量级上,由于太多,所以刚开始接触的时候对它的配置并不能得心应手,但是ST公司想到的了这点,他们自己做了一个库,在这个库中把各个寄存器都配置好了,并且做好了各种API函数,用户调用库中的函数,并且配置到相应的各个参数就可以快速的完成对STM32的配置,这样不仅降低了STM32的学习门槛还降低了它的开发成本。

学习一款单片机首先要从点灯开始:

STM32的GPIO(输入输出I/O)有八种配置模式对应定义在头文件中:

GPIO_Mode_AIN 模拟输入

GPIO_Mode_IN_FLOATING 浮空输入

GPIO_Mode_IPD 下拉输入

GPIO_Mode_IPU上拉输入

GPIO_Mode_Out_OD 开漏输出

GPIO_Mode_Out_PP 推挽输出

GPIO_Mode_AF_OD 复用开漏输出

GPIO_Mode_AF_PP 复用推挽输出

 

对GPIO 的配置主要分成以下几个步骤:

①配置GPIO的始终使能

②配置GPIO的输入输出模式

③选择引脚

④配置GPIO的翻转速率(输出时考虑,输入不用考虑)

⑤初始化以上四步 GPIO_Init()

其中ST已经讲②③④封装在 GPIO_InitTypeDef 结构体中了,在使用时我们只需要调用这个结构体就行了

View Code
  1 /*
  2 *copyright(c) 2013.01.17
  3 *All rights reserved
  4 *
  5 *文件名称:STM32_LED 
  6 *当前版本:1.0
  7 *作者: 郑春雨
  8 *邮箱地址:zhengchunyu_1989@sina.com
  9 *完成日期:2013/01/17
 10 */
 11 #include "stm32f10x.h"
 12 
 13 #define RCC_KEY1 RCC_APB2Periph_GPIOA
 14 #define KEY1     GPIO_Pin_0
 15 #define RCC_KEY2 RCC_APB2Periph_GPIOC
 16 #define KEY2     GPIO_Pin_13
 17 #define RCC_KEY3 RCC_APB2Periph_GPIOA
 18 #define KEY3     GPIO_Pin_8
 19 #define RCC_KEY4 RCC_APB2Periph_GPIOD
 20 #define KEY4     GPIO_Pin_3
 21 
 22 GPIO_InitTypeDef  GPIO_InitStructure;//定义结构体,GPIO的配置信息
 23 void delay(void)
 24 {
 25     u16 count,t;
 26     for(count=0;count<10000;count++)
 27     {
 28         for(t=0;t<1000;t++);
 29     }
 30 }
 31 void init_Periph_Config(void)
 32 {
 33     
 34     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);//使能GPIO时钟
 35         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//配置端口输出模式输出推挽
 36         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;//选择引脚
 37         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//配置速率
 38         GPIO_Init(GPIOF,&GPIO_InitStructure);//初始化GPIO
 39     
 40        /*KEY1*/
 41         RCC_APB2PeriphClockCmd(RCC_KEY1,ENABLE);//使能KEY1时钟
 42         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//配置端口输入上拉
 43         GPIO_InitStructure.GPIO_Pin = KEY1;//选择引脚
 44         //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//配置速率
 45         GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIO
 46     
 47         
 48         /*KEY2*/
 49             RCC_APB2PeriphClockCmd(RCC_KEY2,ENABLE);//使能GPIO时钟
 50             GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//配置端口输入上拉
 51             GPIO_InitStructure.GPIO_Pin = KEY2;//选择引脚
 52             //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//配置速率
 53             GPIO_Init(GPIOC,&GPIO_InitStructure);//初始化GPIO
 54     
 55         /*KEY3*/
 56             RCC_APB2PeriphClockCmd(RCC_KEY3,ENABLE);//使能GPIO时钟
 57             GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//配置端口输入上拉
 58             GPIO_InitStructure.GPIO_Pin = KEY3;//选择引脚
 59             //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//配置速率
 60             GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIO
 61     
 62         /*KEY4*/
 63             RCC_APB2PeriphClockCmd(RCC_KEY4,ENABLE);//使能GPIO时钟
 64             GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//配置端口输入上拉
 65             GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;//选择引脚
 66             //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//配置速率
 67             GPIO_Init(GPIOD,&GPIO_InitStructure);//初始化GPIO
 68 }
 69 
 70 
 71 int main(void)
 72 {
 73     
 74     init_Periph_Config();
 75     GPIO_ResetBits(GPIOF,GPIO_Pin_All);//点亮4个LED
 76       while(1)
 77       {    
 78         if(!GPIO_ReadInputDataBit(GPIOA,KEY1))    //按键1按下
 79             {
 80                 
 81                 GPIO_SetBits(GPIOF,GPIO_Pin_6);//LED1灭                
 82             }
 83         else GPIO_ResetBits(GPIOF,GPIO_Pin_6);//LED1亮
 84             
 85         
 86         if(!GPIO_ReadInputDataBit(GPIOC,KEY2))    //按键2按下
 87             {
 88                 GPIO_SetBits(GPIOF,GPIO_Pin_7);    //LED2灭                
 89             }
 90         else GPIO_ResetBits(GPIOF,GPIO_Pin_7);//LED2亮
 91         
 92         if(!GPIO_ReadInputDataBit(GPIOA,KEY3))    //按键3按下
 93             {
 94                 GPIO_SetBits(GPIOF,GPIO_Pin_8);    //LED3灭                
 95             }
 96         else GPIO_ResetBits(GPIOF,GPIO_Pin_8);//LED3亮
 97         if(!GPIO_ReadInputDataBit(GPIOD,KEY4))    //按键4按下
 98             {
 99                 GPIO_SetBits(GPIOF,GPIO_Pin_9);        //    LED4灭        
100             }
101         else GPIO_ResetBits(GPIOF,GPIO_Pin_9);// LED4亮
102     }
103   
104 }