OK6410裸机程序(一)——GPIO(LED)

            本人入手OK6410-A开发板,已经有一段时间。因为去年工作忙一直没时间来折腾这个东东。现在工作也有点空闲时间,又想开始折腾一下了。

            我给自己定的最终目标是:linux驱动开发。有点经验的人都知道,驱动开发对硬件知识的掌握也很重要,所以本人确定就先从裸板程序开始学习。

我将借用这个平台来记录我学习的过程中的问题和经验。好了话不多说,现在就开始第一课。

       OK6410裸机程序(一)——GPIO(LED)

              这是一个非常简单的程序,这个程序就好像我们在学习C语言所写的“HELLO WORLD”程序。都会用它来做为C语言的入门程序。

              GPIO意思就是通用输入、输出端口,通俗地说,就是一些引脚,可以通过它们输入出高低电平。或者通过它们读入引脚状态——高低电平。

              S3C6410共有187个多功能的I/O端口。共分布在17个端口上(GPA、GPB……GPQ)。即然

一个引脚可以用于输入、输出或其他功能,那么一定有寄存器用来选择这些功能;对于输入,一定可以

通过读取某个寄存器来确定引脚的电平是高是低;对于输出,一定可以通过写入某个寄存器来让这个引脚

输出高电平或低电平;对于其它功能,则另有寄存器来控制它了。

                对于这几组GPIO引脚,它们的寄存器是相似的,普通I/O功能通常是由三个寄存器来完成:

                GPxCON:用于选择引脚功能。

                GPxDAT:用于读写引脚数据。

                GPxUP:用于确定是否使用内部上拉电阻。(x表示:A、B、C……Q)

下面就于端口A为例:如下图所示,一个端口是由5个32位的寄存器控制。每个寄存器都有自己地址。一个端口有八个引脚,也就是寄存器每四位控制一个引脚。

               

如图下面每个引脚的配置:

                

                                                                                                                    图2    引脚配置

数据寄存器GPADAT

             

上下拉电阻设置寄存器GPAPUD

                   

我们在对GPIO操作的时候,第一步就是对这三个寄存器进行设置。配置相应的功能、输入、输出模式的选择。是否开启上下拉电阻功能。

下面我们就与点亮OK6410板上的第一个LED灯为例。

首先,来看一下OK6410开发板的原理图。LED灯的硬件是接在CPU上的个哪个引脚。

                                                                                        图:底板原理图

                                           图:核心板原理图部分

结合核心板与底板原理图,可以看出位号LED1的LED灯(我们要点亮的灯),是阴极通过电阻接到了CPU上的GPM0引脚上。阳极直接接到了电源3.3V。也就是说:我们要点亮LED1这个灯,就要使CPU上的GPM0引脚输出低电平。才能点亮LED。

接下来,我们来看看这个程序 (请在linux环境下用交叉工具执行)。

/*GNU 汇编,设置CPU必要的硬件环境*/
 
.globl _start  /*设置全局标号*/
_start:

/* 告诉CPU外设的基地址,对协处理器CP15操作命令*/    
/* Peri port setup */
    ldr r0, =0x70000000
    orr r0, r0, #0x13
    mcr p15,0,r0,c15,c2,4       @ 256M(0x70000000-0x7fffffff)
    
/*关闭看门狗*/	
	ldr r0, =0x7E004000
	mov r1, #0
	str r1, [r0]

	/* 设置堆栈*/
	ldr sp, =8*1024
	bl Main    /*转到C语言执行*/
halt:
	b halt	
 
/*************************************************************************/
/*程序名称:点亮LED灯 C程序
/************************************************************************/
 
volatile unsigned long *GPMCON = (volatile unsigned long *)0x7F008820;
volatile unsigned long *GPMDAT = (volatile unsigned long *)0x7F008824;



void Main()
{
	GPMCON |= (1 << 0);//设置成输出
	while(1)
		{
			GPMDAT &= ~(1 << 0); //第0位置0,即输出为低,LED亮
		}
}


                                         


### 将RT-Thread操作系统移植到GD32微控制器上的方法 #### 1. RT-Thread简介 RT-Thread是款开源的嵌入式实时多线程操作系统,支持多种硬件平台。其主要分为三个版本:标准版、Nano版以及Smart版[^4]。 #### 2. 移植准备工作 为了顺利将RT-Thread移植至GD32微控制器上,需完成如下准备事项: - **下载源码** 需要根据目标需求选择合适的RT-Thread版本并下载对应的源码包。对于Nano版本,可以从GitHub仓库获取最新的`rtthread-nano`源码[^2];而对于标准版本,则推荐从Gitee官方发布页面下载稳定版本(如v4.1.0)[^3]。 - **创建裸机工程** 使用Keil工具链为特定型号的GD32单片机创建个基础的裸机项目。如果已有可正常运行的基础工程则可以直接利用该资源来减少重复劳动量。 #### 3. BSP配置与调整 针对不同系列的GD32芯片,具体操作略有差异: - 对于GD32F10x系列: - 参考已有的教程文档设置好相应的外设驱动程序,并确保初始化代码能够正确执行。 - 对于更高端的GD32H7xx系列: - 找到匹配的目标BSP模板(例如gd32h759i-start),将其复制到指定目录下并对命名做适当修改以便区分不同的处理器架构。 #### 4. 编译链接环境搭建 在完成了上述步骤之后,还需要进步完善编译器选项设定等工作以适应实际应用场景的要求。这通常涉及到定义宏指令、路径包含关系等方面的细致调节过程。 ```c // 示例:简单的LED闪烁测试函数实现 #include "rtthread.h" static void led_thread_entry(void* parameter) { while (1) { rt_kprintf("Led on\n"); /* Turn LED ON */ GPIO_SetBits(GPIOC, GPIO_Pin_13); rt_thread_delay(RT_TICK_PER_SECOND); // Delay one second rt_kprintf("Led off\n"); /* Turn LED OFF */ GPIO_ResetBits(GPIOC, GPIO_Pin_13); rt_thread_delay(RT_TICK_PER_SECOND); // Delay another second } } int main(void) { rt_err_t result; /* Initialize the system clock and other peripherals here */ /* Create a thread to blink an LED */ result = rt_thread_create("led", led_thread_entry, RT_NULL, 512, RT_THREAD_PRIORITY_MAX / 2, 20); if(result == RT_EOK){ rt_thread_startup("led"); } return RT_EOK; } ``` 以上代码片段展示了个基本的应用场景——通过创建独立的任务线程控制外部设备状态变化的过程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值