题目一:如何配置寄存器
(1)通过手册:
一、找到要操作IO口的基地址
二、找到端口输入寄存器的地址偏移
三、找到输入数据寄存器中具体的端口数据位
(2)操作IO口
一、找到基地址
二、找到偏移地址,主要是以下几个寄存器:
配置时钟使能:------RCC_APB2ENR
端口配置高/低寄存器:CNF位、MODE位 -----GPIOx_CRH/GPIOx_CRH
端口输出数据寄存器: ----------GPIOx_ODR
int main(void)
{
unsigned int *pRCC_APB2ENR = (unsigned int *)0x40021018;
unsigned int *pGPIOB_CRH = (unsigned int *)0x40010c04;
unsigned int *pGPIOB_ODR = (unsigned int *)0x40010c0c;
*pRCC_APB2ENR = 0x00000008;
*pGPIOB_CRH = 0x44444443;
*pGPIOB_ODR = 0x00000000;
return 0;
}
C语言总是从main函数开始执行。
定义几个指针,指向刚刚看到的地址。对于编译器来说,它并不知道0x40021018代表的是数据还是指针,所以用(unsigned int *)作强制的类型转换,告诉编译器0x40021018是个指针。指针可以理解为地址。操作指针,把这些地址存放的值修改。
最后的return,代表main函数结束。
unsigned int *pGPIOB_IDR = (unsigned int *)0x40010C08;
unsigned char PB3 = *pGPIOB_IDR & 0x8;//取出从右往左数的第4位
总结:
(1)寄存器就是与CPU最直接打交道的存储空间。
(2)每种外设的寄存器都是和总线连接的,总线处理数据的宽度,决定了寄存器的大小,每种寄存器都是有地址范围的,我们可以在数据手册中查看这个基地址,就像是查字典的时候,先查偏旁
(3)根据具体的外设,查看需要配置什么样的寄存器。然后通过数据手册查看它的地址偏移,复位值进行配置。
(4)计算出上面要用到的寄存器地址,赋值个指针,直接操作就行。
(5)寄存器中的寻位写法:
unsigned char PB3 = *pGPIOB_IDR & 0x8;//取出从右往左数的第4位
这里就取出了GPIOB_IDR寄存器的第4位的值。
(6)寄存器中的置1/0的写法:将变量a的第三位置位或者清零。
用 #defines 和 bit masks 操作。这是一个有极高可移植性的方法,是应该被用到的方法。最佳的解决方案如下:
#define BIT3 (0x1<<3)
static int a;
void set_bit3(void)
{
a |= BIT3;
}
void clear_bit3(void)
{
a &= ~BIT3;
}
题目二:.和source 执行命令的区别
./
: ./xxx.sh 此种方式执行shell脚本 只需要有可执行权限
source
: source xxx.sh此种方式用于修改了配置文件,需要立马生效,而不必重启计算机
区别
调用./xxx.sh来执行shell是在一个子shell里运行的,所以执行后,结果并没有反应到父shell里,但是source不同他就是在本shell中执行的,所以能够看到结果。
eg:
#!bin/bash
export aa=11
./1.sh echo aa显示为空 source 1.sh echo aa显示为11
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)