刚刚开始学stm32,做个笔记,用的是野火的iso f103z的板子
按照以往的经验,首先来点个灯。。。
和以往的51相比stm32的功能确实强了不少,啊不,是很多,各种脚各种功能。。。像以往51一样直接操作寄存器开发就变得不现实起来(并不是不可以,如果有人有耐心一边查芯片手册一边开发的话,或者能记住所有寄存器。。。然而就算用库我都得查手册。。。)
LED 实验中用到了 GPIO 和 RCC(用于设置外设时钟)这两个片上外设,所以在操作I/O 之前我们需要把关于这两个外设的库文件添加到工程模板之中。它们分别为stm32f10x_gpio.c和stm32f10x_rcc.c 文 件。其中stm32f10x_gpio.c 用 于 操 作 I/O,而stm32f10x_rcc.c 用于配置系统时钟和外设时钟,由于每个外设都要配置时钟,所以它是每个外设都需要用到的库文件。
首先,我们来看看io操作。先初始化io口。这里库里面定义了一个初始化结构体GPIO_InitTypeDef,来看看它的定义:
typedef struct
{
uint16_t GPIO_Pin; /*指定将要进行配置的 GPIO 引脚*/
GPIOSpeed_TypeDef GPIO_Speed; /*指定 GPIO 引脚可输出的最高频率*/
GPIOMode_TypeDef GPIO_Mode; /*指定 GPIO 引脚将要配置成的工作状态*/
}GPIO_InitTypeDef;
里面的数据st的库也用枚举类型定义了:
typedef enum
{
GPIO_Speed_10MHz = 1, //枚举常量,值为 1,代表输出速率最高为 10MHz
GPIO_Speed_2MHz, //对不赋值的枚举变量,自动加 1,此常量值为 2
GPIO_Speed_50MHz //常量值为 3
}GPIOSpeed_TypeDef;
typedef enum
{
GPIO_Mode_AIN = 0x0, //模拟输入模式
GPIO_Mode_IN_FLOATING = 0x04, //浮空输入模式
GPIO_Mode_IPD = 0x28, //下拉输入模式
GPIO_Mode_IPU = 0x48, //上拉输入模式
GPIO_Mode_Out_OD = 0x14, //开漏输出模式
GPIO_Mode_Out_PP = 0x10, //通用推挽输出模式
GPIO_Mode_AF_OD = 0x1C, //复用功能开漏输出
GPIO_Mode_AF_PP = 0x18 //复用功能推挽输出
}GPIOMode_TypeDef;
同理,初始化也有封装好的库函数GPIO_Init(),用法也很简单
GPIO_InitTypeDef P;
P.GPIO_Pin = GPIO_Pin_0;
P.GPIO_Mode = GPIO_Mode_Out_PP;
P.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &P);
先定义一个初始化结构体,然后通过初始化结构体里的值来赋初值,思路非常清晰。
这里还有一个重要的东西,就是时钟。首先,得开启外设时钟,系统时钟在启动文件里配置好了,这里还需要配置GPIO所需的时钟,GPIO采用的时钟是PCLK2,这里不得不提一下PB1和PB2的区别。
APB2负责AD,I/O,高级TIM,串口1。
APB1负责DA,USB,SPI,I2C,CAN,串口2345,普通TIM
所以我们的io是挂载在PB2上的,开启和关闭外设时钟同样有封装好的库函数
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOF, ENABLE);
同样还有控制io高低电平输出的GPIO_ResetBits(),GPIO_ResetBits()就不一一细说了,上代码:
/**
******************************************************************************
* @file main.c
* @author fire
* @version V1.0
* @date 2013-xx-xx
* @brief ÓÃ3.5.0°æ±¾¿â½¨µÄ¹¤³ÌÄ£°å
******************************************************************************
* @attention
*
* ʵÑéƽ̨:Ò°»ð iSO STM32 ¿ª·¢°å
* ÂÛ̳ :http://www.chuxue123.com
* ÌÔ±¦ :http://firestm32.taobao.com
*
******************************************************************************
*/
#include "stm32f10x.h"
/**
* @brief Ö÷º¯Êý
* @param ÎÞ
* @retval ÎÞ
*/
int main(void)
{
GPIO_InitTypeDef P;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOF, ENABLE);
P.GPIO_Pin = GPIO_Pin_0;
P.GPIO_Mode = GPIO_Mode_Out_PP;
P.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &P);
P.GPIO_Pin = GPIO_Pin_7;
GPIO_Init(GPIOF, &P);
GPIO_SetBits(GPIOB, GPIO_Pin_0);
while(1)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_0);
GPIO_ResetBits(GPIOF, GPIO_Pin_7);
}
/* add your code here ^_^. */
}
/*********************************************END OF FILE**********************/