/*
*********************************************************************************************************
*
* 模块名称 : 主程序模块。
* 文件名称 : main.c
* 版 本 : V2.0
* 说 明 : 点亮LED入门例程。
* 修改记录 :
* 版本号 日期 作者 说明
* v2.0 2011-10-16 armfly ST固件库V3.5.0版本。
*
*
*********************************************************************************************************
*/
#include "stm32f10x.h" /* 如果要用ST的固件库,必须包含这个文件 */
/*
*********************************************************************************************************
* 函 数 名: main
* 功能说明: c程序入口
* 形 参:无
* 返 回 值: 错误代码(无需处理)
*********************************************************************************************************
*/
int main(void)
{
/*
51单片机的CPU主频直接有外部晶振决定,无需任何配置即可开始操作IO口。
而STM32功能强大,CPU主时钟选项很多,而且必须配置后才能正常工作。
不过幸运的是,在进入main()之前,ST固件库中的启动文件已经帮我们设置好了CPU时钟。
我们暂时可以不管它,直接开始我们的第一个应用:点亮开发板上的LED1指示灯(PF6 = 0 点亮LED1)
*/
/*
51单片机的IO口无需任何配置即可直接设置输出0和1。
STM32的GPIO有很多功能,可以关闭GPIO时钟降低功耗,可以设置为浮空输入、上拉输入、下拉输入、推挽输出、
开漏输出等多种工作模式,
CPU复位后,GPIO默认为GPIO时钟关闭和浮空输入,
因此我们需要使能GPIO时钟并配置GPIO为推挽输出模式,才能驱动LED
*/
GPIO_InitTypeDef init; /* 定义一个GPIO的结构体变量 */
/* 说明:GPIO_InitTypeDef 是ST固件库中定义的一个结构体变量类型
由于GPIO的参数很多,如果用函数形参设置每个参数,那么函数的形参太多了,因此ST使用了结构体变量,先
设置结构体变量每个成员的值,然后在执行GPIO设置
*/
/* 打开GPIOF的时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);
init.GPIO_Pin = GPIO_Pin_6; /* 我们要控制的LED是PF6, 这个参数需要设置为 GPIO_Pin_6 (1个常量宏) */
init.GPIO_Mode = GPIO_Mode_Out_PP; /* 设置为输出推挽模式, Out表述Output,PP = Pull Push 推挽 */
init.GPIO_Speed = GPIO_Speed_50MHz; /* 设置GPIO工作的最大频率,降低速度可以抑制GPIO信号跳变沿的振铃现象 */
/* 注意:之前的代码都是对CPU内部变量进行操作,还没有开始操作CPU的功能寄存器 */
/* GPIO_Init函数是ST固件库的函数,这一步将完成修改CPU寄存器的工作
第1个参数 GPIOF 表示GPIO端口名,由于LED是PF6,位于GPIOF端口,因此此处是GPIOF
第2个参数 &init 表示init结构体变量的指针
*/
GPIO_Init(GPIOF, &init);
/* 如果单步调试,执行完GPIO_Init()后,你会发现LED灯已经亮了。这是因为GPIO输出寄存器缺省是0,当切换到
输出模式时,会立刻输出0电平,对于安富莱STM32开发板,0电平表示点亮LED */
/* 调用这个函数设置 PF6 = 1 熄灭LED1 */
GPIO_SetBits(GPIOF, GPIO_Pin_6);
/* 调用这个函数设置 PF6 = 0 点亮LED1 */
GPIO_ResetBits(GPIOF, GPIO_Pin_6);
while (1); /* 一个死循环语句,程序停在此处 */
/* 通过这个例子,记住2点:
(1) 使用任何外设,均需要开启对应外设的时钟。固件库中有专门的函数
(2) 使用GPIO前先使用GPIO_Init() 配置GPIO工作模式,除非您正好需要GPIO作为输入模式
*/
}