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

来源:本站
导读:目前正在解读《STM32寄存器操作和库函数操作区别》的相关信息,《STM32寄存器操作和库函数操作区别》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《STM32寄存器操作和库函数操作区别》的详细说明。
简介:今天介绍STM32寄存器操作和库函数操作区别,一起看下。

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

#include <stdint.h>//数据类型声明标准头文件

#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寄存器操作和库函数操作区别》最后刷新时间 2024-03-14 00:57:26,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《STM32寄存器操作和库函数操作区别》该内容的真实性请自行鉴别。