完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、前言
本章主要介绍如何使用标准库工程与cubemx配置工程使LED灯闪烁,可以直接点击目录看自己想要看的内容,文章教程可以让您一步一步学会如何用标准库工程与cubemx使LED闪烁。 二、准备工作
有关库函数工程模板的创建可以看这篇文章:【STM32】STM32标准库与HAL库对照学习教程二–库函数模板创建 标准库模板工程文件我已上传至百度网盘,网盘链接:https://pan.baidu.com/s/1Ok_wIMi1V1cVAHdGETPJzQ 密码:lob1 三、LED硬件电路 硬件原理图看自己的开发板 可以看到开发板的两个LED分别由PE5与PB5引脚控制,由原理图可知,当两引脚给低电平时,发光二级管LED导通,LED被点亮,给高电平时,LED灯熄灭。 四、使用标准库工程点亮LED灯 1、GPIO初始化一般步骤 打开对应GPIO引脚的时钟。 定义GPIO端口结构体变量。 配置结构体变量(设置IO、设置模式、设置速率)。 初始化GPIO函数。 2、GPIO标准库函数介绍 (1)GPIO外设库的文件: stm32f10x_gpio.c、 stm32f10x_gpio.h (2)GPIO常用标准库函数: void GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_InitStruct) 功能:初始化一个或多个IO口(同一组端口)的工作模式、输出速度。 void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 功能:设置某个IO口为高电平(可同时设置同一端口的多个IO)。底层是通过配置BSRR寄存器。 void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 功能:设置某个IO口为低电平(可同时设置同一端口的多个IO)。底层是通过配置BSRR寄存器。 void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal); void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal); 功能:设置端口管脚输出电平,很少使用。 uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 功能:读取端口中的某个管脚输入电平。底层是通过读取IDR寄存器。 uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); 功能:读取某组端口的输入电平。底层是通过读取IDR寄存器。 uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 功能:读取端口中的某个管脚输出电平。底层是通过读取ODR寄存器。 uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx); 功能:读取某组端口的输出电平。底层是通过读取ODR寄存器。 (3)使能GPIO时钟函数 void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); 3、使用库函数编写程序使LED灯闪烁操作 (1)复制模板工程,重新命名为库函数点亮LED。 (2)在工程文件中新建一个App文件夹,专门用来存放外设文件。 (3)在App在新建一个LED文件夹用来存放LED的.c和.h文件。 这样做的好处是便于移植外设文件(4)打开工程,新建文件,格式保存为.h,写入LED初始化申明部分。
#ifndef LED_H_ #define LED_H_ #include "stm32f10x.h" /* 宏定义LED时钟端口、引脚的定义 */ #define LED0_GPIO_Port GPIOB #define LED0_Pin GPIO_Pin_5 #define LED0_Port_RCC RCC_APB2Periph_GPIOB #define LED1_GPIO_Port GPIOE #define LED1_Pin GPIO_Pin_5 #define LED1_Port_RCC RCC_APB2Periph_GPIOE void LED_Init(void); //LED初始化函数 #endif
#include "LED.h" /************************************************* *函数名: LED_Init *函数功能: LED灯初始化函数 *输入: 无 *返回值: 无 **************************************************/ void LED_Init() { GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量 RCC_APB2PeriphClockCmd(LED0_Port_RCC|LED1_Port_RCC,ENABLE); //使能时钟 GPIO_InitStructure.GPIO_Pin=LED0_Pin; //选择设置LED0的IO口 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设置推挽输出模式 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率 GPIO_Init(LED0_GPIO_Port,&GPIO_InitStructure); /* 初始化GPIO */ GPIO_SetBits(LED0_GPIO_Port, LED0_Pin); //输出高电平,LED0熄灭 GPIO_InitStructure.GPIO_Pin=LED1_Pin; //选择设置LED1的IO口 GPIO_Init(LED1_GPIO_Port,&GPIO_InitStructure); /* 初始化GPIO */ GPIO_SetBits(LED1_GPIO_Port, LED1_Pin); //输出高电平,LED01熄灭 }
程序: #include "LED.h" /************************************************* *函数名: delay *函数功能: 延时函数,通过while循环占用CPU,到达延时目的 *输入: i *返回值: 无 **************************************************/ void delay(u32 i) { while(i--); } /************************************************* *函数名: main *函数功能: 主函数 *输入: 无 *返回值: 无 **************************************************/ int main() { LED_Init(); while(1) { GPIO_SetBits(LED0_GPIO_Port, LED0_Pin); GPIO_ResetBits(LED1_GPIO_Port, LED1_Pin); delay(6000000); GPIO_SetBits(LED1_GPIO_Port, LED1_Pin); GPIO_ResetBits(LED0_GPIO_Port, LED0_Pin); delay(6000000); } }
我使用的普中提供的串口烧入软件4、实验效果 五、使用cubemx生成HAL库工程点亮LED灯 有关cubemx一些使用可以看:【STM32】STM32标准库与HAL库对照学习教程二–库函数模板创建 有关cubemx功能部分,下面的配置不会多做介绍。 1、cubemx配置生成工程 (1)打开cubemx,点击ACCESS TO MCU SELECTOR。 (2)选择自己开发板的芯片。 (3)配置SYS。 (4)配置RCC,选择外部时钟。 (5)配置PB5、PE6引脚。
PE5操作相同(6)点击GPIO配置模式。 PE5操作相同(7)配置时钟树。 有关时钟树不懂的可以看这篇文章:【STM32】STM32标准库与HAL库对照学习教程特别篇–系统时钟RCC详讲 (8)点击Project Manager,配置文件,生成工程。
重点提醒:路径和工程名都不要带中文
2、HAL库控制函数介绍 (1)GPIO外设库的文件: stm32f10xx_hal_gpio.h、 stm32f10xx_hal_gpio.c (2)操作GPIO常用HAL库函数: GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin); 功能:读取一个引脚的电平。 void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); 功能:写一个引脚的电平,可写高电平,也可以是低电平。 void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin); 功能:翻转一个引脚的电平。 3、编写使LED灯闪烁的程序 程序: HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_RESET); HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET); HAL_Delay(500); //HAL库自带的ms级延时函数 HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_SET); HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET); HAL_Delay(500); 编译后0错误0警告,烧入到开发板。 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2955 浏览 16 评论
3455 浏览 1 评论
8987 浏览 16 评论
4050 浏览 18 评论
1102浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 05:46 , Processed in 1.112671 second(s), Total 81, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号