问题描述:
1、看下面两个链接,讲的都是uboot下writel对特定寄存器设置输入输出或者高低电平
https://blog.csdn.net/qinglongzhan/article/details/129836675
https://blog.csdn.net/qq_45147279/article/details/129007286
2、问题
不理解下面两句是怎样得到的,请求详细解释(分别对应上面2篇文章)
【1】writel(0xffff4080, 0xFDD6000C); //设置输出
writel(0xffff4081, 0xFDD60004); //设置高电平
【2】writel(0x00400040,0xfe77000C);//set output mode
writel(0x00400040,0xfe770004);//
3、举一反三
比如要设置GPIO0_C6 GPIO2_B3 GPIO2_B4为输出高电平,应该怎样写?
【以下回答由 GPT 生成】
对于链接1中的代码:
writel(0xffff4080, 0xFDD6000C); //设置输出
writel(0xffff4081, 0xFDD60004); //设置高电平
这两行代码是在uboot下使用writel函数设置寄存器的值来实现GPIO控制。具体解释如下:
writel(value, address)
用于将value
写入到address
地址的32位寄存器中。在这里,0xFDD6000C
和0xFDD60004
是寄存器的物理地址,0xffff4080
和0xffff4081
是对应的要写入寄存器的值。
根据链接1中的说明,这两行代码的目的是设置GPIOA29(GPIO0_C5)的配置寄存器。第一行代码将0xffff4080
写入到0xFDD6000C
地址,即将GPIOA29设置为输出模式;第二行代码将0xffff4081
写入到0xFDD60004
地址,即将GPIOA29设置为高电平输出。
对于链接2中的代码:
writel(0x00400040, 0xfe77000C);//set output mode
writel(0x00400040, 0xfe770004);
类似地,这两行代码也是在uboot下使用writel函数设置寄存器的值来实现GPIO控制。
这里,0xfe77000C
和0xfe770004
是寄存器的物理地址,0x00400040
是对应的要写入寄存器的值。
根据链接2中的说明,这两行代码的目的是设置GPIOB0(GPIO2_A6)的配置寄存器。第一行代码将0x00400040
写入到0xfe77000C
地址,即将GPIOB0设置为输出模式;第二行代码将0x00400040
写入到0xfe770004
地址,即将GPIOB0设置为高电平输出。
现在,如果您想要设置GPIO0_C6、GPIO2_B3和GPIO2_B4为输出高电平,可以按照如下代码编写:
// 设置GPIO0_C6为输出模式
writel(0xffff4080, 0xFDD60078);
// 设置GPIO0_C6为高电平
writel(0xffff4081, 0xFDD60070);
// 设置GPIO2_B3为输出模式
writel(0x00400040, 0xfe7100D0);
// 设置GPIO2_B3为高电平
writel(0x00400041, 0xfe7100C8);
// 设置GPIO2_B4为输出模式
writel(0x00400040, 0xfe7100D8);
// 设置GPIO2_B4为高电平
writel(0x00400041, 0xfe7100D0);
以上代码设置GPIO0_C6、GPIO2_B3和GPIO2_B4为输出模式,然后将其设置为高电平输出。具体的物理地址和写入的值根据您的硬件平台和手册的定义进行适配。
希望以上解答能对您有所帮助,如有疑问请及时反馈。