2、STM32点亮LED灯

您所在的位置:网站首页 人偶制作过程怎么写 2、STM32点亮LED灯

2、STM32点亮LED灯

2023-08-18 02:20| 来源: 网络整理| 查看: 265

STM32寄存器和库函数点灯 一、寄存器操作1、新建工程,新建一个目录存放以后所有的工程stmproject,在这个目录下新建文件夹寄存器点灯,文件名为LED。2、新建文件main.c并双击source group文件夹添加进去3、添加启动文件,取官方固件库中根据FLASH大小选择型号,我选大容量hd4、编写main程序通过寄存器控制I/O口输入输出点灯使能时钟配置端口寄存器,再通过端口寄存器输出数据 总结 二、库函数点灯1 建立库函数工程模板2 新建库函数点灯工程3 调用库函数编写程序点亮4 程序升级

一、寄存器操作 1、新建工程,新建一个目录存放以后所有的工程stmproject,在这个目录下新建文件夹寄存器点灯,文件名为LED。

在这里插入图片描述

接下来选择所用的软件包,之前安装软件时安装的,选择对应型号即可。 在这里插入图片描述 如果需要安装别的安装包可以在这个网址下载。点击打开文件 在这里插入图片描述 点击next,再点击finish就安装成功了。可以在包安装里找到。 在这里插入图片描述

2、新建文件main.c并双击source group文件夹添加进去

在这里插入图片描述 在这里插入图片描述

3、添加启动文件,取官方固件库中根据FLASH大小选择型号,我选大容量hd

在这里插入图片描述 在这里插入图片描述 复制到点灯文件夹后再添加进source group 在这里插入图片描述 框架搭好 在这里插入图片描述

4、编写main程序通过寄存器控制I/O口输入输出点灯 使能时钟

在这里插入图片描述 本人开发板LED等分别连到PB5和PE5上,所以点亮这两个灯需要使第三位和第六位置一开启时钟。上图给出了偏移地址,还需要知道RCC寄存器的起始地址,由中文参考手册里的存储器映射图可得, 在这里插入图片描述 下面写出代码

*(unsigned int *) 0x40021018 |=(1 for(;count!=0;count--); } int main() { LED_Init(); //调用初始化函数 while(1) { //复位低电平灯亮,置位高电平灯灭 GPIO_ResetBits(GPIOB,GPIO_Pin_5); GPIO_SetBits( GPIOE,GPIO_Pin_5); Delay(0xFFFFF); GPIO_SetBits( GPIOB,GPIO_Pin_5); GPIO_ResetBits(GPIOE,GPIO_Pin_5); Delay(0xFFFFF); } }

此时就可以把程序下载到芯片里,(程序下载见我第一篇文章),此时就可以看到两个等交替亮灭。

4 程序升级

上述程序可以达到要求,但是可移植性和查看性不强,可以把GPIO端口、引脚、时钟和控制灯亮灭的置位复位函数都写成宏定义,具体代码如下: led.h

#ifndef __LED_H #define __LED_H #include "stm32f10x.h" //定义两个灯的端口、引脚和时钟,LED0是PB5,LED1是PE5 #define LED_0_PIN GPIO_Pin_5 #define LED_0_PORT GPIOB #define LED_0_CLK RCC_APB2Periph_GPIOB #define LED_1_PIN GPIO_Pin_5 #define LED_1_PORT GPIOE #define LED_1_CLK RCC_APB2Periph_GPIOE //用LED(ON/OFF)控制两灯亮灭 #define ON 1 #define OFF 0 #define LED0(x) if (x) GPIO_ResetBits(LED_0_PORT,LED_0_PIN);\ else GPIO_SetBits( LED_0_PORT,LED_0_PIN); #define LED1(x) if (x) GPIO_ResetBits(LED_1_PORT,LED_1_PIN);\ else GPIO_SetBits( LED_1_PORT,LED_1_PIN) ; void LED_Init(void); //声明初始化函数 #endif

led.c

#include "led.h" void LED_Init(void) { //实例化配置GPIO模式和速度结构体 GPIO_InitTypeDef GPIO_InitStruct; //使能两灯的时钟 RCC_APB2PeriphClockCmd(LED_0_CLK, ENABLE); RCC_APB2PeriphClockCmd(LED_1_CLK, ENABLE); //配置LED0引脚为推挽输出,速度为50MHz GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin = LED_0_PIN; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //调用GPIO初始化函数,对LED0端口按上面配置初始化 GPIO_Init(LED_0_PORT, &GPIO_InitStruct); //配置LED1引脚为推挽输出,速度为50MHz GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin = LED_1_PIN; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //调用GPIO初始化函数,对LED1端口按上面配置初始化 GPIO_Init(LED_1_PORT, &GPIO_InitStruct); }

main.c

#include "stm32f10x.h" #include "led.h" //一个简单的延时函数 void Delay( uint32_t count) { for(;count!=0;count--); } int main() { //调用初始化函数 LED_Init(); //两个灯交替亮灭 while(1) { LED0(1); LED1(0); Delay(0xFFFFF); LED0(0); LED1(1); Delay(0xFFFFF); } }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3