这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » imx6ull裸机编程,使用宏定义无法驱动,使用指针就可以驱动

共2条 1/1 1 跳转至

imx6ull裸机编程,使用宏定义无法驱动,使用指针就可以驱动

工程师
2024-11-14 19:54:52     打赏

当我使用宏定义来访问imx6ull的寄存器,控制GPIO5_IO3输出高低电平控制LED时,程序烧录进去后没有反应。但是当我使用指针来访问寄存器,LED可以正常驱动,请问这是什么原因?除了寄存器访问方式外,其余.s启动文件,.lds链接文件,Makefile文件完全相同。

  1. 下面代码使用指针来配置寄存器,程序正常运行。

volatile unsigned int *CCM_CCGR1                              ;volatile unsigned int *IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3;volatile unsigned int *IOMUXC_SNVS_SW_PAD_CTL_PAD_SNVS_TAMPER3;volatile unsigned int *GPIO5_GDIR                             ;volatile unsigned int *GPIO5_DR                               ;// #define CCM_CCGR1    									((volatile unsigned int*)0x020C406C)        //CCGR1// #define IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3      	((volatile unsigned int*)0x02290014)        //IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3// #define IOMUXC_SNVS_SW_PAD_CTL_PAD_SNVS_TAMPER3   		((volatile unsigned int*)0x02290058)    // #define GPIO5_GDIR   									((volatile unsigned int*)0x020AC004)// #define GPIO5_DR     									((volatile unsigned int*)0x020AC000)void delay(volatile unsigned int d){	while(d--);
}int  main(){	unsigned int val;
	
	CCM_CCGR1                               = (volatile unsigned int *)(0x20C406C);
	IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3 = (volatile unsigned int *)(0x2290014);
	IOMUXC_SNVS_SW_PAD_CTL_PAD_SNVS_TAMPER3 = (volatile unsigned int *)(0x2290058);
	GPIO5_GDIR                              = (volatile unsigned int *)(0x020AC000 + 0x4);
	GPIO5_DR                                = (volatile unsigned int *)(0x020AC000);	/* GPIO5_IO03 */
	/* a. 使能GPIO5
	 * set CCM to enable GPIO5
	 * CCM_CCGR1[CG15] 0x20C406C
	 */
	*CCM_CCGR1 = 0xFFFFFFFF;	
	/* b. 设置GPIO5_IO03用于GPIO
	 * set IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3
	 *      to configure GPIO5_IO03 as GPIO
	 * IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3  0x2290014
	 * bit[3:0] = 0b0101 alt5
	 */
	val = 5;
	*IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3 = val;
	*IOMUXC_SNVS_SW_PAD_CTL_PAD_SNVS_TAMPER3 = 0x10b0;	
	/* c. 设置GPIO5_IO03作为output引脚
	 * set GPIO5_GDIR to configure GPIO5_IO03 as output
	 * GPIO5_GDIR  0x020AC000 + 0x4
	 * bit[3] = 0b1
	 */
	*GPIO5_GDIR = 0xFFFFFFFF;	while(1)
	{
		*GPIO5_DR = 0x00000000; //输出低电平,点亮LED
		delay(1000000);
		*GPIO5_DR = 0xFFFFFFFF; //输出高电平,关闭LED
		delay(1000000);
	}					
	return 0;
}
  1. 下面代码使用宏定义配置寄存器,程序无反应。

/*
// volatile unsigned int *CCM_CCGR1                              ;
// volatile unsigned int *IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3;
// volatile unsigned int *IOMUXC_SNVS_SW_PAD_CTL_PAD_SNVS_TAMPER3;
// volatile unsigned int *GPIO5_GDIR                             ;
// volatile unsigned int *GPIO5_DR                               ;
*/#define CCM_CCGR1 ((volatile unsigned int*)0x020C406C)        #define IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3 ((volatile unsigned int*)0x02290014)        #define IOMUXC_SNVS_SW_PAD_CTL_PAD_SNVS_TAMPER3 ((volatile unsigned int*)0x02290058)    #define GPIO5_GDIR ((volatile unsigned int*)0x020AC004)#define GPIO5_DR ((volatile unsigned int*)0x020AC000)void delay(volatile unsigned int d){	while(d--);
}int  main(){	unsigned int val;	
	// CCM_CCGR1                               = (volatile unsigned int *)(0x20C406C);
	// IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3 = (volatile unsigned int *)(0x2290014);
	// IOMUXC_SNVS_SW_PAD_CTL_PAD_SNVS_TAMPER3 = (volatile unsigned int *)(0x2290058);
	// GPIO5_GDIR                              = (volatile unsigned int *)(0x020AC000 + 0x4);
	// GPIO5_DR                                = (volatile unsigned int *)(0x020AC000);

	/* GPIO5_IO03 */
	/* a. 使能GPIO5
	 * set CCM to enable GPIO5
	 * CCM_CCGR1[CG15] 0x20C406C
	 * bit[31:30] = 0b11
	 */
	*CCM_CCGR1 = 0xFFFFFFFF;	
	/* b. 设置GPIO5_IO03用于GPIO
	 * set IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3
	 *      to configure GPIO5_IO03 as GPIO
	 * IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3  0x2290014
	 * bit[3:0] = 0b0101 alt5
	 */
	val = 5;
	*IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3 = val;
	*IOMUXC_SNVS_SW_PAD_CTL_PAD_SNVS_TAMPER3 = 0x10b0;	
	/* c. 设置GPIO5_IO03作为output引脚
	 * set GPIO5_GDIR to configure GPIO5_IO03 as output
	 * GPIO5_GDIR  0x020AC000 + 0x4
	 * bit[3] = 0b1
	 */
	*GPIO5_GDIR = 0xFFFFFFFF;	while(1)
	{

		*GPIO5_DR = 0x00000000;//输出低电平,点亮LED
		delay(1000000);
		*GPIO5_DR = 0xFFFFFFFF;//输出高电平,熄灭LED
		delay(1000000);
	}					
	return 0;
}





关键词: imx6ull     GPIO5     CCGR1    

助工
2024-11-14 19:55:08     打赏
2楼

您在使用宏定义和指针访问寄存器时遇到了不同的结果。这个问题可能是由于宏定义和指针访问寄存器的方式不同导致的。以下是一些可能的原因和解决方法:

1. 宏定义和指针访问寄存器的寻址方式不同:宏定义可能会将寄存器地址转换为一个常量,而指针访问寄存器则是通过间接寻址的方式。这可能导致宏定义访问寄存器时出现问题。解决方法是确保宏定义和指针访问寄存器的寻址方式一致。

2. 编译器优化:编译器可能会对宏定义进行优化,导致宏定义访问寄存器时出现问题。解决方法是关闭编译器优化或者使用volatile关键字来告诉编译器不要优化这些宏定义。

3. 宏定义和指针访问寄存器的类型不同:宏定义可能会将寄存器地址转换为一个整型,而指针访问寄存器则是通过指针类型。这可能导致宏定义访问寄存器时出现问题。解决方法是确保宏定义和指针访问寄存器的类型一致。

以下是一些建议:

1. 使用volatile关键字:在宏定义和指针访问寄存器时,使用volatile关键字来告诉编译器不要优化这些访问。

```c
#define CCM_CCGR1 (*(volatile unsigned int *)0x020C4060)
#define IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3 (*(volatile unsigned int *)0x020C01B0)
#define IOMUXC_SNVS_SW_PAD_CTL_PAD_SNVS_TAMPER3 (*(volatile unsigned int *)0x020C01B4)
#define GPIO5_GDIR (*(volatile unsigned int *)0x0209C000)
#define GPIO5_DR (*(volatile unsigned int *)0x0209C004)
```

2. 检查寄存器地址:确保宏定义和指针访问寄存器的地址正确。

3. 关闭编译器优化:在编译时,关闭编译器优化选项,例如使用`-O0`选项。

4. 检查寄存器访问权限:确保您的程序具有访问这些寄存器的权限。在某些情况下,您可能需要配置MMU或者使用特权模式来访问这些寄存器。


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]