stm32控制LED的亮灭

其实这个小实验就是学会运用GPIO这个外设。

GPIO是一个片上高速外设,它是由几个寄存器来控制的,每个寄存器占据0x04:

GPIOx_BSSR:

端口位设置/清除寄存器,这个寄存器的BSy位是0-15位(BS0-BS15),BRy位是16-31位(BR0-BR15);通过这两个位可以控制16个引脚;BSy只写,写0对ODRy无作用,写1置ODRy位1;BSy只写,写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_CRL&=~(0x0F<<(4*0));
GPIOB_CRL|=(1<<(4*0));
GPIOB_ODR&=~(1<0);
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
#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);
}
}

以上代码能正常运行的前提是已经搭建好你自己的程序基础框架。

原文地址:https://www.cnblogs.com/lzd626/p/9200649.html

时间: 2024-10-29 00:40:34

stm32控制LED的亮灭的相关文章

socket通信——多角度控制LED灯亮灭

今天以物联网网关(网关链接)以服务器,在多个客户端就做一个非常简单的功能:点亮或熄灭网关上的LED灯.目前想到了三种方式,分别是:TCP&UDP测试工具.自编Java客户端和Mono Android客户端.相信这会很有意思的. 1.服务器端 在使用或编写客户端之前,首先来看看服务器端代码,其专门通过串口烧进网关内部 OutputPort led = new OutputPort((Cpu.Pin)GPIO_NAMES.PF8, false); Socket sc; Socket ss = new

四、按键控制LED灯亮灭

材料: 1.SAGOO UNO 1块: 2.按键模块 1块: 3.杜邦线若干. 步骤: 1.按照下图连接按键模块和UNO: SAGOO UNO引脚                                      按键模块引脚 3V3  <------------------------------------>    V(电源) GND <------------------------------------>    G(电源) Pin2  <----------

CC2530学习路线-基础实验-GPIO 按键控制LED灯亮灭(2)

目录 1.前期预备知识 1.1 新大陆Zigbee模块按键电路图 1.2 CC2530相关寄存器 1.3 CC2530中断走向图 1.4 使用C语言为51单片机编写中断程序 1.5 *函数指针 2. 程序代码 THE END 1.前期预备知识 1.1 新大陆Zigbee模块按键电路图 由上图可知,Zigbee模块的SW1按钮连接在P1.2端口上,当SW1导通,P1.2电平从3.3V被拉低接地.所以P1.2输入模式为下拉输入. 1.2 CC2530相关寄存器 寄存器名称 寄存器作用 寄存器描述 P

单片机IO口标准双向,推挽,高阻,开漏模式 ,LED感应亮灭实验【原创!】

单片机IO口标准双向,推挽,高阻,开漏模式 ,LED感应亮灭实验  十一长假在家快烂了,没事儿做,DIY技术搞起来!  [关于12C增强型单片机I/O口的工作类型实验研究] 文中动画视频效果下载: STC单片机头文件[51CTO-->单片机-->LED感应亮灭实验] 下载链接 链接:http://pan.baidu.com/s/1pJKK4w7   密码:a0re  1.用强推模式,点亮一个LED  /* 工程创建MCU选取,Atmel 89C55 单片机:STC12C4052AD 晶振:无要

LED灯亮灭模拟小星星第一句

著名歌曲小星星第一句是 1 1 5 5 6 6 5 ,4 4 3 3 2 2 1 然后我们用D1这个发光二级管代替1 依次类推. #include "reg52.h" typedef unsigned char u8; typedef unsigned int u16; sbit ledD1=P2^0; //P20 sbit ledD2=P2^1; sbit ledD3=P2^2; sbit ledD4=P2^3; sbit ledD5=P2^4; sbit ledD6=P2^5; s

嵌入式Linux学习入门:控制LED灯

记录自己linux学习过程,让自己能够一直坚持下去 1.原理图分析: nLED_1, nLED_2, nLED_4, 给低电平则对应LED灯亮,高电平则对应LED灯灭, S3C2440芯片GPF4-GPF6对应nLED_1, nLED_2, nLED_4, 所以代码里面操作GPF4-GPF6就可以控制LED灯亮灭. 2.写代码前了解事项 第一步:将GPF0-GPF4配置为输出功能 第二步:控制GPF0-GPF4输出低电平 3.编写代码 1 .text 2 .global _start 3 _st

[ZigBee] 3、ZigBee基础实验——GPIO输出控制实验-控制Led亮灭

1.CC2530的IO口概述 CC2530芯片有21 个数字输入/输出引脚,可以配置为通用数字I/O 或外设I/O 信号,配置为连接到ADC.定时器或USART外设.这些I/O 口的用途可以通过一系列寄存器配置,由用户软件加以实现. I/O 端口具备如下重要特性:    ?? 21 个数字I/O 引脚 ?? 可以配置为通用I/O 或外部设备I/O ?? 输入口具备上拉或下拉能力 ?? 具有外部中断能力. 21 个I/O 引脚都可以用作于外部中断源输入口.因此如果需要外部设备可以产生中断.外部中断

PIC12F629帮我用C语言写个程序,控制三个LED亮灭

http://power.baidu.com/question/240873584599025684.html?entry=browse_difficult PIC12F629帮我用C语言写个程序,控制三个LED亮灭! 2014-12-31 16:05DINZEYU  分类:C/C++ | 浏览 87 次 C语言VC++ 按键按一次LED1低亮,按两次高亮,按三次2HZ闪,按三次关,按键长按3秒松开LED2亮,长按3秒松开LED2灭,按键长按5秒松开LED3亮,长按5秒松开LED3灭,每个功能独

STM32学习笔记(四)——串口控制LED(中断方式)

目录: 一.时钟使能,包括GPIO的时钟和串口的时钟使能 二.设置引脚复用映射 三.GPIO的初始化配置,注意要设置为复用模式 四.串口参数初始化配置 五.中断分组和中断优先级配置 六.设置串口中断类型并使能串口中断 七.编写中断服务函数函数名格式为函数名格式为 USARTxIRQHandler(x 对应串口号). 八.主函数的实现. 一.时钟使能,包括GPIO的时钟和串口的时钟使能 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //