`
coolerbaosi
  • 浏览: 734997 次
文章分类
社区版块
存档分类
最新评论

往寄存器的相应位写值的函数

 
阅读更多

/*s3c2410_gpio_cfgpin()函数*/
/*在寄存器的相应位添加功能值的函数*/
/*这个函数非常重要*/
/*比如,在寄存器GPH的[13:12]位添加10,就要用到此函数*/

/*[13:12]两位共有4种状态,10是S3C2410_GPH6_TXD2,00是S3C2410_GPH6_INP,
01是S3C2410_GPH6_OUTP,11是S3C2410_GPH6_nRTS1*/

/*
#define S3C2410_GPIO_BASE(pin) ((((pin) & ~31) >> 1) + S3C24XX_VA_GPIO)

#define S3C24XX_VA_GPIO S3C2410_ADDR(0x00E00000) /*00E0 0000 + F000 0000= F0E0 0000*/

#define S3C2410_ADDR(x) (0xF0000000 + (x))
#define S3C2410_GPIO_BANKB (32*1)

#define S3C2410_GPIO_OFFSET(pin) ((pin) & 31)

#define local_irq_save(flags) do { (flags) = swpipl(IPL_MAX); barrier(); } while(0)
#define local_irq_restore(flags) do { barrier(); setipl(flags); barrier(); } while(0)
*/


void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function)
{
/*基地址的获取*/
/*11111 ~11111=1110 0000 (pin) & ~31 即是屏蔽掉末5位,保留其余位*/
/*然后右移1位*/
/*为什么要右移一位呢?*/
/*因为偏移值只需要占用4位就可以了,能表示16以内的就行,可以一次改变2位寄存器的值*/

/*最终就是找到寄存器的基地址*/

void __iomem *base = S3C2410_GPIO_BASE(pin);

/*S3C2410_GPH6 = 32*7+6 = 230 = 1110 0110*/
/*S3C2410_GPH6 & ~31 = 1110 0000 = 224 = 32*7 */
/*(S3C2410_GPH6 & ~31) >> 1 = 0111 0000 = 112 = 16*7 = 0x70*/

/*((S3C2410_GPH6 & ~31) >> 1) + S3C2410_VA_GPIO = 0xF0E0 0000 + 0x70 = 0xF0E0 0070 */

/*也就是寄存器GPH的地址为0xF0E0 0070*/
/*而其偏移值6,表示要对[13:12]两位赋值*/

/*掩码*/

unsigned long mask;

/*控制字*/

unsigned long con;

/*标志*/

unsigned long flags;

/*掩码的设置*/
/*bankA是一位一位的改变寄存器的值*/
/*而之后的bank则是两位两位地改变寄存器的值*/
/*这些都是通过设置掩码来实现的*/
/*如bankA的掩码设置可以在[31:0]的任一位设置为1*/
/*而其余bank则只能在偶数位开始的两位设置为1*/


if (pin < S3C2410_GPIO_BANKB) /*如果pin < 32,即为bankA*/
{
mask = 1 << S3C2410_GPIO_OFFSET(pin); /*则只保留末5位*/
/*32,很值得推敲的数字,即为寄存器的32位,而S3C2410_GPIO_OFFSET(pin)表示寄存器的哪一位*/
/*如果是0 0110,就表示是[6]位*/
}
else /*pin >= 32,bankH=32*7=224 */
{
mask = 3 << S3C2410_GPIO_OFFSET(pin)*2; /*掩码,一次处理两位*/

/*S3C2410_GPIO_OFFSET(230) = 6 */
/* 6*2 = 12 */
/* 3 << 12 即 [13:12] = 11 */
/*就是处理两位*/
}

/*中断保留*/

local_irq_save(flags);

/*读取寄存器的值*/
/*如读取寄存器GPH的值*/

con = __raw_readl(base + 0x00);

/*掩码处理*/

con &= ~mask; /*把[13:12]位置0,其余位保留*/
/*就是空出[13:12]位,好用来添加功能值*/

/*添加功能*/

con |= function; /*把[13:12]位添加为10*/
/*可见,bankB以后的寄存器,都是一次处理两位*/
/*写入寄存器*/

__raw_writel(con, base + 0x00); /*往bankH寄存器里写值*/

/*中断恢复*/

local_irq_restore(flags);
}

分享到:
评论

相关推荐

    论文研究-基于线性反馈移位寄存器和组合猫映射的伪随机序列生成方法.pdf

    应用选定的系数矩阵进行迭代计算产生相应的混沌序列, 将其二值化后作为反馈值与LFSR的反馈值进行异或运算, 运算结果作为LFSR的最终反馈值, 实现对LFSR生成序列的随机扰动。通过实验对生成序列的性能进行了分析, ...

    DSP28335串口SCI中断接收,printf函数重定位/自定义源码

    接着,配置了 SCI 控制寄存器和控制寄存器1和寄存器2,以使得 SCI-A 能够启用发送和接收功能,并设置相应的控制位。最后,通过scihbaud和scilbaud设置了高位波特率寄存器和低位波特率寄存器,最终通过将控制寄存器1...

    了解4位函数发生器74LS181的组合功能,熟悉运算器执行算术操作和逻辑操作的具体实现过程

    了解 4 位函数发生器 74LS181 的组合功能,熟悉运算器执行算术操作和逻辑操作的具体实现过程 本实验报告旨在介绍 4 位函数发生器 74LS181 的组合功能,了解运算器执行算术操作和逻辑操作的具体实现过程。实验使用 ...

    STM32调试报告.docx

    在修改 ODR 时,为了确保对端口 6 的修改不会影响到其他端口的输出,需要对端口的原始数据进行保存,之后再对端口 6 的值进行修改,最后再写入寄存器(即读-改-写形式改变位的状态)。而对 BSRR 的操作,是写 1 有效,...

    方波/三角波/正弦波信号发生器(ICL8038函数发生器

    本设计是利用键盘设置相应的频率值, 根据所设置频率段选择相应电容, 经计算获得相应数字量送数字电位器实现D/A 转换, 同时与参考电压( 本例为5.5V) 相加后形成数控调压去控制ICL8038 第8 脚, 这样即可由ICL8038 实现...

    s3c2410 中断异常处理

    对于IRQ,在跳转函数中读取INTPND寄存器或INTOFFSET寄存器的值来确定中断源,然后调用具体的处理函数。对于FIQ,因为只有一个中断可以设为FIQ,无须判断中断源。 最后,需要设置CPSR寄存器中的F-bit(对于FIQ)或I...

    STM32F4 DSP和标准外设库(最终版1.9.0)

    STM32固件库是官方推出来的对底层寄存器进行操作的函数库,使用它编写程序时不用考虑怎么操作寄存器,只需要调用库函数就可以实现相应功能。方便使用STM32芯片进行开发的人员,使开发工作更简单快捷,增强代码可读性...

    C语言程序设计标准教程

    发生函数调用时, 主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。  函数的形参和实参具有以下特点: 1.形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的...

    Mersenne Twister随机数产生

    initGenerator.m: initGenerator函数,用于初始化随机序列的长度和值 generateNum.m: generateNum函数,当index为0时被调用,用于创建624维的移位寄存器数组 extractNum.m: extractNum函数,根据index当前值选择...

    STC系列两路AD转换汇编程序.pdf

    P1ASF寄存器用于控制P1口中的相应位作为模拟功能使用时的控制寄存器。例如,P1.6和P1.7可以作为A/D输入。 2. 汇编语言的应用 在汇编语言中,我们可以使用各种指令来控制微控制器的行为。例如,MOV指令用于将数据从...

    modbus通信协议

    CRC是先调入一值是全“1”的16位寄存器,然后调用一过程将消息中连续的8位字节各当前寄存器中的值进行处理。仅每个字符中的8Bit数据对CRC有效,起始位和停止位以及奇偶校验位均无效。 CRC产生过程中,每个8位字符都...

    嵌入式系统设计实验五.doc

    往该地址中写入相应的数据,即可实现功能及数据配置。 GPACON (Ox56000000)/ /Port A control GPADAT (Ox56000004) //Port A data GPBCON (Ox56000010)//Port B control GPBDAT (Ox56000014)/ /Port B data GPBUP(Ox...

    算法心得:高效算法的奥秘(原书第2版).[美]Henry S.Warren,Jr(带详细书签).pdf

    2.20.1 交换寄存器中相应的位段 45 2.20.2 交换同一寄存器内的两个位段 46 2.20.3 有条件的交换 47 2.21 在两个或两个以上的值之间切换 47 2.22 布尔函数分解公式 50 2.23 实现16种二元布尔操作 51 2.24 习题...

    浅析C语言中嵌入汇编语言的程序实现.pdf

    这种方法可以根据完成任务的需要划分成多个独立的模块,每个模块以函数或过程的形式体现,然后根据具体模块的特点采用相应的语言编写。 在混合编程中需要注意的一些技术问题包括:嵌入的汇编指令使用换行符结束,而...

    A way to locate Cortex-M hard fault

    在上面的代码中,我们首先使用汇编语言来获取寄存器的值,然后将这些值传递给C函数hard_fault_handler_c(),并在其中打印这些寄存器的值。这样我们就可以根据这些寄存器的值来定位Hard Fault错误的位置。 在实际...

    MSP430学习笔记

    然后系统总中断允许位SR.GIE复位,相应的中断向量值装入PC,程序从这个地址继续执行。 C语言编程 在C语言编程中,我们可以使用MSP430x14x.h头文件,因为常用149;其他型号可自己修改。接着就是函数和变量的声明,...

    汇编语言程序设计 第二版

     在内容组织上,把学习高级语言的习惯和汇编语言的特点相结合,按“硬件资源—变量定义一指令系统—编程”的顺序安排相应的内容。结合MASM V6.1x的编程环境,使汇编语言源程序具有一定的高级语言特点和结构。书中用...

    开源一STM32项目,CAN,UART,Input检测 原创相对高效性能与代码重用平衡思路,可直接做工程模板

    当然这种处理方式,也适合于做为uCOS中的底层驱动文件,已留有CAN_QUE_OS_ENTER_CRITICAL()的宏定义,更改为相应的OS开关中断函数基本即可用于uCOS。 附 CAN总线利用率及最坏时间估算.xls, 根据应用层估计的数据...

    单片机课程知识点总结.docx

    输出方式: 单片机的端口可以输出高低电平,由图 31可以知道,实际输出的高低电平可以通过向锁存器写值即可,也即给单片机相应的位赋值,另外在赋值时既可以按位赋值也可以按字节赋值。但是由于单片机直接驱动负载...

    通信系统专业课程设计.doc

    因此这个N阶移位寄存器的 反馈函数为: F(X1,X2,…,Xn)= in=1CiXi 特征多项式是: f(x)= in=1CiXi=C0+C1X1+C2X2+…+CnXn 特征多项式中的Xi(i=0,1,2...n)与移位寄存器的第i个触发器相对应。 c0 c1 c2 c3 cn-1 cn ...

Global site tag (gtag.js) - Google Analytics