历史上的今天
今天是:2025年01月30日(星期四)
2019年01月30日 | STM32寄存器操作和库函数操作区别
2019-01-30 来源:eefocus
/*********************** 结构体操作点亮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标准库函数命名规则
史海拾趣
|
各位大侠 最近在学习ad6,但是发现在查找元件时有些就是找不到。 例如:ATMEL的单片机等等; 常用的电阻,电容,找不到; 知道的可否指点一下。 另外,我在看资料时,发现可将99的封装改变过来。 这样好用吗?… 查看全部问答> |
|
程序最后收尾工作,,修改参数不按SET也可以保存到EEPROM中..着急的很 现在问题和缺点是如果修改了参数不按SET如果突然断电参数就保存不到EEPROM中去,,要修改为只要修改了就存到EEPROM中,,高人指点下 … 查看全部问答> |
|
最近发现很多收手为C语音模块化程序的设计苦恼,本人写个简单的教程希望对新人有用。为了使C的结构清晰并于维护,一定要注意,一个C文件一定要对应一个H文件,一一对应,如: main.c -- config.h iic.c -- iic.h ...… 查看全部问答> |
|
我添加了如下组件 MSPY 3.0 for windows ce 1.7 MB -standard database double spelling soft keyboard Multilingual User Interface(MUI)。 但进入系统后,用double spelling soft keyb ...… 查看全部问答> |
|
dell的本子重装了系统,拔USB没死,装好了所有的开发软件再试,死了。琢磨了一下,卸载BusHound,ok了。没重装之前也死,看来就是BusHound的作用。奇怪的是,拔读卡器、u盘这样的storage设备就死,即使安全弹出了设备,但拔activesync、串口、仿真 ...… 查看全部问答> |
|
最近在调英倍特板子的stm32中的can程序例子是自收自发模式,我修改为普通模式,但是在应用中,发送接收的时候就出问题了比如:can发送邮箱3个都是满的,可是就是发不出去信号,按照datasheet一步步来写程序还是不成。单步调过了,实在看不出什 ...… 查看全部问答> |
|
两个CAN通讯,故意手动模CAN通讯线(线皮去掉),CAN总线会死掉,我仿真时候,在看寄存器,发现,有时候是离线错误,看了几种错误情况都有? 如果仿真,让CPU重新复位,发现CA还不能正常通讯,我复位CPU,整个CAN寄存器都复位了,为什么总线 ...… 查看全部问答> |
|
STM8S103K3 其中用到定时器2, 1、TIME2_CH2 做PWM输出; 2、TIME2_CH3 做脉冲输入捕获; 不知道这样做有没有问题??? 请兄弟们指点一二。。。。。… 查看全部问答> |




