首先我们查看寄存器的寄存器文件 以SCIA为例,第一列表示他有13个寄存器可以操作,并且都以SCI开头进行命名;第二列表示地址,即该寄存器所在的位置;后面的占用空间表示这个地址内的数据宽度,通过更改这些寄存器的数据就可以改变相应寄存器的功能。注意寄存器地址非连续,有缺失值。 2.2 使用位定义的方法定义寄存器 2.2.1 位...
C:操作寄存器的位 代码如下: #include<stdio.h>intmain(void){unsignedintregister_value1=0x9F;printf("%#x\t%d\n",register_value1,register_value1);// 清零一位unsignedintregister_value2=0b10011111&~(1<<2);printf("%#x\t%d\n",register_value2,register_value2);// 清零多位unsignedintregist...
对寄存器某几位赋值 寄存器位经过清零操作后就可以方便地对某几位写入所需要的数值了,具体代码如下。 //a = 1000 0011 b //此时对清零后的第 2 组 bit4、bit5 设置成二进制数“01 b ” a |= (1<<2*2); //a = 1001 0011 b,成功设置了第 2 组的值,其它组不变 寄存器某位取反 要对寄存器的...
通过C语言操作寄存器的例子 GPIOB端口的输出数据寄存器ODR的地址是0x40010C0C,ODR寄存器是32bit,低16bit有效,对应着16个外部IO,写0、1对应的IO则输出低、高电平。现在我们通过C语言指针的操作方式,让GPIOB的16个IO都输出高电平,见如下代码。 // GPIOB 端口全部输出 高电平 *(unsigned int*)(0x4001 0C0C) ...
在将寄存器地址强制转化为指针地址后,在前面在加上 * 指向地址存放的值,之后我们直接调用宏定义就可以操作寄存器了,如下 CCM_CCGR0=0xffffffff;CCM_CCGR1=0xffffffff;CCM_CCGR2=0xffffffff;CCM_CCGR3=0xffffffff;CCM_CCGR4=0xffffffff;CCM_CCGR5=0xffffffff;CCM_CCGR6=0xffffffff; ...
使用C语言对寄存器赋值时,常常需要用到C语言的位操作方法。 把寄存器某位清零 假设a代表寄存器,且其中本来已有值。如果要把其中某一位清零且其它位不变,代码如下。 //定义一个变量 a = 1001 1111 b (二进制数) unsigned char a = 0x9f; //对 bit2 清零 ...
本章涉及的代码位于100ASK_STM32F103开发板资料的“5_程序源码\0_单片机开发模式的发展\2_C语言操作寄存器开发\”。 使用C语言之前,需要先设置栈,如代码段 6.3.1 所示,在上电复位后立即设置栈,随后跳入main函数执行。 代码段 6.3.1 设置栈(startup_stm32f10x_hd.s) ...
使用C语言对寄存器赋值时,常常需要用到C语言的位操作方法。 把寄存器某位清零 假设a代表寄存器,且其中本来已有值。如果要把其中某一位清零且其它位不变,代码如下。 //定义一个变量 a = 1001 1111 b (二进制数)unsigned char a = 0x9f;//对 bit2 清零a &= ~(1<<...
寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。 typedef函数指针类型 复制 #include<stdio.h>//函数指针类型别名/* * int 函数返回值 * (int,int)函数参数,两个参数int,int * *PTP_TO_FUNC函数指针,指向函数的指针 ...