寄存器版本的跑马灯操作流程(战舰开发板V3)

发布者:未来画家最新更新时间:2022-03-25 来源: eefocus关键字:stm32  printf使用  库文件 手机看文章 扫描二维码
随时随地手机看文章

寄存器版本的跑马灯操作流程(战舰开发板V3)

跑马灯需要配置的IO口

PB5&PE5两个IO口。


需要配置的寄存器

RCC_APB2ENR外设时钟使能寄存器

GPIOx_CRL端口配置低寄存器

ODR端口输出寄存器

BSRR端口位设置/清除寄存器

BRR端口位清除寄存器

IO口寄存器说明

配置IO口的流程

Led.c

#include "led.h"  

#include "stm32f10x.h"  

  

void LED_Init(void)  // LED初始化函数体定义

{  

  

    RCC->APB2ENR|=1<<3;    // 使能时钟  

    RCC->APB2ENR|=1<<6; // 使能时钟  

      

    //GPIOB.5    

      

    GPIOB->CRL &= ~(GPIO_CRL_CNF5|GPIO_CRL_MODE5); // 对相应的位进行清零操作  

    GPIOB->CRL |= GPIO_CRL_MODE5; // 配置IO口模式  

    GPIOB->BSRR |= GPIO_BSRR_BS5; // 配置IO口初始状态  

      

    //GPIOE.5  

      

    GPIOE->CRL &= ~(GPIO_CRL_CNF5|GPIO_CRL_MODE5); // 对相应的位进行清零操作  

    GPIOE->CRL |= GPIO_CRL_MODE5; // 配置IO口模式  

    GPIOE->BSRR |= GPIO_BSRR_BS5; // 配置IO口初始状态  

      

}  

 


Led.h

#ifndef __LED_H  

#define __LED_H  

  

void LED_Init(void);  // 在头文件中声明LED初始化函数

  

#endif  

 


Main.c

#include "delay.h"  

#include "stm32f10x.h"  

#include "led.h"  

  

int main(void)  

{  

  

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

    LED_Init();  // LED初始化

  

    while(1)  

    {  

        GPIOB->BSRR |= GPIO_BSRR_BS5;  // 对PB5进行置1操作

        GPIOE->ODR |= GPIO_BSRR_BS5;  // 对PE5进行置1操作

        delay_ms(500);  

          

        GPIOB->BRR &= ~GPIO_BRR_BR5;  // 对PB5进行置0操作

        GPIOE->BRR &= ~GPIO_BRR_BR5;  // 对PE5进行置0操作

        delay_ms(500);  

    }  

}  

 

为什么对寄存器操作会是这种格式?(以RCC为例)

RCC为何为指针?


RCC是什么类型的指针?

我们看到RCC本身就是个指针格式,指针类型为“RCC_TypeDef *”类型,那我们再看看“RCC_TypeDef”类型的结构体中的成员是什么:


我们可以看到RCC指针所指向的结构体类型有以下成员:


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->APB2ENR|=1<<3;    // 使能时钟  

RCC->APB2ENR|=1<<6; // 使能时钟  

 


这种形式的写法。


IO口配置的几种形式

#include "delay.h"  

#include "stm32f10x.h"  

#include "led.h"  

  

int main(void)  

{  

  

    delay_init();  

    LED_Init();  

  

    while(1)  

    {  

        GPIOB->BSRR |= GPIO_BSRR_BS5;  

        GPIOE->ODR |= GPIO_BSRR_BS5;  

        delay_ms(500);  

          

        //GPIOB->BRR &= ~GPIO_BRR_BR5;  // 形式一

        GPIOB->BRR &= ~GPIO_Pin_5;  // 形式二

        GPIOE->BRR &= ~GPIO_BRR_BR5;  

        delay_ms(500);  

    }  

}  

 


我们看预定义格式就知道了:


GPIO_Pin_n的宏定义格式

#define GPIO_Pin_0                 ((uint16_t)0x0001)  /*!< Pin 0 selected */  

#define GPIO_Pin_1                 ((uint16_t)0x0002)  /*!< Pin 1 selected */  

#define GPIO_Pin_2                 ((uint16_t)0x0004)  /*!< Pin 2 selected */  

#define GPIO_Pin_3                 ((uint16_t)0x0008)  /*!< Pin 3 selected */  

#define GPIO_Pin_4                 ((uint16_t)0x0010)  /*!< Pin 4 selected */  

#define GPIO_Pin_5                 ((uint16_t)0x0020)  /*!< Pin 5 selected */  

#define GPIO_Pin_6                 ((uint16_t)0x0040)  /*!< Pin 6 selected */  

#define GPIO_Pin_7                 ((uint16_t)0x0080)  /*!< Pin 7 selected */  

#define GPIO_Pin_8                 ((uint16_t)0x0100)  /*!< Pin 8 selected */  

#define GPIO_Pin_9                 ((uint16_t)0x0200)  /*!< Pin 9 selected */  

#define GPIO_Pin_10                ((uint16_t)0x0400)  /*!< Pin 10 selected */  

#define GPIO_Pin_11                ((uint16_t)0x0800)  /*!< Pin 11 selected */  

#define GPIO_Pin_12                ((uint16_t)0x1000)  /*!< Pin 12 selected */  

#define GPIO_Pin_13                ((uint16_t)0x2000)  /*!< Pin 13 selected */  

#define GPIO_Pin_14                ((uint16_t)0x4000)  /*!< Pin 14 selected */  

#define GPIO_Pin_15                ((uint16_t)0x8000)  /*!< Pin 15 selected */  

#define GPIO_Pin_All               ((uint16_t)0xFFFF)  /*!< All pins selected */ 

 


GPIO_BRR_BRn的宏定义格式

/*******************  Bit definition for GPIO_BRR register  *******************/  

#define GPIO_BRR_BR0                         ((uint16_t)0x0001)            /*!< Port x Reset bit 0 */  

#define GPIO_BRR_BR1                         ((uint16_t)0x0002)            /*!< Port x Reset bit 1 */  

#define GPIO_BRR_BR2                         ((uint16_t)0x0004)            /*!< Port x Reset bit 2 */  

#define GPIO_BRR_BR3                         ((uint16_t)0x0008)            /*!< Port x Reset bit 3 */  

#define GPIO_BRR_BR4                         ((uint16_t)0x0010)            /*!< Port x Reset bit 4 */  

#define GPIO_BRR_BR5                         ((uint16_t)0x0020)            /*!< Port x Reset bit 5 */  

#define GPIO_BRR_BR6                         ((uint16_t)0x0040)            /*!< Port x Reset bit 6 */  

#define GPIO_BRR_BR7                         ((uint16_t)0x0080)            /*!< Port x Reset bit 7 */  

#define GPIO_BRR_BR8                         ((uint16_t)0x0100)            /*!< Port x Reset bit 8 */  

#define GPIO_BRR_BR9                         ((uint16_t)0x0200)            /*!< Port x Reset bit 9 */  

#define GPIO_BRR_BR10                        ((uint16_t)0x0400)            /*!< Port x Reset bit 10 */  

#define GPIO_BRR_BR11                        ((uint16_t)0x0800)            /*!< Port x Reset bit 11 */  

#define GPIO_BRR_BR12                        ((uint16_t)0x1000)            /*!< Port x Reset bit 12 */  

#define GPIO_BRR_BR13                        ((uint16_t)0x2000)            /*!< Port x Reset bit 13 */  

#define GPIO_BRR_BR14                        ((uint16_t)0x4000)            /*!< Port x Reset bit 14 */  

#define GPIO_BRR_BR15                        ((uint16_t)0x8000)            /*!< Port x Reset bit 15 */  

[1] [2]
关键字:stm32  printf使用  库文件 引用地址:寄存器版本的跑马灯操作流程(战舰开发板V3)

上一篇:stm32f407 内部flash保存数据
下一篇:STM32跑马灯配置流程

推荐阅读最新更新时间:2024-11-12 10:28

RT-Thread学习笔记【stm32】(二):线程的创建中的一些问题
本文作者在实现对RTT的线程创建的过程中,发现了一些问题。 首先,我初始化了三个线程a,b,c。 但是在start 的过程中,我发现了一个神奇的现象,那就是,我只能初始化前两个线程, 第三个线程总是初始化失败。 而后我想到可能是,优先级的设置出现问题,于是我更换各种优先级之后发现,问题并没有得到解决。 再后来,我想到了一个重要的问题,那就是我用的是最小板STM,那么会不会是32的ram不够大,而 我的任务堆栈设置的过大,到导致任务无法初始化。 而后,我降低了任务的堆栈,发现,成功开始了线程。
[单片机]
STM32学习笔记9——结构体赋值问题
采用TCP/IP上报采集数据,用结构体的形式建立数据缓冲区。在对结构体整体赋初值(比如帧头之类的可以先赋值)时,发现结构体只能在定义时整体赋初值,而不能在初始化语句中赋。 比如我定义的结构体为: //帧格式结构体 typedef struct { uint32_t frame_head; //帧标志 uint16_t frame_len;//帧长 stcSystemTime frame_time;//帧时间 stcFrameParameter frame_parameter;//参数列表 uint8_t frame_head_check;//帧头校验码 uint8_t frame_total_check;//整帧校验码 s
[单片机]
STM32串口DMA容易忽视的问题
昨天晚上在STM32串口DMA的问题上纠结了好长时间,所以今天上午写篇博客来谈谈我对串口DMA发送的理解 讨论三个问题:1、什么叫串口DMA 请求;2、串口简要复习;3、串口DMA发送流程。 1、什么叫串口DMA 请求(战舰STM32开发板) 说这个问题之前先简单回顾DMA的基本特性。先导出原子哥的PPT内容: DMA 全称Direct Memory Access,即直接存储器访问。 DMA传输将数据从一个地址空间复制到另一个地址空间。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实现和完成的。 STM32有两个DMA控制器(DMA2只存在于大容量产品中),DMA1有7个通道,DMA2有5个
[单片机]
<font color='red'>STM32</font>串口DMA容易忽视的问题
STM32外部中断使用注意事项
stm32尽管所有的gpio都可以设置为外部中断的功能,但是不能把所有的gpio同时设置为外部中断。例如不能把PA0和PB0同时设置为外部中断,因为PA0和PB0共用一个中断线,MCU只把最后完成初始化的管脚设置为外部中断。 如果代码编写者明确知道PA0和PB0不会同时触发,并且触发有相互依赖关系,可以通过分时设置PA0和PB0的外部中断功能。但是在大多数情况下,外部中断的触发都是随机的,那么在设计原理图的时候就要考虑到这种情况,把用到的外部中断管脚设置到后缀不同的管脚上,如PA0,PA1,PB3,PC8,....PD12,PF16,在一个工程中最多能使用16个外部中断,并且每个管脚的后缀不同。 如果设计电路板没有考虑到这种情况,
[单片机]
stm32程序下载成功但是不运行
调试stm32程序,发现如下问题: STM32编写程序,当程序中没有sd卡部分时,程序正常下载,正常运行。当程序中运行sd卡加文件系统时程序能正常下载但是不能正常的运行。发现问题就要解决问题呀,好了大家一起来和我解决问题吧!​ 根据自己问题,上网查找解决办法,最终将问题锁定在堆栈设置问题上。(堆栈设置的空间不够大) 解决办法:在​stm32的程序目录下查找STM32F10x.s(或者是startup_stm32f10x_hd,这取决于你是用的寄存器还是函数库) 在打开文件,在文件的开头很醒目的位置,发现了关于堆栈的设置。​​ 从中我们可以看出来对于栈(stack)的大小设置为0x200,堆(heap)的大小为
[单片机]
<font color='red'>stm32</font>程序下载成功但是不运行
STM32固件库文件树及构成详解
STM32固件库文件树及构成详解(库版本:STM32F10x_StdPeriph_Lib_V3.5.0) 库减压后所有文件夹构成如下: /////////////////////////////////////////////////////////////////////////////////////////////
[单片机]
STM32 IAP 无法运行用户程序的解决方法
IAP程序: 主要是设置用户程序的起始地址 APPLICATION_ADDRESS,如0x08004000,通过外设把用户代码写入FLASH的用户区。满足条件后,跳转至用户区起始地址。 解释一下跳转部分代码: /* Test if user code is programmed starting from address APPLICATION_ADDRESS */ if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)// 判断栈顶地址是否在0x2000 0000 - 0x2000 2000之间 // 通过判断栈顶地址值是否正确来判
[单片机]
<font color='red'>STM32</font> IAP 无法运行用户程序的解决方法
GD32单片机STM32远程下载手机程序升级固件下载局域网网页升级工具
GD32、STM32单片机,是我们最常见的一种MCU。通常我们在使用STM32单片机都会遇到程序在线升级下载的问题。 GD32/STM32单片机的在线下载通常需要以下几种方式完成: 1、使用ST/GD提供的串口下载工具,本地完成固件的升级下载。 2、自行完成系统BootLoader的编写,将系统程序分为BootLoader和APP两个部分,BootLoader完成固件升级。 3、使用STM32/GD固件服务器,完成固件的升级,固件服务器https://simplewifi.taobao.com/ 几种方式各有优缺点: 使用ST提供的方法进行固件升级,方法简单,不需要额外的开发。但是,只能本地完成STM32单片机的升级。
[单片机]
GD32单片机<font color='red'>STM32</font>远程下载手机程序升级固件下载局域网网页升级工具
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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