STM32寄存器操作和库函数操作区别

发布者:legend8最新更新时间:2019-01-30 来源: eefocus关键字:STM32  寄存器操作  库函数操作 手机看文章 扫描二维码
随时随地手机看文章

/*********************** 结构体操作点亮LED ********************************/

 

#include  //数据类型声明标准头文件

#define __IO volatile //定义__IO

 

//GPIO寄存器结构体定义

typedef struct {

__IO uint32_t CRL;

__IO uint32_t CRH;

__IO uint32_t IDR;

__IO uint32_t ODR;

__IO uint32_t BSRR;

__IO uint32_t BRR;

__IO uint32_t LCKR;

} GPIO_TypeDef;

 

//定义各个总线的基地址,其中APB1是所有总线的基地址

#define PERIPH_BASE ((uint32_t)0x40000000)

#define APB1PERIPH_BASE PERIPH_BASE

#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)

#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)

 

//根据总线的基地址,算出并定义各个GPIO的基地址

#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)

#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)

#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)

#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400)

#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800)

#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00)

#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000)

 

//通过指针把各个GPIO定义到其对应的基地址,后面就可以根据GPIO名来操作各个GPIO的寄存器

#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)

#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)

#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)

#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)

#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE)

#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)

#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE)

 

//RCC时钟外设的地址定义,RCC是挂在AHB总线上的外设

#define RCC_BASE (AHBPERIPH_BASE + 0x1000)

 

//RCC时钟结构体通过指针对应到其地址上,后面就可以用RCC直接操作各个RCC寄存器

#define RCC ((RCC_TypeDef *) RCC_BASE)

 

//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;

} RCC_TypeDef;

 

//将后面要操作的寄存器对应到其地址指针

#define RCC_APB2ENR *(volatile unsigned long *)0x40021018

#define GPIOB_CRL *(volatile unsigned long *)0x40010C00

#define GPIOB_ODR *(volatile unsigned long *)0x40010C0C

 

int main(void)

{

//开启PB的时钟

RCC->APB2ENR = 0x00000008; //RCC_APB2ENR:IOPB=1

 

//配置PB为通用推挽输出模式,速率为2M

GPIOB->CRL = 0x00000002; //PB0:CNF0[1:0]=00, MODE0[1:0]=10 

GPIOB->CRL = 0x00000020; //PB1:CNF1[1:0]=00, MODE1[1:0]=10

GPIOB->CRL = 0x00200000; //PB5:CNF5[1:0]=00, MODE5[1:0]=10

GPIOB->CRL = 0x00200022; //PB0、PB1、PB5同时设为2M速度的推挽输出模式

 

//PB需输出低电平,对应LED点亮(PB0:LED_G;PB1:LED_B;PB5:LED_R)

GPIOB->ODR = 0xFFFFFFFE; //PB0为低电平,LED_G点亮

GPIOB->ODR = 0xFFFFFFFD; //PB1为低电平,LED_B点亮

GPIOB->ODR = 0xFFFFFFDF; //PB5为低电平,LED_R点亮

GPIOB->ODR = 0xFFFFFFDC; //LED_G、LED_B、LED_R同时点亮

 

}

/********************************************************************************/

 

 

 

/*********************** 寄存器操作点亮LED ***********************************/

 

//RCC时钟寄存器,所有的IO口都挂载在APB2总线上

//RCC_APB2ENR:APB2外设时钟使能控制寄存器,使能第3位(IOPB)即可

//定义RCC_APB2ENR的地址,GPIOB的基地址是0X4002 1000,APB2ENR寄存器的地址偏移是0x18

#define RCC_APB2ENR *(volatile unsigned long *)0x40021018

 

//方向控制:输入和输出

//CR:端口配置寄存器,分为CRL寄存器(配置P0-P7端口)和CRH寄存器(配置P8-P15端口)

//CRL的CNF[1:0]位控制端口的输入和输出,MODE[1:0]位控制输出的速度(2M/10M/50M)

//定义GPIOB_CRL的地址,GPIOB的基地址是0X4001 0C00,CRL寄存器的地址偏移是0x00

#define GPIOB_CRL *(volatile unsigned long *)0x40010C00

 

//电平控制:1-输出高电平,0-输出低电平

//ODR:Output data register,端口输出数据寄存器

//定义GPIOB_ODR寄存器的地址,GPIOB的基地址是0X4001 0C00,ODR寄存器的地址偏移是0x0C

#define GPIOB_ODR *(volatile unsigned long *)0x40010C0C

 

int main(void)

{

//开启PB的时钟

RCC_APB2ENR = 0x00000008; //RCC_APB2ENR:IOPB=1

 

 

//配置PB为通用推挽输出模式,速率为2M

GPIOB_CRL = 0x00000002; //PB0:CNF0[1:0]=00, MODE0[1:0]=10 

GPIOB_CRL = 0x00000020; //PB1:CNF1[1:0]=00, MODE1[1:0]=10

GPIOB_CRL = 0x00200000; //PB5:CNF5[1:0]=00, MODE5[1:0]=10

GPIOB_CRL = 0x00200022; //PB0、PB1、PB5同时设为2M速度的推挽输出模式

 

//PB需输出低电平,对应LED点亮(PB0:LED_G;PB1:LED_B;PB5:LED_R)

GPIOB_ODR = 0xFFFFFFFE; //PB0为低电平,LED_G点亮

GPIOB_ODR = 0xFFFFFFFD; //PB1为低电平,LED_B点亮

GPIOB_ODR = 0xFFFFFFDF; //PB5为低电平,LED_R点亮

GPIOB_ODR = 0xFFFFFFDC; //LED_G、LED_B、LED_R同时点亮

 

}

/*******************************************************************/


关键字:STM32  寄存器操作  库函数操作 引用地址:STM32寄存器操作和库函数操作区别

上一篇:STM32标准库函数命名规则
下一篇:使用STM32测量频率和占空比的几种方法

推荐阅读最新更新时间:2024-03-16 16:23

stm32f407之CAN控制器(操作寄存器
CAN控制器 首先简单介绍一下CAN总线,关于CAN总线是谁发明的,CAN总线的历史,CAN总线的发展,CAN总线的应用场合,这些,通通不说。这里只是以我个人理解,简单说说CAN通信。CAN总线的端点没有地址(除非自己在帧里定义地址),CAN总线通信不用地址,用标识符,不是单独的谁发给谁,而是,你总是发送给整个网络。然后每个节点都有过滤器,对网络上的传播的帧的标识符进行过滤,自己想要什么样的帧,可以设置自己的过滤器,接收相关的帧信息。如果两个节点同时发送怎么办?这个不用我们担心,CAN控制器会自己仲裁,让高优先级的帧先发。 然后我们可以了解一下stm32的CAN控制器。 如上图所示,stm32有
[单片机]
stm32f407之CAN控制器(<font color='red'>操作</font><font color='red'>寄存器</font>)
基于STM32单片机的盆栽系统设计
一.系统设计 本次盆栽系统的设计使用STM32单片机作为控制中心,通过光敏模块检测光照强度,通过DHT11测量温湿度,通过土壤湿度传感器检测土壤湿度,检测到的数据通过LCD显示屏显示,当土壤湿度低于下限时,继电器控制灌溉,当土壤湿度高于上限时,继电器控制除湿,当温度低于阈值时,继电器控制加热,当光强低于阈值时,继电器控制补光。 图1 系统框图 二.硬件设计 本设计所采用的STM32F103C8T6是以Cortex-3为核心的单片机,它的功能是实现软件的执行,并对外部的器件、模块进行控制。该系统由LCD显示模块,温湿度检测模块,光敏电阻模块,湿度检测模块,继电器模块组成。 图2 硬件电路 三.软件设计 系统的软件实现过程中首
[单片机]
基于<font color='red'>STM32</font>单片机的盆栽系统设计
STM32:独立看门狗、窗口看门狗的配置.....
STM32单片机的看门狗有独立看门狗和窗口看门狗之分,这两者的工作原理却完全不同,今天来看一下他们的具体区别和配置方法。 ▍STM32独立看门狗由专门的低速时钟(LSI)驱动,即便是主时钟发生故障它仍能够有效,所以此狗狗可以工作在与主时钟无关的要求下,或者待机模块下等,所以它叫独立看门狗,注意一旦开启此看门狗则只能由MCU复位后才清除,让它不再工作。它的时钟是一个内部RC时钟,它会在30KHZ到60KHZ之间变化,并非是精确的40KHZ,而只是一般计算时取40KHZ。独立看门狗需设置四个寄存器如下: 其中,预分频寄存器(IWDG_PR),最低三位PR (Prescaler divider)有效,可设置有8种不同的计数器时钟预分
[单片机]
<font color='red'>STM32</font>:独立看门狗、窗口看门狗的配置.....
STM32 基础系列教程 2 - GPIO 按键输入
前言 学习stm32 GPIO 的使用,实现简单的按键输入功能,用按键的高低来控制LED的亮灭! 示例详解 基于硬件平台: STM32F10C8T6最小系统板, MCU 的型号是 STM32F103c8t6, 使用stm32cubemx 工具自动产生的配置工程,使用KEIL5编译代码。将PA0引脚设置成输入引脚,程序得到PA0引脚的(按键操作)输入状态,并根据其输入电平的高低来控制PC13输出,来控制LED,实现按一次LED亮,再按一下,LED灭的功能。 本示例所用的最小系统板原理图: 新建STM32 CUBEMX 工程, 双击桌面STM32CubeMX工具 在CubeMX中菜单中点 File à New
[单片机]
<font color='red'>STM32</font> 基础系列教程 2 - GPIO 按键输入
STM32之通用定时器输出比较模式
#include stm32f10x.h /* RCC时钟配置 */ void RCC_config() { ErrorStatus HSEStartUpStatus; /* RCC寄存器设置为默认配置 */ RCC_DeInit(); /* 打开外部高速时钟 */ RCC_HSEConfig(RCC_HSE_ON); /* 等待外部高速时钟稳定 */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { /* 设置HCLK = SYSCLK */ RCC_HCLKConfig(RCC_SYSCLK_Div1); /
[单片机]
基于STM32智能马蹄锁设计
1. 前言 设计一款基于单片机的家用马蹄锁,主要用在自行车、共享单车上。 主要要求: 1、手机蓝牙直连控制开关:手机直接连接智能马蹄锁可以控制其开锁关锁的功能。 2、即连即开: 手机端与智能马蹄锁第一次连接成功后可以选择即连即开模式,在之后距离智能马蹄锁一定范围内,智能马蹄锁会自动打开。 3、即走即关:手机端与智能马蹄锁第一次连接成功后可以选择即连即走即关,在之后离开智能马蹄锁一定范围,智能马蹄锁会自动关团。 4、实体触控按键控制开锁手动关锁。当用户无法使用蓝牙功能时,可以使用侧面实体触控按键进行密码解锁。 5、GPRS防盗预警当自行车在智能马蹄锁住的的情况下三轴加速度传感器检测到车辆被长时间移动时会向用户
[单片机]
基于<font color='red'>STM32</font>智能马蹄锁设计
开漏输出和推挽输出
概述 在STM32或者GD32中,普通的输出GPIO输出方式主要是开漏输出和推挽输出,下面我们开始讲解这2种模式的区别。 下图是GPIO内部的结构示意图。 在上图中,P-MOS带了一个⚪,说明是低电平导通。 上图是GPIO的示意图,有输入和输出,如果简化为输出,则如下所示。 模拟文件下载 https://download.csdn.net/download/qq_24312945/85250172 推挽输出 推挽输出的内部电路大概是下图这个样子,由一个P-MOS和一个N-MOS组合而成,同一时间只有一个管子能够进行导通。 当输出高电平时候,P-MOS导通,N-MOS截至,此时电源电流入R5。 当输出低电平时
[单片机]
开漏输出和推挽输出
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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