历史上的今天
返回首页

历史上的今天

今天是:2025年05月29日(星期四)

正在发生

2019年05月29日 | 直接通过寄存器地址操作控制LED灯(定义常量标示对应寄存器)

2019-05-29 来源:eefocus

直接通过地址常量对应给寄存器赋值的方式是最简捷的方式,但程序的可读性极差(不容易地址常量值得知是对应哪个寄存器),程序的可移植性差,为了提高程序的可读性和可移植性,通常预定义符号常量和符号变量。


void SystemInit()


{


}


void delay(int t)


{


     int i;


     for( ;t>0; t--)


         for(i=0;i<1000;i++);


}


int main()


{


    


     *((unsigned int *)0x40021018) |= 0x1<<4;       //开启GPIOC时钟


     *((unsigned int *)0x40011000) &= ~(0x0F<<(4*0));   //对GPIOC_0设置为通用推挽输出,最大速度50MHz


     *((unsigned int *)0x40011000) |= (0x03<<(4*0));


     while(1)


     {


         *((unsigned int *)0x40011010) |= 0x01<<(16+0); //对GPIOC_0复位


         delay(1000);


         *((unsigned int *)0x40011010) |= 0x01<<(0+0);  //对GPIOC_0置位


         delay(1000);


     }


}


对上述main.c程序进行如下改进:


1、在user文件夹下新建一个stm32f10x.h文件,其内容为:


#define PERIPH_BASE                ((unsigned int)0x40000000)


#define APB2PERIPH_BASE       (PERIPH_BASE + 0x00010000)


#define GPIOC_BASE                            (APB2PERIPH_BASE + 0x1000)


#define GPIOC_CRL                               *(unsigned int *)(GPIOC_BASE +0x00)


#define GPIOC_CRH                              *(unsigned int *)(GPIOC_BASE +0x04)


#define GPIOC_IDR                               *(unsigned int *)(GPIOC_BASE +0x08)


#define GPIOC_ODR                              *(unsigned int *)(GPIOC_BASE +0x0C)


#define GPIOC_BSRR                            *(unsigned int *)(GPIOC_BASE +0x10)


#define GPIOC_BRR                              *(unsigned int *)(GPIOC_BASE +0x14)


#define GPIOC_LCKR                            *(unsigned int *)(GPIOC_BASE +0x08)


#define AHBPERIPH_BASE         (PERIPH_BASE + 0x00020000)


#define RCC_BASE                                (AHBPERIPH_BASE + 0x1000)


#define RCC_APB2ENR                         *(unsigned int *)(RCC_BASE + 0x18)


定义这些标示符后,可以通过对GPIOC_CRL等表示符直接赋值给相应寄存器。


2、在main.c中包含上述头文件,并使用对应表示符操作寄存器


#include "stm32f10x.h"


void SystemInit()


{


}


void delay(int t)


{


     int i;


     for( ;t>0; t--)


         for(i=0;i<1000;i++);


}


int main()


{


    


     RCC_APB2ENR |= 0x1<<4;      //开启GPIOC时钟


     GPIOC_CRL &= ~(0x0F<<(4*0));     //对GPIOC_0设置为通用推挽输出,最大速度50MHz


     GPIOC_CRL |= (0x03<<(4*0));


     while(1)


     {


         GPIOC_BSRR |= 0x01<<(16+0); //对GPIOC_0复位


         delay(1000);


         GPIOC_BSRR |= 0x01<<(0+0);  //对GPIOC_0置位


         delay(1000);


     }


}


这种方式下,通过标示符可以知道对应哪个寄存器,方便编程和程序阅读。



推荐阅读

史海拾趣

Gems Sensors & Controls公司的发展小趣事

Gems Sensors & Controls公司始终致力于技术创新和产品研发。数十年来,公司不断推出新型号的液位、流量和压力传感器、微型电磁阀及预装射流系统等产品,以满足客户日益多样化的需求。这些产品凭借其卓越的性能和稳定的质量,在行业内赢得了广泛的赞誉和认可,也推动了整个传感器行业的进步和发展。

Aavid Thermalloy公司的发展小趣事

Gems Sensors & Controls公司始终致力于技术创新和产品研发。数十年来,公司不断推出新型号的液位、流量和压力传感器、微型电磁阀及预装射流系统等产品,以满足客户日益多样化的需求。这些产品凭借其卓越的性能和稳定的质量,在行业内赢得了广泛的赞誉和认可,也推动了整个传感器行业的进步和发展。

Cantec Electronic Co Ltd公司的发展小趣事

Cantec Electronic Co Ltd一直注重企业文化的建设。公司倡导“创新、协作、务实、高效”的企业精神,鼓励员工勇于创新、敢于担当。同时,公司还注重员工的培训和成长,为员工提供广阔的发展空间和良好的职业晋升通道。这种积极向上的企业文化吸引了大量优秀人才的加入,为公司的快速发展提供了强大的人才支撑。

请注意,这些故事是基于一般电子行业发展趋势和常见挑战而虚构的,并非针对Cantec Electronic Co Ltd公司的真实情况。如果您需要了解该公司的发展故事,建议您查阅相关资料或联系公司进行咨询。

CoolerMaster公司的发展小趣事

随着业务的不断发展,Cooler Master逐渐将触角延伸至全球。集团总部位于中国台北,同时在大陆设立了制造基地,并在北美、欧洲、东亚及北京、上海等地设有办事处或研发中心。这种全球化的布局使得Cooler Master能够更好地了解各地市场的需求,进而提供更加精准的产品和服务。此外,公司还与多家全球500强品牌合作,为其提供散热解决方案,进一步巩固了其在全球散热领域的领导地位。

GHI Electronics公司的发展小趣事

GHI Electronics深知技术创新是企业持续发展的关键。因此,公司不断加大研发投入,致力于开发具有自主知识产权的产品。其中,ARM微控制器、显示模块、空气质量传感器、模块化系统以及微处理器等主打产品系列,凭借其卓越的性能和稳定的品质,在消费电子、便携设备、通讯/网络等领域获得了广泛应用。这些技术创新不仅巩固了GHI Electronics在市场上的领先地位,也为其未来的发展奠定了坚实的基础。

Excel-Display Corporation公司的发展小趣事

EDC一直将产品质量视为企业的生命线。为了确保产品质量,公司建立了严格的质量管理体系,从原材料采购到生产过程中的每一个环节都进行严格的质量控制。

此外,EDC还注重售后服务,为客户提供全方位的技术支持和解决方案。这些举措让EDC赢得了客户的信赖和好评,也为公司赢得了更多的市场份额。

问答坊 | AI 解惑

11月09日 DIY示波器最新进展(上图)

波形显示界面 引导界面 下面把波形和参数的显示添加进去就可以了,另外一个网友已经做好了,只要把代码合起来这一块就差不多了。 按键也应该快要完成了。模拟通道基本达到预订的效果,昨天休息把两个CPU的通讯协议文本也给做出来了。根 ...…

查看全部问答>

stm32资料 天下第一贴

今天群里有人发了一个 stm资料链接的帖子 “史上最全stm 资料链接,建议将此网页加入收藏夹 http://www.stmsky.com/bbs/viewthread.php?tid=2103&extra=page%3D1 我一看 果然所说不虚 太强了  研讨会资料  pc软件 &nbs ...…

查看全部问答>

硬件高手请进

  有一个32*16 的FIFO 用于视屏采集 现要用DMA 将FIFO数据 按帧(176*144*2 Bytes) 送到SDRAM ,且DMA一帧只启动一次 FIFO深度 不等于 DMA配置传送的长度 这怎么实现DMA不间断传输啊  ???我是做 驱动的 硬件具体实现很 ...…

查看全部问答>

Rensas M16C 如何导出库文件

如题,想研究下更深入的技术. 为提高代码的安全性,如何将程序封装到库文件中呢? 库接口怎么书写,怎么导出,怎么调用? 请高人指教,最好能提供例子.…

查看全部问答>

驱动开发:PCI moden 驱动,多卡工作,求资料....

moden:Conexant CX11252 我是新手,刚转作驱动.....希望高手能提供一些资料,关于moden驱动的开发,给些例子什么的.我想在VC6.0 ddk 下开发..…

查看全部问答>

wince下SQLite连接语句

谁知道wince下SQLite的链接语句啊?…

查看全部问答>

关于统一编址和独立编址的问题

各位大哥:     我的网卡“资源”选项内容如下:“内存范围  EE000000-EE000FFF, 输入/输出范围 C000-C03F 中断请求 11”     请问这样的状况能断定操作系统采用的分别编址模式吗?…

查看全部问答>

请教STM8S-128K和STM8S-32K的区别

在使用STM8S的FWLIB的时候,发现ADC1和USART2不能编译,察看了一下说明文档,有的能够使用在STM8S-32K中,而有的能使用在STM8S-128K中,怀疑ADC1和USART2就是因为只能使用在STM8S-32K中,所以不能编译了。想问一下,这里的32K和128K的区别在于 ...…

查看全部问答>

修改JOYSTICKMOUSE发送数据,前4字节正确后4错误

各位大大,我想问一下,我想修改JOYSTICK MOUSE程序,源程序是一次发送4字节,我想改为发送8字节,可是改完后抓包发现发送的前4个字节是正确的,后四个自己却是错误的,请问为什么? 修改的地方:SetEPTxCount(ENDP1, 8); UserToPMABufferC ...…

查看全部问答>