最近正在学习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 }