sdlu的stm32学习笔记(2)点灯实验
教你用STM32一步一步点亮led灯
教你⽤STM32⼀步⼀步点亮led灯STM32之⼀步⼀步点亮led (2011-05-09 19:40)标签: stm32led v3.4MDK 4.12⼊门分类:stm32⼊⼿stm32以来,⼀直想快速上⼿,所以在各⼤论坛闲逛,各个达⼈的blog上学习,正所谓欲速则不达,⼼急是吃不了热⾖腐的!有⽊有?最终决定使⽤st官⽹的库开发,据⼤侠们写道使⽤库可以快速上⼿,貌似的确如此,⼀个个教程写的那么好,直接拿过来⽤就是了。
可是那么多个库,聪明的你请告诉到底选择哪⼀个啊?My God!实话实说,我被这些库折腾了个够!好吧,我最后还是承认最后⽤的是v3.4的库,是很⽅便!切⼊正题,点亮LED。
硬件:红⽜开发板,STM32F103ZET6(144封装).软件:RealView MDK 4.12stm32固件库:v3.4 附上⾃⼰整理后的库: V3.4_clean.rar根据官⽹库⾃⼰整理了下,新建了⼯程模板如下图:(主要参考⽂章《在Keil MDK+环境下使⽤STM32 V3.4库.pdf》)在KeilMDK+环境下使⽤STM32V3.4库.pdf⼊图所⽰:新建⼀个⽬录01_ProLed,建议放在英⽂路径下,避免不必要的⿇烦。
将上⾯的库v3.4解压到此⽬录,再新建⼀个project⽬录,存放⼯程。
说明:CMSIS:最底层接⼝。
StartUp:系统启动⽂件。
StdPeriph_Lib:stm32外围设备驱动⽂件。
Project:⼯程⽂件。
User:⽤户⽂件。
新建⼯程步骤:此处略去300字。
简单说明:1.core_cm3.c/core_cm3.h该⽂件是内核访问层的源⽂件和头⽂件,查看其中的代码多半是使⽤汇编语⾔编写的。
在线不甚了解。
--摘⾃《在Keil MDK+环境下使⽤STM32 V3.4库》2.stm32f10x.h该⽂件是外设访问层的头⽂件,该⽂件是最重要的头⽂件之⼀。
就像51⾥⾯的reg51.h⼀样。
基于stm32灯光自动调节,实验结果及分析
基于stm32灯光自动调节,实验结果及分析在当今智能化时代,灯光自动调节系统在我们的日常生活中越来越普及。
本文将围绕基于STM32的灯光自动调节系统进行实验,展示其实验结果并进行分析。
一、实验原理及设备基于STM32的灯光自动调节系统采用光传感器和温度传感器采集环境光和温度信息,通过算法处理,自动调节灯光亮度及色温,以达到最佳的舒适度。
实验中使用的设备包括STM32开发板、光传感器、温度传感器、LED灯等。
二、实验过程实验过程中,我们首先通过STM32开发板读取光传感器和温度传感器采集的环境信息。
然后,根据事先设定的算法,将读取的数据转化为灯光亮度和色温的控制信号。
最后,将控制信号传递给LED灯,实现灯光的自动调节。
实验过程中需要注意以下几点:1.确保硬件设备的连接正确无误,包括传感器与开发板的连接、LED灯的控制信号线等。
2.确保软件的正常运行,包括数据采集、算法处理和灯光控制等。
3.考虑到环境变化可能对灯光调节产生影响,需要预设一定的调节范围和调节时间间隔。
三、实验结果及分析在实验过程中,我们观察了灯光自动调节系统的实际效果。
以下为实验结果及分析:1.灯光亮度及色温的调节范围:实验结果显示,灯光自动调节系统的亮度及色温调节范围均在预期范围内,满足实际使用需求。
2.灯光亮度及色温的准确性:通过对比预设的参考值,实验结果显示灯光亮度及色温的调节准确性较高,尤其是在环境光变化较为平稳时,能够迅速达到预设值。
3.系统的稳定性:实验过程中,灯光自动调节系统在长时间运行后仍能保持稳定性能,未出现明显的调节误差或异常现象。
4.系统的实时性:在环境光变化较快的情况下,系统能够迅速响应并作出相应的调节动作,满足实时性的要求。
综上所述,基于STM32的灯光自动调节系统在实验中表现出良好的性能和稳定性。
其实验结果表明,该系统能够在不同环境下实现灯光的自动调节,提高人们的舒适度。
四、应用前景及改进方向基于STM32的灯光自动调节系统具有广泛的应用前景,尤其在智能家居、办公室、学习空间等领域具有巨大的潜力。
STM32的GPIO输出编程实例之点亮三色LED
STM32的GPIO输出编程实例之点亮三色LED一、概述:1、发光二极管简介发光二极管是半导体二极管的一种,可以把电能转化为光能,常简写为LED。
常用的是发红光、绿光或黄光的二极管。
发光二极管的反向击穿电压约为5V。
它的正向伏安特性曲线很陡,使用时必须串联限流电阻以控制通过管子的电流。
限流电阻R可用下式计算:R = (E - UF)/IF式中E为电源电压,UF为LED的正向压降,IF为LED的一般工作电流。
LED广泛应用于各种电子电路、家电、仪表等设备中,做电源或电平指示。
2、STM32 GPIO简介STM32F4每组通用I/O 端口包括4 个32 位配置寄存器(MODER、OTYPER、OSPEEDR 和PUPDR)、2 个32 位数据寄存器(IDR 和ODR)、1 个32 位置位/复位寄存器(BSRR)、1 个32 位锁定寄存器(LCKR) 和2 个32 位复用功能选择寄存器(AFRH 和AFRL)等。
GPIO可以配置成以下8种工作模式:浮空输入:此端口在默认情况下什么都不接,呈高阻态,这种设置在数据传输时用的比较多。
上拉输入:上拉输入模式与浮空输入模式相比,仅仅是在数据通道上部,接入了一个上拉电阻,这个上拉电阻的阻值介于30K~50K欧姆,CPU可以随时在输入数据寄存器的另一端,读出I/O端口的电平状态。
这种模式的好处在于我们什么都不输入时,由于内部上拉电阻的原因,处理器会觉得我们输入了高电平,这就避免了不确定的输入。
该端口在默认情况下输入为高电平。
模拟功能:STM32的模拟输入通道的配置很简单,信号从I/O端口直接进入ADC模块。
此时,所有的上拉、下拉电阻和施密特触发器,均处于断开状态,因此输入数据寄存器将不能反映端口上的电平状态,也就是说,模拟输入配置下,信号不经过输入数据寄存器,CPU不能在输入数据寄存器上读到有效的数据。
该输入模式,使我们可以获得外部的模拟信号开漏输出:开漏输出不可以直接输出高电平,开漏输出的输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行。
STM32实验报告
实验一:一个灯的闪烁一、实验要求1.熟悉使用STM32F103ZET6开发板2.利用C语言程序实现一个灯闪烁二、电路原理图图1-1 LED灯硬件连接图三、软件分析1.本实验用到以下3个库函数(省略了参数):RCC_DeInit();RCC_APB2PeriphClockCmd();GPIO_Init();2.配置输入的时钟:SystemInit()主要对RCC寄存器进行配置,GPIOA连接在APB2上,因此RCC_APB2PeriphClockCmd()函数需要使能APB2Periph_GPIOA3.声明GPIO结构: PF6~PF10口配置为输出GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;4.应用GPIO口:点亮LED1有五种方法①ODR寄存器法:GPIOA->ODR=0xffbf;②位设置/清除寄存器法:GPIOA->BRR|=0X001;③方法③只适用于GPIOx_BSRR寄存器④GPIO_WriteBit()函数法:GPIO_Write(0xffbf);⑤置位复位库函数法:GPIO_ResetBits(GPIOF,GPIO_Pin_8);5.主函数程序:int main(void){RCC_Configuration(); /* 配置系统时钟 */GPIO_Configuration(); /* 配置GPIO IO口初始化 */ for(;;){GPIOF->ODR = 0xfeff; /* PF8=0 --> 点亮D3 */Delay(600000);GPIOF->ODR = 0xffff; /* PF8=1 --> 熄灭D3 */Delay(600000);}}四、实验现象下载程序后开发板上的LED1灯闪烁五、总结通过对本实验可以发现,和51等8位单片机相比,STM32对I/O端口的操作变得复杂了许多。
stm32 实验报告
stm32 实验报告STM32 实验报告一、引言STM32是一款由STMicroelectronics公司推出的32位单片机系列,具有高性能、低功耗和丰富的外设资源等特点。
本篇实验报告将介绍我在学习和实践STM32过程中的一些经验和成果。
二、实验目的本次实验的目的是通过使用STM32单片机,实现一个简单的温度监测系统。
通过该实验,我希望能够熟悉STM32的开发环境,掌握基本的硬件连接和编程方法,并能够成功运行一个简单的应用程序。
三、实验步骤1. 硬件连接:将STM32单片机与温度传感器、LCD显示屏等硬件设备连接起来。
确保连接正确,避免短路或接触不良的情况。
2. 开发环境搭建:下载并安装STM32CubeIDE,配置开发环境。
这是一个集成开发环境,支持STM32系列的开发和调试。
3. 编写代码:使用C语言编写一个简单的程序,实现温度传感器数据的读取和显示。
在编写代码过程中,需要熟悉STM32的寄存器和外设配置,以及相关的函数库。
4. 编译和烧录:将编写好的代码进行编译,生成可执行文件。
然后使用JTAG或SWD接口将可执行文件烧录到STM32单片机中。
5. 测试和调试:将STM32单片机连接到电源,观察LCD显示屏上是否正确显示当前的温度数值。
如果有错误或异常情况,需要进行调试和排查。
四、实验结果经过以上的实验步骤,我成功地实现了一个简单的温度监测系统。
在LCD显示屏上,我可以清晰地看到当前的温度数值,并且该数值能够实时更新。
通过与实际温度计的对比,我发现该系统的测量结果相当准确。
五、实验总结通过这次实验,我对STM32单片机的开发和应用有了更深入的了解。
我学会了如何搭建开发环境、编写代码、编译和烧录程序,并且成功实现了一个简单的应用。
在实验过程中,我也遇到了一些问题,但通过查阅资料和与同学的交流,我能够及时解决这些问题。
在今后的学习和实践中,我将进一步探索STM32单片机的功能和应用领域。
我希望能够深入研究更复杂的项目,并挖掘出更多的潜力。
STM32基本GPIO操作:点灯(库函数+寄存器)
STM32基本GPIO操作:点灯(库函数+寄存器)社团作业=_=开发版上的LED灯负极连接在PB5⼝,正极串联⼀510Ω电阻后与3.3V相连若开发板不带LED灯则需要⾃⾏连接,务必串联⼀个合适的电阻防⽌LED灯烧坏零、⼀个有趣的延时函数来⾃于开发板配套资料当中的例程,第⼀次看到的时候觉得⽿⽬⼀新,代码如下:void Delay(u32 count){u32 i = 0;for (; i < count; i++);}当中的u32类型是在stm32f10x.h当中的⼀个宏定义,对应uint32_t,表⽰32位⽆符号型整数,在我的开发板当中就是unsigned int类型。
因为STM32的主频⽐电脑CPU慢得多,因此可以通过这种循环的⽅式来达到延时的效果⼀、库函数版本1.初始化以下是初始化PB5端⼝的代码// 定义⼀个类型为GPIO_InitTypeDef,名字叫做GPIO_InitStructure的结构体GPIO_InitTypeDef GPIO_InitStructure;// PORTB时钟使能RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);// 配置结构体GPIO_InitStructureGPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // 设置GPIO端⼝号为5GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 设置端⼝模式为推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置输出速率为50MHz// 初始化GPIO_Init(GPIOB, &GPIO_InitStructure); // 传⼊的是结构体的指针初始化流程:时钟使能→创建⼀个含端⼝配置信息的结构体→使⽤该结构体初始化初始化其它端⼝:以PC2端⼝为例,将以上代码中的两处GPIOB改为GPIOC,把GPIO_Pin_5改为GPIO_Pin_2即可端⼝模式(STM32有8种):输⼊浮空(GPIO_Mode_IN_FLOATING)、输⼊上拉(GPIO_Mode_IPU)、输⼊下拉(GPIO_Mode_IPD)、模拟输⼊(GPIO_Mode_AIN)、开漏输出(GPIO_Mode_Out_OD)、开漏复⽤功能(GPIO_Mode_AF_OD)、推挽式输出(GPIO_Mode_Out_PP)、推挽式复⽤功能(GPIO_Mode_AF_PP)其他的⽬前没弄懂,反正设置为推挽输出模式就能够输出⾼/低电平了启动同组的多个端⼝:例如要同时启⽤PB5,PB6端⼝,第⼀种⽅案是在上⾯的代码之后添加以下内容GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_Init(GPIOB, &GPIO_InitStructure);因为PB5、PB6同属于GPIOB组,GPIOB的时钟已经使能且PB6端⼝的其他配置和PB5端⼝相同,因此改变结构体的端⼝号之后再次执⾏初始化函数即可第⼆种⽅案是将上述代码当中的GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;改为GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6;因为GPIO_Pin_0 ~ GPIO_Pin_15分别对应⼆进制数1、10、100、……,因此使⽤位运算当中的或运算即可将两个参数叠加起来同理,如果想同时使能PORTA、PORTB、PORTC时钟,则可将RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);改为RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE);2.使⽤由于PB5⼝与LED负极相连,因此仅当输出低电平时LED灯才会亮设置为低电平:GPIO_ResetBits(GPIOB, GPIO_Pin_5);设置为⾼电平:GPIO_SetBits(GPIOB, GPIO_Pin_5);3.闪灯例程代码如下:void Delay(unsigned int count){unsigned int i = 0;for (; i < count; i++);}int main(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);while (1){GPIO_SetBits(GPIOB, GPIO_Pin_5);Delay(10000000);GPIO_ResetBits(GPIOB, GPIO_Pin_5);Delay(10000000);}}Delay()当中的数字可根据实际设备的运⾏频率做相应调整⼆、寄存器版本(建议和库函数版本对⽐异同)这⼀部分需要对C语⾔的位运算有⼀定的了解0.寄存器以下是需要⽤到的寄存器,通过查询STM32中⽂参考⼿册7.3和8.2可获得更加详细的信息。
stm32单片机寄存器点灯知识点
stm32单片机寄存器点灯知识点光电开关是一种能够将光信号转换为电信号的装置。
通过检测光电开关的状态变化,我们可以实现对外部设备的控制。
STM32单片机作为一种常用的嵌入式处理器,其寄存器点灯是我们学习和掌握的基础知识点之一。
在使用STM32单片机进行寄存器点灯的过程中,需要了解以下几个关键概念。
1. 硬件寄存器:STM32单片机内部包含了各种硬件模块,如GPIO(通用输入/输出)、TIM(定时器)等,这些模块都与一些特定的硬件寄存器关联。
通过对这些寄存器的配置,我们可以实现对相应硬件模块的控制。
2. GPIO配置:GPIO是STM32单片机最常用的硬件模块之一,用于控制外部设备,如LED灯等。
在寄存器点灯的过程中,首先需要配置相应的GPIO引脚为输出模式。
通过设置GPIO的控制寄存器,可以配置引脚的工作模式、输出电平等参数。
3. 控制寄存器的设置:每个GPIO引脚都有对应的控制寄存器,在寄存器点灯中,我们需要设置控制寄存器来控制引脚的工作模式、输出电平等。
通过对控制寄存器进行位操作,可以实现对引脚的控制。
4. 轮询方式:在寄存器点灯的程序中,常用的方式是采用轮询的方式来检测输入状态并进行相应操作。
通过读取GPIO输入数据寄存器,可以获取当前引脚的状态,进而判断是否需要进行点亮或熄灭操作。
在进行STM32单片机寄存器点灯的代码编写时,可以按照以下步骤进行:1. 初始化GPIO引脚:通过设置GPIO的控制寄存器,将相应引脚配置为输出模式。
2. 进入循环:使用一个无限循环,使程序一直运行。
3. 轮询引脚状态:通过读取GPIO输入数据寄存器,获取当前引脚的状态。
4. 控制LED灯状态:根据引脚状态判断,可以通过设置GPIO的输出数据寄存器,控制LED灯的点亮或者熄灭。
5. 延时等待:为了能够看到LED灯的状态变化,可以通过添加适当的延时函数,使LED灯的状态变化可见。
通过以上步骤,我们可以实现STM32单片机寄存器点灯的功能。
简易STM32流水灯
3.1、 LED 初始化函数
void LED_Init(Led_TypeDef led) { GPIO_InitTypeDef GPIO_InitStructure;//定义 GPIO 操作及配置结构体 /* Enable the GPIO_LED Clock */ RCC_APB2PeriphClockCmd(LED_GPIO_CLK, ENABLE);//使能 LED 端口时钟 /* Configure the GPIO_LED pin */ GPIO_InitStructure.GPIO_Pin =led; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//配置 GPIO 为输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//配置 GPIO 速度为 50MHz GPIO_Init(LED_GPIO_PORT, &GPIO_InitStructure);//初始化 LED 相关的 GPIO }
EEPW ARM DIY 手记之软件设计 (二 )—— LED 跑马灯实验
作者:胡恩伟 日期: 2012 年 3 月 17 日星期六
目录
一、利用 STM32 工程模板快速建立用户应用工程 ......................................................... 2 二、LED 跑马灯硬件原理介绍......................................................................................... 4 三、LED 跑马灯软件设计代码说明 ................................................................................. 4 3.1、LED 初始化函数................................................................................................... 5 3.2、LED 操作函数 ...................................................................................................... 5 3.3、闪烁 LED 操作函数 .............................................................................................. 5 3.4、LED 跑马灯循环程序代码 .................................................................................... 6 四、程序下载及调试....................................................................................................... 7
stm32 LED闪烁 资料
SystemInit(); //时钟初始化 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
/* 配置 GPIO 的模式和 IO 口 */ GPIO_InitStructure.GPIO_Pin=LED; //选择你要设置的 IO 口 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; // 设 置 推 挽 输 出 模式 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率 GPIO_Init(GPIOC,&GPIO_InitStructure); /* 初始化 GPIO */ } 从原理图中,我们知道控制 LED 的单片机 IO 口分别是 PC 口的 PC0~PC7。所以 我 们要设置的 GPIO_Pin 就是 GPIOC 中的 PC0~PC7。在 led.h 头文件中,我们将整 个 PC 口定义为 LED,定义了: #define LED GPIO_Pin_All //管脚宏定义 LED_Init()函数中 GPIO_Pin 选择的时候包括了 PC0~PC7。 可能大家注意到,在这个初始化函数中还有个开启 GPIO 时钟的函数,这个 是做 什么用的呢。 STM32 为了降低功耗,所以每个外设都设有一个时钟开关, 在单 片机启动的时候,这个外设的时钟都是关闭的,而你要使用相应的外设的 时候 就要将它的时钟打开,这里我们要使用 GPIOC,那么我们就要将 GPIOC 的 时钟 打开。(这个打开时钟是要注意的,一般初学者最容易犯的错误就是没有将时钟 打开,所以你的外设一直都不工作。)
stm32按键控制灯亮灭实验总结
stm32按键控制灯亮灭实验总结stm32是一款常用的单片机芯片,具有强大的处理能力和丰富的外设资源。
在很多嵌入式系统中,常常需要使用按键来控制某些功能或操作。
本文将介绍如何使用stm32按键控制灯亮灭的实验过程和总结。
实验目的:通过按键控制stm32开发板上的LED灯的亮灭,实现简单的开关控制功能。
实验原理:stm32开发板上通常会有一些按键,按键是一种常见的输入设备,通过按下按键可以改变开关的状态。
LED灯是一种常见的输出设备,可以通过控制其电流来实现亮灭效果。
我们可以通过将按键与LED 灯连接,并通过编程控制按键的状态来控制LED灯的亮灭。
实验步骤:1. 准备工作:首先,我们需要准备一块stm32开发板,一根USB数据线和一只LED灯。
将开发板连接到计算机上,并安装好开发环境(如Keil 或IAR)。
2. 连接电路:将LED灯的正极连接到stm32开发板上的一个IO口,并将负极连接到开发板上的地(GND)。
将按键的一个引脚连接到另一个IO 口上,另一个引脚连接到地(GND)。
3. 编写程序:打开开发环境,创建一个新的工程,并编写相应的程序。
首先需要初始化IO口,将控制LED的IO口设置为输出模式,将控制按键的IO口设置为输入模式。
然后,编写一个循环,不断检测按键的状态。
当按键被按下时,将LED的控制IO口置高,LED灯亮起;当按键松开时,将LED的控制IO口置低,LED灯熄灭。
4. 烧录程序:将开发板通过USB数据线连接到计算机上,选择正确的芯片型号和调试器,将程序烧录到开发板上。
5. 实验验证:将开发板上的按键按下,观察LED灯的亮灭情况。
按下按键时,LED灯应该亮起;松开按键时,LED灯应该熄灭。
通过不断按下和松开按键,可以实现LED灯的开关控制。
实验总结:通过本次实验,我们成功实现了使用stm32按键控制LED灯亮灭的功能。
通过编写程序,我们可以很方便地通过按下按键来控制LED的状态。
stm32跑马灯实验报告
stm32跑马灯实验报告《STM32跑马灯实验报告》实验目的:本实验旨在通过使用STM32单片机,实现一个简单的跑马灯效果,以加深对STM32单片机的理解和掌握。
实验器材:1. STM32单片机开发板2. USB数据线3. LED灯4. 电阻5. 连线实验原理:STM32单片机是一款功能强大的微控制器,具有丰富的外设和强大的处理能力。
在本实验中,我们利用STM32单片机的GPIO(通用输入输出)功能,控制LED灯的亮灭,从而实现跑马灯效果。
实验步骤:1. 连接STM32单片机开发板和电脑,使用Keil或者其他编程软件进行程序编写。
2. 编写程序,通过控制GPIO口的高低电平,实现LED灯的跑马灯效果。
3. 将编写好的程序下载到STM32单片机开发板中。
4. 连接LED灯和STM32单片机的GPIO口,确保连接正确。
5. 通过电脑或者外部电源给STM32单片机供电,观察LED灯的跑马灯效果。
实验结果:经过实验,我们成功实现了STM32单片机的跑马灯效果。
LED灯在不同的GPIO口控制下,能够呈现出流畅的跑马灯效果,整个实验过程非常顺利。
实验总结:通过本次实验,我们进一步了解了STM32单片机的GPIO控制功能,掌握了如何通过编程实现LED灯的控制。
同时也加深了对STM32单片机的理解和应用能力。
在今后的学习和工作中,我们将进一步深入研究STM32单片机的应用,为实际项目的开发和应用打下坚实的基础。
通过这次实验,我们不仅掌握了STM32单片机的基本应用,还增强了对微控制器的理解和应用能力。
希望通过不断的实验和学习,我们能够更加熟练地运用STM32单片机,为未来的工程项目做出更大的贡献。
stm32实训心得体会
stm32实训心得体会篇一:STM32 实验2报告实验2MINI STM32按键控制LED灯实验一、实验目的1、掌握嵌入式程序设计流程。
2、熟悉STM32固件库的基本使用。
二、实验内容1、编程使用I/O口作为输入,控制板载的两个LED 灯。
2、使用固件库编程。
三、实验设备硬件: PC机一台MINI STM32开发板一套软件: RVMDK 一套Windows XP 一套四、实验步骤1、设计工程,使用固件库来编程设置。
、在这里我们建立一个文件夹为: STM32-Projects.点击Keil 的菜单:Project –>New Uvision Project ,然后将目录定位到刚才建立的文件夹STM32-Projecst 之下,在这个目录下面建立子文件夹shiyan1, 然后定位到 shiyan1目录下面,我们的工程文件就都保存到shiyan1 文件夹下面。
工程命名为shiyan1, 点击保存.是这个型号。
、这里我们定位到STMicroelectronics 下面的STM32F103RB ,然后点击Add ,然后Close.、用同样的方法,将 Groups 定位到CORE 和USER 下面,添加需要的文件。
这里我们的CORE 下面需要添加的文件为core_ ,startup_stm32f10x_ ,USER 目录下面需要添加的文件为,stm32f10x_,system_ 这样我们需要添加的文件已经添加到我们的工程中去了,最后点击 OK,回到工程主界面、下面我们要告诉 MDK,在哪些路径之下搜索相应的文件。
回到工程主菜单,点击魔术棒,出来一个菜单,然后点击 c/c++ 选项. 然后点击 Include Paths 右边的按钮。
弹出一个添加path 的对话框,然后我们将图上面的 3 个目录添加进去。
记住,keil 只会在一级目录查找,所以如果你的目录下面还有子目录,记得path 一定要定位到最后一级子目录。
STM32学习笔记——控制GPIO输出点亮LED灯
STM32学习笔记——控制GPIO输出点亮LED灯
一.预备知识使用51单片机控制IO口相对来说要简单得多,最小系统搭建完毕后直接通过软件往各IO口写1或者写0即可。
但使用STM32控制IO口
输入输出却远没有这么容易,经过一个下午的查阅文献及探索后,略微有了头绪。
个人所使用的STM32F103VBT6有100个引脚,其中有五组
GPIO(GPIOAGPIOE),每组有16个GPIO端口(GPIOx_Pin0GPIOx_Pin15)
共80个,每个GPIO端口都有:
两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH);
两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR);
一个32位置位/复位寄存器(GPIOx_BSRR);
一个16位复位寄存器(GPIOx_BRR);
和一个32位锁定寄存器(GPIOx_LCKR)。
其中各个寄存器的作用:
名称
寄存器
意义
端口配置寄存器
GPIOx_CRL
GPIOx_CRH
配置GPIO工作模式
端口输入数据寄存器
GPIOx_IDR。
stm32点亮led灯实验原理
stm32点亮led灯实验原理小伙伴!今天咱们就来唠唠STM32点亮LED灯这个超有趣的小实验的原理。
咱先得知道STM32是个啥。
这STM32呀,就像是一个超级聪明的小管家,它能控制好多好多东西呢。
它内部有好多复杂的电路,就像一个小迷宫一样,但是别怕,咱们慢慢搞懂它。
那LED灯呢,就是那种小小的、亮亮的东西,你肯定见过。
它就像一个小眼睛,等着咱们STM32这个小管家去给它能量,让它闪闪发光。
在这个实验里,我们要让STM32和LED灯建立起联系。
这就好比是两个人交朋友,得有一条线把它们连起来。
这条线呢,就是电路连线啦。
我们要把STM32的某个引脚和LED灯的一端连起来。
那STM32的引脚可不得了。
它就像是小管家的手,每个引脚都有自己的本事。
有的引脚可以输出电信号,就像小管家伸出手来给东西一样。
我们就是要找一个这样能输出的引脚来和LED灯连接。
当我们把它们连好之后呢,还不能就这么完事儿。
因为LED灯它是有自己的小脾气的。
它可不能随便乱亮,得按照我们的想法来。
LED灯有正负极之分,就像电池有正负极一样。
如果接反了,它可就不亮啦,就像小眼睛闭上了,怎么哄都不睁开呢。
接下来就是软件方面的事儿啦。
这就像是给小管家STM32下命令。
我们要通过编写程序来告诉STM32,啥时候给那个引脚输出电信号。
这程序就像是小管家的行动指南。
比如说,我们想让LED灯亮起来,就得告诉STM32:“小管家,你把那个连着LED 灯的引脚给我输出高电平(也就是有电的信号)。
”然后小管家就听话地把电送过去啦,LED灯就像被施了魔法一样,一下子就亮起来了。
再说说这个电信号的事儿。
高电平就像是给LED灯送了一个大力丸,让它有足够的能量发光。
低电平呢,就像是把能量收走了,LED灯就灭了。
我们可以通过程序控制这个引脚一会儿输出高电平,一会儿输出低电平,这样LED灯就会一闪一闪的,就像在和我们眨眼睛一样。
而且呀,在STM32里面,还有时钟这个概念呢。
按键点灯实验报告(2)
按键点灯实验报告(2)梧州学院实验报告实验课程:嵌入式系统及应用实验名称:按键点灯实验实验时间:11月8日实验设备:电脑、stm32精英版开发板实验目的:1、学习如何设置STM32引脚功能2、掌握GPIO口的工作模式设置;实验原理及内容:【实验要求】通过按键控制亮灭,按一次电平跳转一次按键的进行设置,其中控制设置为推挽输出,输入的设置为输入。
电平是否为判断按键是否按下,当按键按下时,对输出电平取反。
程序设计思路通过KEY_Scan()函数扫描4个I/O口是否有按键按下,且支持两种扫描方式,用mode参数来设置。
按键key0使用的是下拉输入,与stm32的PE4口相接,因此,我首先将stm32的PE4口配置为上拉输入,这样子按键按下时便是低电平。
Key1与PE3相接,同理,将PE3口配置为上拉输入。
此外LED0与PB5相接,需要将PB5配置为推挽输出,输出速度为50MHz。
主程序流程介绍:对按键和LED配置程序进行初始化,同时先点亮红灯。
随后通过检测PB5的电平是否为低电平来判断按键是否按下,当为低电平时,先延时消抖,重复检测按键是否按下,若按下,则读取当前输出电平值,若为高电平,则输出低电平,若为低电平,则输出高电平。
【实验内容与步骤】程序步骤及注释#include"stm32f10x.h"#include"delay.h"#include"led.h"#include"key.h"#include"sys.h"intmain(void){u8key=0;delay_init();//延时函数初始化LED_Init();//LED端口初始化KEY_Init();//初始化与按键连接的硬件接口LED0=0;//点亮红灯while(1){key=KEY_Scan(0);//得到键值if(key){switch(key){caseKEY0_PRES://key0按下,控制LED0翻转LED0=!LED0;break;caseKEY1_PRES://key1按下,控制LED1翻转LED1=!LED1;break;}}elsedelay_ms(50);//延时50ms}}部分其他程序:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_AP B2Periph_GPIOE,ENABLE);//使能PORTA,PORTE时钟GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_3;//KEY 0-KEY1GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//设置成上拉输入GPIO_Init(GPIOE,&GPIO_InitStructure);//初始化GPIOE4,3u8KEY_Scan(u8mode){staticu8key_up=1;//按键按松开标志if(mode)key_up=1;//支持连按if(key_up&&(KEY0==0||KEY1==0||WK_UP==1)){delay_ms(10);//去抖动key_up=0;if(KEY0==0)returnKEY0_PRES;elseif(KEY1==0)returnKEY1_PRES;elseif(WK_UP==1)returnWKUP_PRES;}elseif(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1; return0;//无按键按下}三、实验现象分析按键0按下后红灯亮,再按一下红灯灭;按键1按下后绿灯亮,再按一下绿灯灭。
sdlu的stm32学习笔记(2)点灯实验
S.D.Lu的STM32学习笔记(2)点灯实验概述:这是本系列学习笔记的第二篇,从最简单的“点灯”实验入手,涉及到STM32的最基础最简单的操作。
实验目的:本实验的目的很简单,就是让LED亮起来,并闪烁。
通过实验了解STM32固件函数库的使用方法。
本实验用到以下4个库函数(省略了参数):(后面将详细介绍函数作用及用法) RCC_DeInit();RCC_APB2PeriphClockCmd();GPIO_Init();GPIO_WriteBit();1个自定义函数:Delay_long();本实验在前一篇建立的RVMDK工程框架基础上进行。
步骤1:新建工程,修改main.c代码按照前一篇的方法,新建一个名为“LED”的工程,将main.c内容改为如下代码:#include "stm32f10x.h"//函数功能:初始化外设时钟=====void RCC_Configuration(void){RCC_DeInit(); //将外设RCC寄存器重设为缺省值RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //使能GPIOA的时钟}//函数功能:初始化I/O端口=====void PORT_Init(void){GPIO_InitTypeDef GPIO_InitStructure; //定义一个GPIO_InitTypeDef结构体//-----给结构体各个成员赋值-----GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //选中PA口的Pin_8GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //最高输出速率50MHzGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出//-----初始化GPIOA-----GPIO_Init(GPIOA, &GPIO_InitStructure);}//函数功能:延时=====void Delay_long(void){int i,j;for(i=0;i<1000;i++){for(j=0;j<1000;j++);}}//函数功能:主函数int main(void){RCC_Configuration(); //初始化外设时钟PORT_Init(); //初始化I/O端口while(1){GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_SET); //PA8 = 1Delay_long();GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_RESET); //PA8 = 0Delay_long();}}我所用的硬件LED接在PA8上,硬件如下图:读者可以根据自己的硬件修改I/O设置、控制代码。
STM32实验报告
STM32实验报告实验一:一个灯的闪烁一、实验要求1.熟悉使用STM32F103ZET6开发板2.利用C语言程序实现一个灯闪烁二、电路原理图图1-1 LED灯硬件连接图三、软件分析1.本实验用到以下3个库函数(省略了参数):RCC_DeInit();RCC_APB2PeriphClockCmd();GPIO_Init();2.配置输入的时钟:SystemInit()主要对RCC寄存器进行配置,GPIOA连接在APB2上,因此RCC_APB2PeriphClockCmd()函数需要使能APB2Periph_GPIOA3.声明GPIO结构: PF6~PF10口配置为输出GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_1 0;4.应用GPIO口:点亮LED1有五种方法①ODR寄存器法:GPIOA->ODR=0xffbf;②位设置/清除寄存器法:GPIOA->BRR|=0X001;③方法③只适用于GPIOx_BSRR寄存器④GPIO_WriteBit()函数法:GPIO_Write(0xffbf);⑤置位复位库函数法:GPIO_ResetBits(GPIOF,GPIO_Pin_8);5.主函数程序:int main(void){RCC_Configuration(); /* 配置系统时钟 */GPIO_Configuration(); /* 配置GPIO IO口初始化 */for(;;){GPIOF->ODR = 0xfeff; /* PF8=0 --> 点亮D3 */Delay(600000);GPIOF->ODR = 0xffff; /* PF8=1 --> 熄灭D3 */Delay(600000);}}四、实验现象下载程序后开发板上的LED1灯闪烁五、总结通过对本实验可以发现,和51等8位单片机相比,STM32对I/O 端口的操作变得复杂了许多。
SMT32学习笔记-操作寄存器实现LED闪烁
2020年6月2日:●直接操作寄存器的方式:1.点亮LED2.增加简单的延时函数,实现LED闪烁3.点亮的绿色的灯,其他两种灯也点亮(后续增加)●首先了解的概念:1.什么是寄存器参考《零死角玩转STM32》的第六章2.如何直接操作寄存器参考《零死角玩转STM32》的第六章程序主代码:#include "stm32f10x.h"void delay(unsigned int xms) // xms代表需要延时的毫秒数{unsigned int x,y;for(x=xms;x>0;x--)for(y=110;y>0;y--);}int main(void){// 打开GPIOB 端口的时钟*(unsigned int *)0x40021018 |= ( (1) << 3 );// 配置IO口为输出*(unsigned int *) 0x40010C00 |= ( (1) << (4*0) );while(1) //while持续循环{delay(1000);// 控制ODR 寄存器*(unsigned int*) 0x40010C0C &= ~(1<<0); // 给0点亮LED delay(1000);// 控制ODR 寄存器*(unsigned int*) 0x40010C0C |= (1<<0);//给1熄灭LED// 置位|= ,清0 &=~}}void SystemInit(void){// 函数体为空,目的是为了骗过编译器不报错}。
stm32控制LED的亮灭
stm32控制LED的亮灭其实这个⼩实验就是学会运⽤GPIO这个外设。
GPIO是⼀个⽚上⾼速外设,它是由⼏个寄存器来控制的,每个寄存器占据0x04:GPIOx_BSSR:端⼝位设置/清除寄存器,这个寄存器的BSy位是0-15位(BS0-BS15),BRy位是16-31位(BR0-BR15);通过这两个位可以控制16个引脚;BSy只写,写0对ODRy⽆作⽤,写1置ODRy位1;BRy只写,写0对ODRy⽆作⽤,写1清除ODRy为0;如若两个位同时设置,BSy位起作⽤。
GPIOx_CRL/CRH:端⼝配置低/⾼寄存器,⽤到了两个寄存器来配置16个引脚,每个引脚由低位开始按顺序每四个位控制⼀个引脚;MODEy[1:0],这两位00表⽰输⼊模式;01为输出模式,最⼤速度10MHz;10为输出模式,最⼤速度为2MHz;11为输出模式,最⼤速度位50MHz;CNFy[1:0],在输⼊/输出模式,这两位就可以配置四种不同的输⼊/输出模式。
GPIOx_IDR:端⼝输⼊数据寄存器,IDRy[0:15](16-31位保留),这些位只能以字(16位)的形式的只读,读出的值就是对应引脚的状态。
GPIOx_ODR:端⼝输出数据寄存器, IDRy[0:15](16-31位保留),这些位能以字(16位)的形式的读写,读出的值就是对应引脚的状态。
GPIOx_BRR:端⼝位清除寄存器,BRy[0:15](16-31位保留),这些位只能以字(16位)的形式的只写,写0对相应的ODRy⽆作⽤,写1对对应的ODRy为0。
GPIOx_LCKR:端⼝配置锁定寄存器,LCKK[16],改位可随时读出,但只可以通过锁键写⼊序列来修改,写0锁键位激活;写1,锁键位激活,下次复位前该寄存器被锁住;LCKy[0:15],每个锁定位锁定CRL/CRH对应的四个位,这些锁定位可读,在锁键位为0时写⼊;写0不锁定端⼝的配置;写1锁定端⼝的配置。
⽤单⽚机点亮⼀个LED灯,可以通过寄存器,也可以通过库函数;下⾯是寄存器版本:#include"stm32f10x.h"#define PERIPH_BASE1 ((unsigned int)0x40000000)/*APB2 总线基地址 */#define APB2PERIPH_BASE1 (PERIPH_BASE1 + 0x10000)/* AHB总线基地址 */#define AHBPERIPH_BASE1 (PERIPH_BASE1 + 0x20000)/*GPIOB外设基地址*/#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)/* GPIOB寄存器地址,强制转换成指针 */#define GPIOB_CRL *(unsigned int*)(GPIOB_BASE+0x00)#define GPIOB_CRH *(unsigned int*)(GPIOB_BASE+0x04)#define GPIOB_IDR *(unsigned int*)(GPIOB_BASE+0x08)#define GPIOB_ODR *(unsigned int*)(GPIOB_BASE+0x0C)#define GPIOB_BSRR *(unsigned int*)(GPIOB_BASE+0x10)#define GPIOB_BRR *(unsigned int*)(GPIOB_BASE+0x14)#define GPIOB_LCKR *(unsigned int*)(GPIOB_BASE+0x18)/*RCC外设基地址*/#define RCC_BASE (AHBPERIPH_BASE + 0x1000)/*RCC的AHB1时钟使能寄存器地址,强制转换成指针*/#define RCC_APB2ENR *(unsigned int*)(RCC_BASE+0x18)int main(){RCC_APB2ENR |=(1<<3);//开启GPIOB的时钟GPIOB_CRL&=~(0x0F<<(4*0));//清零PB0的控制位GPIOB_CRL|=(1<<(4*0));//配置PB0的控制位GPIOB_ODR&=~(1<0);//PB0输出低电平while(1);}下⾯是库函数版本的bsp_led.h⽂件:#ifndef __LED_H#define __LED_H#include"stm32f10x.h"//定义端⼝,时钟,引脚#define red_PORT GPIOB#define red_PIN GPIO_Pin_5#define red_LCK RCC_APB2Periph_GPIOB#define green_PORT GPIOB#define green_PIN GPIO_Pin_0#define green_LCK RCC_APB2Periph_GPIOB#define blue_PORT GPIOB#define blue_PIN GPIO_Pin_1#define blue_LCK RCC_APB2Periph_GPIOB#define ON 0//低电平点亮led#define OFF 1//定义7种颜⾊的显⽰#define red(a) if(a) GPIO_SetBits(red_PORT,red_PIN);\else GPIO_ResetBits(red_PORT,red_PIN)#define green(a) if(a) GPIO_SetBits(green_PORT,green_PIN);\else GPIO_ResetBits(green_PORT,green_PIN)#define blue(a) if(a) GPIO_SetBits(blue_PORT,blue_PIN);\else GPIO_ResetBits(blue_PORT,blue_PIN)#define yellow red(ON);green(ON);blue(OFF)#define purple red(ON);green(OFF);blue(ON)#define cyan red(OFF);green(ON);blue(ON)#define white red(ON);green(ON);blue(ON)void LED_GPIO_Config(void);#endif下⾯是bsp_led.c⽂件:#include "bsp_led.h"void LED_GPIO_Config(void){GPIO_InitTypeDef GPIO_InitStructure;//定义⼀个GPIO结构体RCC_APB2PeriphClockCmd(red_LCK|green_LCK|blue_LCK,ENABLE);//使能外设时钟 GPIO_InitStructure.GPIO_Pin=red_PIN;//配置引脚,模式,速度GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(red_PORT,&GPIO_InitStructure);//初始化配置GPIO_InitStructure.GPIO_Pin=green_PIN;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(green_PORT,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=blue_PIN;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(blue_PORT,&GPIO_InitStructure);red(OFF);green(OFF);blue(OFF);}下⾯是main.c:#include"stm32f10x.h"#include"bsp_led.h"int main(void){LED_GPIO_Config();while(1){red(ON);}}以上代码能正常运⾏的前提是已经搭建好你⾃⼰的程序基础框架。
STM 入门笔记 点亮一个LED
细心的朋友一定注意到了上图中的 0X0000 0000 --- 0X0007 FFFF 这个 512KB 的地址范 围了。它用于什么目的呢?它是 STM32 上电后,开始执行代码的地址区域。也就是说, STM32 上电后,是从 0X0000 0000 这个地址开始执行代码的。但是,问题在于,这个地 址范围既没有 FLASH 也没有 SRAM 呀,怎么回事呢? 原来,STM32 可以通过 BOOT0,BOOT1 两个管脚来动态的把上面提到的存储区域映射到 0x0000 0000 --- 0X0007 FFFF 这个区域中。
� 数据段,位于 SRAM,STM32F103VBT6 有 20KB //********************************************************************* // Read/write segments mapped to RAM. //********************************************************************* //-DRAMSTART=100000 //-DRAMEND=7FFFFF -DRAMSTART=0x20000000 -DRAMEND=0x20004FFF � 堆栈和堆设置 //********************************************************************* // Stack and heap segments. //********************************************************************* //-D_CSTACK_SIZE=2000 -D_CSTACK_SIZE=800 // -D_SVC_STACK_SIZE=10 -D_IRQ_STACK_SIZE=100 //-D_HEAP_SIZE=8000 -D_HEAP_SIZE=40
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
S.D.Lu的STM32学习笔记(2)点灯实验概述:这是本系列学习笔记的第二篇,从最简单的“点灯”实验入手,涉及到STM32的最基础最简单的操作。
实验目的:本实验的目的很简单,就是让LED亮起来,并闪烁。
通过实验了解STM32固件函数库的使用方法。
本实验用到以下4个库函数(省略了参数):(后面将详细介绍函数作用及用法) RCC_DeInit();RCC_APB2PeriphClockCmd();GPIO_Init();GPIO_WriteBit();1个自定义函数:Delay_long();本实验在前一篇建立的RVMDK工程框架基础上进行。
步骤1:新建工程,修改main.c代码按照前一篇的方法,新建一个名为“LED”的工程,将main.c内容改为如下代码:#include "stm32f10x.h"//函数功能:初始化外设时钟=====void RCC_Configuration(void){RCC_DeInit(); //将外设RCC寄存器重设为缺省值RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //使能GPIOA的时钟}//函数功能:初始化I/O端口=====void PORT_Init(void){GPIO_InitTypeDef GPIO_InitStructure; //定义一个GPIO_InitTypeDef结构体//-----给结构体各个成员赋值-----GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //选中PA口的Pin_8GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //最高输出速率50MHzGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出//-----初始化GPIOA-----GPIO_Init(GPIOA, &GPIO_InitStructure);}//函数功能:延时=====void Delay_long(void){int i,j;for(i=0;i<1000;i++){for(j=0;j<1000;j++);}}//函数功能:主函数int main(void){RCC_Configuration(); //初始化外设时钟PORT_Init(); //初始化I/O端口while(1){GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_SET); //PA8 = 1Delay_long();GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_RESET); //PA8 = 0Delay_long();}}我所用的硬件LED接在PA8上,硬件如下图:读者可以根据自己的硬件修改I/O设置、控制代码。
步骤2:编译,下载。
将工程进行编译,下载到芯片上,即可看到LED在闪烁,大约每秒钟1次。
至此实验完成。
虽然使用已经得到了想要的结果,但是现在我们只知道其然而不知道其所以然。
下面将进入本篇的核心,代码分析。
(注:因为分析比较详细,甚至有点啰嗦,请做好心理准备。
)代码分析:第一个被调用的函数是RCC_Configuration(),其作用是初始化外设时钟。
该函数调用了两个库函数。
第一个是库函数RCC_DeInit(),打开《STM32固件库使用手册》(我用的是中文版UM0427用户手册)找到该函数,在195页(15.2.1节)。
详细描述截图如下:RCC_DeInit()函数的作用是将外设RCC寄存器重设为默认值。
第二个是库函数RCC_APB2PeriphClockCmd(),打开《STM32固件库使用手册》(我用的是中文版UM0427用户手册)找到该函数,在207页(15.2.22节)。
详细描述截图如下:函数的原形是void RCC_APB2PeriphClockCmd(u32 RCC_APB2Periph, FunctionalState NewState)第一个参数是一个32位的整型数,其取值可参照表Table 373。
Q:表Table 373中的这些数具体是什么值呢?A:其实这些都是STM32固件库定义的一些宏,是按位编码的32位整数常量,所以相或时不会影响到彼此的值。
在MDK中,在“RCC_APB2Periph_GPIOA”上点右键,选“Go To Definition of ……”即可定位到stm32f10x_rcc.h文件的498行。
可以发现,在stm32f10x_rcc.h的497~517对APB2的外设进行了宏定义(APB1的外设宏定义在528~552行)。
当然,不是所有STM32芯片都包含所有这些外设。
从这些宏定义中可以看出,STM32的定时器编号最大值至少为TIM17。
所用芯片是否具有某个外设,可以查看其数据手册。
在编程时,只需查看stm32f10x_rcc.h文件即可知道该外设是属于APB2还是APB1了。
第二个参数是一个FunctionalState型的变量。
这是一个枚举类型,在stm32f10x.h文件第521行,定义如下:typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;所以它只有两个值,DISABLE和ENABLE,即失能和使能。
第二个函数是PORT_Init(),其作用是初始化I/O端口。
该函数只调用了一个库函数,这个函数结构比第一个复杂。
函数原形是void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)其详细描述可查阅《STM32固件库使用手册》中文版124~125页(10.2.3节),由于太长,在此就不摘录了。
使用时,参照125页最后给出的例程即可。
GPIO_Init()函数的第一个参数是一个指向GPIO_TypeDef的指针。
GPIO_TypeDef是一个结构体,其定义可在MDK中用右键查找的方式找到,在此不作深究,知道该参数的取值范围即可。
第二个参数是一个指向GPIO_InitTypeDef指针。
GPIO_InitTypeDef也是一个结构体。
该结构体的定义在stm32f10x_gpio.h文件91行,包括三个成员。
其中,GPIO_Pin:是一个u16型变量,其取值的按位编码宏定义在stm32f10x_gpio.h的127~142行;GPIO_Speed:是GPIOSpeed_TypeDef型枚举变量,有3种取值分别对应I/O口3中输出速率;GPIO_Mode:是GPIOMode_TypeDef型枚举变量,有8种取值分别对应I/O口的8种配置。
PORT_Init()函数的每一行代码都加了注释,在此就不啰嗦了。
该函数执行的结果是:将PA8设置为开漏输出、最大输出速率50MHz,其它I/O状态不变。
第三个函数是GPIO_WriteBit(),其作用是设置或清除指定的数据端口位。
这是一个库函数,其详细描述看查阅《STM32固件库使用手册》中文版129页(10.2.11节)。
详细描述截图如下:函数的原形是void GPIO_WriteBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin, BitAction BitVal)函数的前两个参数在前面已经分析过。
第三个参数BitVal是一个BitAction型枚举变量,有两种取值Bit_RESET、Bit_SET分别用于清除和置位I/O口。
第四个函数是Delay_long(),其作用是延时。
实验总结:通过对本实验可以发现,和51、A VR、PIC等8位单片机相比,STM32对I/O端口的操作变得复杂了许多。
51单片机点灯的程序最简单,直接在main()中写一个while(1),里面写4行代码就可以了。
A VR和PIC的程序比51多了一步操作,就是进入while(1)之前必须先配置I/O的方向。
STM32比A VR和PIC又多了一步操作,就是必须使能外设的时钟。
对STM32来说,除了CM3内核都算外设,包括GPIO。
STM32可以关闭任何外设的时钟以禁止该外设,这样设计是出于减少功耗的考虑。
其实本实验已经对程序进行了最简化,很多设置使用了默认值,所以就没有操作。
真正的应用程序,第一步应该是配置系统时钟。
因为本实验使用了默认的内部HIS,所以没有编写代码。
这个内容将在下一篇笔记学习。
通过代码分析发现,使用固件库函数可以大大简化编程工作。
《STM32固件库使用手册》里对每个库函数都作了详细描述,包括原形、功能、参数及其取值范围等。
而且每个函数最后都给出了范例,其书写非常规范,我们可以依葫芦画瓢,很容易修改成自己想要的功能代码。
我们不用深入了解细节,就可以完成对各种外设的操作。
当然,对相关寄存器的深入了解是有好处的,可以使我们对各种外设功能有更深刻、更具体的掌握,使用起来也更得心应手。
作者:S.D.Lu深圳2013-1-25。