历史上的今天
返回首页

历史上的今天

今天是:2024年12月03日(星期二)

正在发生

2021年12月03日 | LED跑马灯-寄存器

2021-12-03 来源:eefocus

一,GPIO知识回顾

1,四种输入模式:

    输入浮空

    输入上拉

    输入下拉

    模拟输入


2,四种输出模式:

    开漏输出

    开漏复用输出

    推挽输出

    推挽复用输出


3,三种最大输出速度

    2MHz 

    10MHz 

    50MHz


每组GPIO共16个IO口,含下7个寄存器


GPIOx_CRL  : 端口配置低寄存器

GPIOx_CRH  : 端口配置高寄存器

GPIOx_IDR  : 端口输入寄存器

GPIOx_ODR  : 端口输出寄存器

GPIOx_BSRR : 端口位设置/清除寄存器

GPIOx_BRR  : 端口位清除寄存器

GPIOx_LCKR : 端口配置锁存寄存器


二,LED硬件连接:

这里写图片描述

连接方式:

    LED0连接PB5引脚

    LED1连接PE5引脚


三,LED跑马灯实现流程-寄存器

 1,使能GPIO时钟


 2,初始化IO口工作模式

      配置寄存器:GPIOx_CRH/CRL


 3,操作IO口输出高低电平

      配置寄存器GPIO_ODR或GPIO_BRR


四,寄存器介绍

4.1,RCC_APB2ENR寄存器

4.1.1,RCC_APB2ENR相关文档

这里写图片描述

  使能GPIOB时钟:

这里写图片描述

  使能GPIOE时钟:

这里写图片描述

4.1.2,RCC_APB2ENR相关源码:

stm32f10x.h找到RCC_TypeDef结构体声明:


typedef struct

{

  __IO uint32_t CR;

  __IO uint32_t CFGR;

  __IO uint32_t CIR;

  __IO uint32_t APB2RSTR;

  __IO uint32_t APB1RSTR;

  __IO uint32_t AHBENR;

  __IO uint32_t APB2ENR;

  __IO uint32_t APB1ENR;

  __IO uint32_t BDCR;

  __IO uint32_t CSR;


#ifdef STM32F10X_CL

  __IO uint32_t AHBRSTR;

  __IO uint32_t CFGR2;

#endif /* STM32F10X_CL */


#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)

  uint32_t RESERVED0;

  __IO uint32_t CFGR2;

#endif /* STM32F10X_LD_VL || STM32F10X_MD_VL || STM32F10X_HD_VL */

} RCC_TypeDef;


再找到结构体指针RCC:


#define RCC                 ((RCC_TypeDef *) RCC_BASE)


4.1.3,使能GPIOB,GPIOE时钟

接下来我们需要操作RCC_TypeDef结构体下APB2ENR寄存器的第3位(GPIOB)和第6位(GPIOE)使能


这里为了修改APB2ENR第3位和第6位而不影响其他位的值,我们采用”|”(或)运算(有一个是1结果就为1)


使能GPIOB和GPIOE我们需要将APB2ENR寄存器第3位和第6位赋值为1

使能GPIOB: RCC->APB2ENR|=1<<3;

使能GPIOE: RCC->APB2ENR|=1<<6;


4.2,配置IO口工作模式(以GPIOB.5为例)

4.2.1,GPIOx_CRL , GPIOx_CRH文档

  这里写图片描述

  这里写图片描述

  每组GPIO有16个IO口,GPIOx_CRL配置0-7位,GPIOx_CRH配置8-15位


  所以配置PB5和PE5需要操作GPIO_CRL寄存器

这里写图片描述

  每个IO口由4个位控制,GPIOx_CRL的32个位控制8个IO口


4.2.2GPIOx_CRL配置

  LED跑马灯需要设置IO为推挽输出

这里写图片描述

  所以我们需要将GPIOx.5的CNF5设置为00,MODE5设置为11 , 0011的16进制值为3


    // 配置GPIOx.5配置为输出速度50MHz的推挽输出


    GPIOB->CRL&=0xFF0FFFFF;    // 一个F代表4位,我们将20-23位(GPIOx.5)清空为0

    GPIOB->CRL|=0x00300000;    // 不影响其他位,将20-24位值设置为0011(16进制为3)


4.3,控制IO口输出高低电平

  我们的LED为低电平点亮,高电平熄灭,所以初始化应设置为熄灭状态,设置IO口输入为高电平需要操作ORD或BRR寄存器,我们以ODR寄存器为例:

  这里写图片描述

  我们要将PB5或PE5的输出电平设置为1,需要设置第五位ODR5值为1:


    GPIOB->ODR|=1<<5; // 在不影响其他位的情况下,将ODR5赋值为1


五,完整代码:

新建LED头文件:HAERWARE->LED->led.h 定义LED初始化函数


#ifndef __LED_H

#define __LED_H


void LED_Init(void);


#endif


新建:HAERWARE->LED->led.c 实现LED初始化函数


#include "led.h"

#include "stm32f10x.h"


void LED_Init(void){


    RCC->APB2ENR|=1<<3;

    RCC->APB2ENR|=1<<6;


    //GPIOB.5

    GPIOB->CRL&=0xFF0FFFFF;    // 一个F代表4位,我们将20-23位(GPIOx.5)清空为0

    GPIOB->CRL|=0x00300000; // 不影响其他位,将20-24位值设置为0011(16进制为3)

    GPIOB->ODR|=1<<5;        // 在不影响其他位的情况下,将ODR5赋值为1


    //GPIOE.5

    GPIOE->CRL&=0xFF0FFFFF;

    GPIOE->CRL|=0x00300000;

    GPIOE->ODR|=1<<5;


}


USER->main.c 主函数编写LED跑马灯代码



#include "stm32f10x.h"

#include "delay.h"

#include "led.h"


int main(void)

{


    delay_init();      // 初始化延时函数

    LED_Init();        // 初始化LED


    while(1){


        // LED熄灭

        GPIOB->ODR|=1<<5;     // PB5=1,小灯熄灭

        GPIOE->ODR|=1<<5;     // PE5=1,小灯熄灭

        delay_ms(500);        // 延时500ms


        // LED点亮

        GPIOB->ODR&=~(1<<5);  // ~(1<<5):除第五位都为1  和之前的取&  第5位置0小灯点亮

        GPIOE->ODR&=~(1<<5);  // 位5置0,小灯点亮

        delay_ms(500);        // 延时500ms

    }

}

推荐阅读

史海拾趣

Danaher Corporation公司的发展小趣事

自上世纪80年代起,丹纳赫集团通过一系列的战略并购,逐渐扩大其在电子行业的影响力。这些并购不仅为丹纳赫集团带来了先进的技术和产品,还增强了其在全球市场的竞争力。其中,对Leica显微系统公司的收购标志着丹纳赫集团正式涉足生命科学业务,为其在电子显微镜和生命科学仪器领域的发展奠定了基础。

HALO Electronics公司的发展小趣事

在十九世纪80年代,丹纳赫集团面对日益严峻的市场竞争,开始推行以精益生产为核心的全新运营方式。这种管理方式不仅强化了其在行业中的领导地位,还逐渐形成了独特的丹纳赫商业系统(Danaher Business System,DBS)。DBS注重持续改进、客户导向和团队合作,成为丹纳赫集团在电子行业取得成功的关键因素。

峰岹(Fortior Tech )公司的发展小趣事

随着全球化趋势的加强,丹纳赫集团开始积极拓展国际市场。通过在全球各地设立研发中心、生产基地和销售网络,丹纳赫集团成功地将产品和服务推向了全球市场。同时,丹纳赫集团还加强了与国际知名企业的合作,共同开发新技术和产品,进一步巩固了其在电子行业中的领先地位。

以上五个故事梗概概述了丹纳赫集团在电子行业中的发展历程和关键节点。如需更详细的信息和故事背景,建议查阅丹纳赫集团的官方资料或相关新闻报道。

Gennum ( Semtech )公司的发展小趣事
作为输入设备,用于触发电路的不同状态。
FORYARD公司的发展小趣事

进入21世纪后,随着新能源汽车产业的兴起,FORYARD敏锐地捕捉到了这一市场机遇。公司开始将研发重心转向汽车电子领域,特别是新能源汽车的电池管理系统(BMS)和电机控制器(MCU)等关键技术。通过持续的技术创新和研发投入,FORYARD成功开发出了一系列高性能、高可靠性的汽车电子产品,并成功应用于多家知名新能源汽车制造商的车型中。这一举措不仅为公司带来了新的增长点,也推动了新能源汽车产业的快速发展。

Enable Semiconductor Corp公司的发展小趣事

面对竞争激烈的半导体市场,Enable Semiconductor Corp公司明智地选择了细分市场作为突破口。公司通过对市场的深入调研,发现智能手机、可穿戴设备等领域对高性能半导体产品的需求日益增长。于是,公司及时调整产品策略,加大在这些领域的研发和市场投入。这一战略布局使得公司能够快速响应市场需求,赢得客户的信赖。

问答坊 | AI 解惑

用FPGA做过FFT的朋友,可否给一些程序作为参考?

最近做这方面的内容,有些吃不消 希望大家可以给一些例子作为参考。或者提供一些方法。 也希望正为此头疼的朋友,大家多多讨论。 FFT,英文名Fast Fourier Transforation,中文译音,快速傅里叶变换,其功能是实现频谱的快速计算,即对时序的 ...…

查看全部问答>

在WINCE系统下,对话框最多能同时层叠多少个?

最近做一个项目,感觉同时存在了5个以上对话框,机子就会挂掉,怀疑是对话框开太多! 死机之前,串口打印出“stack fault……”等错误信息。请问是因为对话框层叠太多的原因吗?…

查看全部问答>

请教关于pxa270的LCD控制器

PXA270的LCD控制器包含7个DMA通道 以前没用过DMA,不知道这个东西怎么用 看了一下SPEC和相关的代码 发现需要这样一个描述符的结构: typedef struct LCDFrameDescriptorS {         UINT32 FDADR;       ...…

查看全部问答>

各位大侠帮帮小妹!

本人最近想在无字库的lcd通过调用字库显示汉字,但不知道如何取得区位码。请各位大侠指教一二!不胜感激!…

查看全部问答>

哪里有picmcu单片机的指令集下载?我的邮箱:16362712@sohu.com

哪里有picmcu单片机的指令集下载?我的邮箱:16362712@sohu.com…

查看全部问答>

弱弱的问一个:uCOS-ii的一个基础问题

uCOS-ii中好多下面这个代码: #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU stat ...…

查看全部问答>

2602新型测试仪器如何缩短测试时间?

Andrew Armutat 产品市场部 吉时利仪器公司 2602型双通道系统源表[1]   可降低测试成本的重要参数 在本文的前面,介绍过四个降低测试成本的关键因素:缩短测试时间、缩短开发时间、减少测试设备所占的面积和机架的空间大小以及降 ...…

查看全部问答>

需要自动调谐算法克服的“常见误差”

哪些是2510-AT自动调谐算法中常见的误差来源呢?它们有哪些局限性是需要克服的?   常见问题 由于力输出线缆颠倒,可能出现温度超程(ORR)。在2510-AT型自动调谐温度控制源表[1]前部面板上,可以很容易地观察到这一点。如果在温度超程状态 ...…

查看全部问答>

IP核问题

从网上下载了个开源串口IP核,包含四个VHDL文件,如何在QUARTUS中生成一个串口核呢。难道是一个VHDL文件生成一个SYMBOL,然后四个SYMBOL再合并成一个SYMBOL是这样操作吗…

查看全部问答>