使用STM32固件库函数操作控制LED灯(STM32_04)

发布者:lcn18560863680最新更新时间:2019-05-29 来源: eefocus关键字:STM32  固件库函数  操作控制  LED灯 手机看文章 扫描二维码
随时随地手机看文章

    直接使用寄存器地址来进行STM32开发要对每一个寄存器的地址通过查找芯片手册,对每一个寄存器的各个位的含义也要查清楚,然后决定对那个地址的哪些位进行怎样的设置。这种编程效率低,程序的可移植性差,程序的可读性差。


    STM32提供了对外设寄存器操作的功能函数,对寄存器操作只需要调用相应的库函数就可以,一般函数名单词组合与功能密切相关,增强了程序的可读性。


1、以CMSIS固件库项目为基础,在项目文件夹下新增"Lib"文件夹,在"Lib"文件夹下新增"inc"和"src"文件夹,在"inc"文件夹中复制"stm32f10x_gpio.h"和"stm32f10x_rcc.h"两个头文件,在"src"文件夹中复制"stm32f10x_gpio.c"和"stm32f10x_rcc.c"两个库函数程序文件,分别包含RCC和GPIO操作相关的库函数。


2、在“项目条目管理”对话框中添加"Lib"组,并向组中添加两个库函数程序文件。


3、修改"Include Paths",添加".Libinc"路径


4、重写main.c中的main函数


① 包含需要的头文件:"stm32f10x_gpio.h"和"stm32f10x_rcc.h"


② 使能GPIOC时钟


    在RCC库函数中定义了RCC_APB2PeriphClockCmd函数,函数原型为:


void RCC_APB2PeriphClockCmd ( uint32_t  RCC_APB2Periph, FunctionalState  NewState )


其中参数RCC_APB2Periph取值为在"stm32f10x_rcc.h"中预定义的值,这里对GPIOC的操作为RCC_APB2Periph_GPIOC,定义如下:



这个值与前面程序中的表达式"0x1<<4"得到的值是一致的。


    函数的第二个参数NewState取值为FunctionState类型,FunctionState类型是在"stm32f10x_rcc.c"文件中定义的一个枚举类型,有DISABLE和ENABLE两个取值,定义如下:



    现在要使能GPIOC,则调用函数如下:


RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE );


③ 配置GPIOC_0为推挽式输出,50MHz速度。


    对GPIO引脚的配置调用"stm32f10x_gpio.c"中的库函数GPIO_Init实现,函数原型为:


void GPIO_Init ( GPIO_TypeDef *  GPIOx, GPIO_InitTypeDef * GPIO_InitStruct  )


其中第一个参数GPIOx的取值在"stm32f10x.h"中定义,这里用GPIOC;第二个参数GPIO_InitStruct为GPIO_InitTypeDef指针类型,GPIO_InitTypeDef类型在"stm32f10x_gpio.h"文件中定义:


这个结构体中的GPIO_Pin为IO口的引脚编号,这里为第一个LED灯,则取0;


GPIO_Speed为GPIOSpeed_TypeDef类型,GPIOSpeed_TypeDef类型在"stm32f10x_gpio.h"文件中定义:




为枚举类型,有三个枚举值。这里取GPIO_Speed_50MHz;


GPIO_Mode为GPIOMode_TypeDef类型,GPIOMode_TypeDef类型在"stm32f10x_gpio.h"文件中定义:




    这些枚举值分别为:


(1)GPIO_Mode_AIN 模拟输入


(2)GPIO_Mode_IN_FLOATING 浮空输入


(3)GPIO_Mode_IPD 下拉输入


(4)GPIO_Mode_IPU 上拉输入


(5)GPIO_Mode_Out_OD 开漏输出


(6)GPIO_Mode_Out_PP 推挽输出


(7)GPIO_Mode_AF_OD 复用开漏输出


(8)GPIO_Mode_AF_PP 复用推挽输出


    这里选择GPIO_Mode_Out_PP。


要配置GPIOC_0的工作模式,首先用GPIO_InitTypeDef类型定义一个变量,然后给这个结构体变量的成员赋值,最后调用GPIO_Init函数完成配置:


GPIO_InitTypeDef GPIOC_0_mode;


GPIOC_0_mode.GPIO_Pin = GPIO_Pin_0;


GPIOC_0_mode.GPIO_Speed = GPIO_Speed_50MHz;


GPIOC_0_mode.GPIO_Mode = GPIO_Mode_Out_PP;


GPIO_Init(GPIOC, &GPIOC_0_mode);


④ 通过GPIO_ResetBits和GPIO_SetBits函数来控制LED1的复位和置位,函数原型如下:


void GPIO_ResetBits ( GPIO_TypeDef *GPIOx,  uint16_t  GPIO_Pin )       //复位函数


void GPIO_SetBits  ( GPIO_TypeDef * GPIOx,  uint16_t GPIO_Pin ) //置位函数


函数的参数分别为哪个GPIO口和哪个引脚。


如果对GPIOC_0复位,则:GPIO_ResetBits( GPIOC, GPIO_Pin_0) ;


如果对GPIOC_0置位,则:GPIO_SetBits( GPIOC, GPIO_Pin_0) ;


最后的main.c程序如下:


#include "stm32f10x.h"


#include "stm32f10x_rcc.h"


#include "stm32f10x_gpio.h"


void delay(int t)


{


     int i;


     for( ;t>0; t--)


         for(i=0;i<1000;i++);


}


int main()


{


     GPIO_InitTypeDef GPIOC_0_mode;


     RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE ); //使能GPIOC时钟


     GPIOC_0_mode.GPIO_Pin = GPIO_Pin_0;


     GPIOC_0_mode.GPIO_Speed = GPIO_Speed_50MHz;


     GPIOC_0_mode.GPIO_Mode = GPIO_Mode_Out_PP;


     GPIO_Init(GPIOC, &GPIOC_0_mode);   //配置GPIOC_0引脚为推挽输出,50MHz速度


     while(1)


     {


         GPIO_ResetBits( GPIOC, GPIO_Pin_0);  //将GPIOC_0复位


         delay(1000);


         GPIO_SetBits( GPIOC, GPIO_Pin_0);    //将GPIOC_0置位


         delay(1000);


     }


}


5、连接错误及其解决方法。


在上述项目中,最后完成项目配置和编程后,编译连接时出现如下错误:


出现这个错误是由于STM32外设库函数的开发中用到了断言机制。正常使用库函数时,需要包含"stm32f10x_conf.h"头文件,在该文件中有如下定义


/* Exported macro ------------------------------------------------------------*/


#ifdef  USE_FULL_ASSERT


/**


  * @brief  The assert_param macro is used for function's parameters check.


  * @param  expr: If expr is false, it calls assert_failed function which reports


  *         the name of the source file and the source line number of the call


  *         that failed. If expr is true, it returns no value.


  * @retval None


  */


  #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))


/* Exported functions ------------------------------------------------------- */


  void assert_failed(uint8_t* file, uint32_t line);


#else


  #define assert_param(expr) ((void)0)


#endif /* USE_FULL_ASSERT */


在该头文件中定义了assert_param宏,根据项目配置,如果设置了"USE_FULL_ASSERT"参数,则对函数参数进行检查,检查不成功转到"assert_failed"函数处理;如果没有设置使用断言,则相当于不对参数进行检测。


解决方法:将这一段宏定义直接复制到"stm32f10x.h"文件中,因为所有的外设库函数文件都直接或间接地包含了该头文件。


6、编译连接项目,下载程序,开发板的LED1闪烁。



关键字:STM32  固件库函数  操作控制  LED灯 引用地址:使用STM32固件库函数操作控制LED灯(STM32_04)

上一篇:通过位带地址操作GPIO在数码管显示数字(STM32_05)
下一篇:使用STM32固件库操作控制LED灯(CMSIS)(STM32_03)

推荐阅读最新更新时间:2024-11-01 21:39

STM32电机矢量控制】记录6——FOC运行流程
坐标变换理论: 坐标变换理论可以降低马达方程的复杂性,利用坐标变换把定子及转子变量变换到一个旋转坐标系中,该坐标系的转速为角速度ω。 假设fax, fbx, fcx 为三相瞬时变量,位于相移120度的a,b,c坐标上,fqx, fdx, f0x 为其变换变量,位于正交坐标d,q上: 则,变换方程为: 3个变换方程用于矢量控制: Clarke: ω=0, θ(0)=0 - θ=0; Park: ω=ωr, θ(0)=θr(0) - θ=θr; 反Park: ω=-ωr , θ(0)= θr(0) - θ=-θr 所以有: Clarke将定子电流转变为静止直角参考坐标(称αβ坐标); 然后,Park将电流
[单片机]
【<font color='red'>STM32</font>电机矢量<font color='red'>控制</font>】记录6——FOC运行流程
STM32信息安全—加解密硬件模块
STM32的真随机数产生器 TRNG 基于物理噪声源的随机数产生器 生成32位随机数 AHB从设备,不使用时可关闭它以节省功耗 广泛运用于加解密算法和协议中:密钥的生成;“Challenge- Acknowledge”认证模式中,充当Challenges(质询);初始向量(IV);随机数 STM32的对称加解密加速器 AES 支持的算法模式有:AES – ECB、CBC、CTR;AES – GCM、CCM、GMAC;密钥长度:128位,256位可选 支持DMA加载输入和读取输出 该模块经过NIST FIPS认证 集成该对称加解密硬件加速模块的STM32系列有 STM32的对称加解密加速器 Crypto 支
[单片机]
STM32重难点-IIC原理及应用详细步骤
IIC概述 IIC介绍 I2C(IIC,Inter-Integrated Circuit),两线式串行总线,由PHILIPS公司开发用于连接微控制器及其外围设备。它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上。是半双工通信方式。 IIC特性 相对于UART,IIC的优点在于可以一对多,缺点在于无论主从器件均不对消息进行确认。 模拟IIC优点是可以任意选择SDA和SCL,不受管脚限制而比较灵活。它的缺点是不可用DMA。 硬件IIC优点是可用DMA减轻CPU负担,速度也比模拟IIC快,但是实际调试时可能会出现死
[单片机]
<font color='red'>STM32</font>重难点-IIC原理及应用详细步骤
STM32小白入门(第12天)-------I2C协议
一、概述 二、信号概念 三、AT24C02(EEPROM电可擦除ROM)--配合单片机存贮掉电前需要保存的数据,类似单片机的硬盘 1、写时序 2、读时序 思考题2:在24c02控制时钟的时候,为什么要进行5us的延时,小于5us延时或许大于5us的延时是否可以,示例代码如下: //设置SCL高电平 SCL=1; delay_us(5); //设置SCL低电平 SCL=0; delay_us(5); 回答:大于5us是可以的,如果使用5ms是可以的。但是延时是不能低于1.2us,详细描述如下图。 3、起始信号和停止信号 //sda输
[单片机]
<font color='red'>STM32</font>小白入门(第12天)-------I2C协议
台家用LED灯补助 弱势族群优先
台湾经济部将推出家用LED灯泡补助方案,经济部官员昨天表示,本周内可望呈报行政院核定,以弱势族群为优先补助对象。 经济部官员表示,补助额度、对象仍在讨论中,但将优先补助弱势族群,减轻其用电负担。预算可能接近今年节能家电补助规模,为新台币七亿元。 不过,家电补助是由民众自行购买后再提出申请;但这次不排除由政府统一采购LED灯泡,再由符合条件的家庭提出申请。官员说,参与LED灯泡竞标厂商必须符合一定规格、技术规范,也需检附测试合格报告。希望年底前完成决标。 经济部前两波推出的家电补助造成热烈回响,第二波原打算补助卅五万台、编列七亿元补助预算,最后申请量超出预期,也导致经济部超支石油基金经费。 立法院经济委员会昨天对经济部超支使
[电源管理]
毕业设计| STM32+UART HMI,玩扫雷游戏
每年毕设,STM32出现的频率最高,很多都是“老实本分”的设计,但也有不走寻常路,比如今天分享的这个毕设——扫雷游戏。不知道这位同学在毕业答辩时,有没有被老师为难,当着这么多评委老师,来几盘扫雷,是不是很刺激。 系统的硬件: 指南者开发板和4.2英寸的UATRT HMI串口屏组成,其实可以用最小的核心板,单片机外设也就用到了串口而已,但是要求使用开发板,只好有点浪费了。 软件部分: 软件部分是这个项目的核心。 刚开始参考了网上一些扫雷代码。在单片机上很多地方不一样,但大体思路还是一样的,主要解决的就是与串口屏之间的通信协议,贴一段简单的通信代码。 具体完成功能: 1.扫雷基本功能 2.当周围的雷都标记完时,打开剩余
[单片机]
STM32 ILI9341驱动TFTLCD屏(三)
上次已经常用的指令封装成函数,今天通过调用这些函数在屏幕上显示图片,让大家进一步了解ILI9341。 要让屏幕显示图片,那就要先把图片转化为计算机能识别的数据.,这里用Image2Lcd这款工具软件,把图片转换成特定的数据格式以用来匹配STM32系统所需要的显示数据格式。 图片转换成特定的数据格式步骤: (1)把图片尺寸修改为想要显示的大小并保存; (2)在Image2Lcd中打开要显示的图片; (3)设置输出类型为C语言数组;扫描模式要和ILI9341的扫描方式一致;输出灰度选择屏幕适用的;确定要显示的宽度和高度; (4)将生成的数组保存到一个h文件或c文件,方便调用。 数组保存到文件后,文件会自动打开,图片现在
[单片机]
<font color='red'>STM32</font> ILI9341驱动TFTLCD屏(三)
STM32时钟源
PLLK,SYSK,HCKL,PK1,PK2 之间的关系要弄清楚; 1、HSI:高速内部时钟信号 stm32单片机内带的时钟 (8M频率) 精度较差 2、HSE:高速外部时钟信号 精度高 来源(1)HSE外部晶体/陶瓷谐振器(晶振) (2)HSE用户外部时钟 3、LSE:低速外部晶体 32.768kHz 主要提供一个精确的时钟源 一般作为RTC时钟使用 在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。   ①、HSI是高速内部时钟,RC振荡器,频率为8MHz。   ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。   ③、LSI是低速内部时钟,RC振荡器
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved