历史上的今天
返回首页

历史上的今天

今天是: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同时点亮

 

}

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


推荐阅读

史海拾趣

GTK UK Ltd公司的发展小趣事
通过闭环反馈系统,实时调整电机的转动速度和方向,确保望远镜始终对准太阳。
Broyce Control公司的发展小趣事

进入21世纪,Broyce Control已经成为电气和电子产品设计、制造和供应领域的佼佼者。公司不仅在技术上持续创新,还注重与行业伙伴的合作与交流。通过参与国际标准的制定和推广,Broyce Control逐渐在行业内树立了领导地位。同时,公司还积极承担社会责任,推动可持续发展和环保理念的实践,为行业的健康发展做出了积极贡献。

GISMA Steckverbinder GmbH公司的发展小趣事

自1983年成立以来,GISMA Steckverbinder GmbH便专注于水下连接器的开发、设计和生产。作为一家由所有者直接管理的独立公司,GISMA从一开始就确立了为海洋工业、船舶及海洋技术提供高质量电气和光纤连接器的目标。这一明确的市场定位使得GISMA能够迅速在竞争激烈的电子行业中脱颖而出,逐步建立起自己的市场地位。

HN Electronic Components GmbH & Co Kg公司的发展小趣事

背景:近年来,随着全球对环境保护和可持续发展的重视,电子行业也面临着绿色转型的压力。

发展:HN Electronics积极响应环保号召,将绿色生产理念融入公司的发展战略中。公司投入大量资金进行技术改造和设备升级,减少生产过程中的能耗和污染排放。同时,HN Electronics还积极研发和推广绿色电子产品,满足市场对环保产品的需求。

关键事件:2020年,HN Electronics推出了一系列采用环保材料和先进生产工艺的绿色电子产品,这些产品不仅性能优异,而且符合国际环保标准,赢得了市场的广泛好评。

Genesis Microchip公司的发展小趣事

进入21世纪后,电子行业面临着前所未有的变革和挑战。随着信息技术的飞速发展,云计算、大数据、人工智能等新兴技术不断涌现,对传统电子企业提出了更高的要求。GI积极响应行业变革的号召,不断加大在新技术研发方面的投入,努力推动产品升级和转型。同时,公司也积极拥抱互联网思维,加强与互联网企业的合作与融合,共同探索电子行业的新未来。这一阶段的努力,使GI在激烈的市场竞争中保持了领先地位,并继续为电子行业的发展贡献着力量。

需要注意的是,以上故事是基于行业常识和通用发展路径构建的,并非直接针对GI的官方历史。由于GI的具体发展历史和详细故事可能因资料限制而无法全面呈现,因此以上内容仅供参考。

Gigarams Semiconductor Device Corp公司的发展小趣事
这可能是由于控制算法复杂或系统响应速度不足导致的。解决方案包括简化控制算法、提高系统响应速度或采用更高效的控制策略。

问答坊 | AI 解惑

ad6的原理图库中一般的常用器件没有

各位大侠 最近在学习ad6,但是发现在查找元件时有些就是找不到。 例如:ATMEL的单片机等等; 常用的电阻,电容,找不到; 知道的可否指点一下。 另外,我在看资料时,发现可将99的封装改变过来。 这样好用吗?…

查看全部问答>

74HC393

74HC393,发给二都的…

查看全部问答>

程序最后收尾工作,,修改参数不按SET也可以保存到EEPROM中..着急的很

现在问题和缺点是如果修改了参数不按SET如果突然断电参数就保存不到EEPROM中去,,要修改为只要修改了就存到EEPROM中,,高人指点下      …

查看全部问答>

C语言模块化程序设计方法教程。

最近发现很多收手为C语音模块化程序的设计苦恼,本人写个简单的教程希望对新人有用。为了使C的结构清晰并于维护,一定要注意,一个C文件一定要对应一个H文件,一一对应,如:   main.c -- config.h iic.c     -- iic.h ...…

查看全部问答>

关于wince中文输入法的问题

我添加了如下组件 MSPY 3.0 for windows ce       1.7 MB -standard database       double spelling soft keyboard Multilingual User Interface(MUI)。 但进入系统后,用double spelling soft keyb ...…

查看全部问答>

拔USB死机的问题,散几分

dell的本子重装了系统,拔USB没死,装好了所有的开发软件再试,死了。琢磨了一下,卸载BusHound,ok了。没重装之前也死,看来就是BusHound的作用。奇怪的是,拔读卡器、u盘这样的storage设备就死,即使安全弹出了设备,但拔activesync、串口、仿真 ...…

查看全部问答>

exam的例程中的can求助,香版主帮忙

最近在调英倍特板子的stm32中的can程序例子是自收自发模式,我修改为普通模式,但是在应用中,发送接收的时候就出问题了比如:can发送邮箱3个都是满的,可是就是发不出去信号,按照datasheet一步步来写程序还是不成。单步调过了,实在看不出什 ...…

查看全部问答>

关于CAN总线出错的问题处理

两个CAN通讯,故意手动模CAN通讯线(线皮去掉),CAN总线会死掉,我仿真时候,在看寄存器,发现,有时候是离线错误,看了几种错误情况都有? 如果仿真,让CPU重新复位,发现CA还不能正常通讯,我复位CPU,整个CAN寄存器都复位了,为什么总线 ...…

查看全部问答>

STM8STIME2可以用吗?

STM8S103K3 其中用到定时器2, 1、TIME2_CH2 做PWM输出; 2、TIME2_CH3 做脉冲输入捕获; 不知道这样做有没有问题??? 请兄弟们指点一二。。。。。…

查看全部问答>