历史上的今天
今天是: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);
}
}
这种方式下,通过标示符可以知道对应哪个寄存器,方便编程和程序阅读。
史海拾趣
|
波形显示界面 引导界面 下面把波形和参数的显示添加进去就可以了,另外一个网友已经做好了,只要把代码合起来这一块就差不多了。 按键也应该快要完成了。模拟通道基本达到预订的效果,昨天休息把两个CPU的通讯协议文本也给做出来了。根 ...… 查看全部问答> |
|
今天群里有人发了一个 stm资料链接的帖子 “史上最全stm 资料链接,建议将此网页加入收藏夹 http://www.stmsky.com/bbs/viewthread.php?tid=2103&extra=page%3D1 我一看 果然所说不虚 太强了 研讨会资料 pc软件 &nbs ...… 查看全部问答> |
|
如题,想研究下更深入的技术. 为提高代码的安全性,如何将程序封装到库文件中呢? 库接口怎么书写,怎么导出,怎么调用? 请高人指教,最好能提供例子.… 查看全部问答> |
|
驱动开发:PCI moden 驱动,多卡工作,求资料.... moden:Conexant CX11252 我是新手,刚转作驱动.....希望高手能提供一些资料,关于moden驱动的开发,给些例子什么的.我想在VC6.0 ddk 下开发..… 查看全部问答> |
|
各位大哥: 我的网卡“资源”选项内容如下:“内存范围 EE000000-EE000FFF, 输入/输出范围 C000-C03F 中断请求 11” 请问这样的状况能断定操作系统采用的分别编址模式吗?… 查看全部问答> |
|
在使用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 ...… 查看全部问答> |




