STM32初学笔记(四)GPIO端口操作与仿真 上篇文章中使用库函数实现一个简单的功能:读取GPIOA端口的高8位引脚的电平,对相应的低8位(0-8,1-9,...)进行置位1和复位0操作 使对应引脚电平相同。本篇文章通过操作端口寄存器实现这个功能,感受一下两种方法的差异。 本篇文章的主要内容: 1、代码实现 2、keil5软件仿真 1、代码实现 首先设置引脚的工作模式,然后通过if语句判断输入引脚电平,设置相应的输出。以第10行和第11行为例,在判断中,通过与运算判断出第8位为1还是0,逻辑与运算将其余位均置0;第8位为1则第0位通过逻辑或运算置1,不影响其他位的输出,第8位为0则通过取反后再进行逻辑与运算将第0位置0,不影响其他位的输出。 这两句基本的逻辑运算要熟练掌握。在开发一个嵌入式硬件系统时,经常需要对一些外围硬件的状态标志位进行判断并作相应处理,就可能会用到这些逻辑运算。 - int main(void)
- {
- //1、GPIOA.0-GPIOA.7输出模式,GPIOA.8-GPIOA.15输入模式
- //2、GPIOA.x = GPIOA.(x+8)
- GPIOA->CRL = 0x33333333;
- GPIOA->CRH = 0x44444444;
- while (1)
- {
- if ((GPIOA->IDR & 0x0100) == 0x0100) GPIOA->ODR = GPIOA->ODR | 0x01;
- else GPIOA->ODR = GPIOA->ODR & (~0x01);
-
- if ((GPIOA->IDR & 0x0200) == 0x0200) GPIOA->ODR = GPIOA->ODR | 0x02;
- else GPIOA->ODR = GPIOA->ODR & (~0x02);
-
- if ((GPIOA->IDR & 0x0400) == 0x0400) GPIOA->ODR = GPIOA->ODR | 0x04;
- else GPIOA->ODR = GPIOA->ODR & (~0x04);
-
- if ((GPIOA->IDR & 0x0800) == 0x0800) GPIOA->ODR = GPIOA->ODR | 0x08;
- else GPIOA->ODR = GPIOA->ODR & (~0x08);
-
- if ((GPIOA->IDR & 0x1000) == 0x1000) GPIOA->ODR = GPIOA->ODR | 0x10;
- else GPIOA->ODR = GPIOA->ODR & (~0x10);
-
- if ((GPIOA->IDR & 0x2000) == 0x2000) GPIOA->ODR = GPIOA->ODR | 0x20;
- else GPIOA->ODR = GPIOA->ODR & (~0x20);
-
- if ((GPIOA->IDR & 0x4000) == 0x4000) GPIOA->ODR = GPIOA->ODR | 0x40;
- else GPIOA->ODR = GPIOA->ODR & (~0x40);
-
- if ((GPIOA->IDR & 0x8000) == 0x8000) GPIOA->ODR = GPIOA->ODR | 0x80;
- else GPIOA->ODR = GPIOA->ODR & (~0x80);
- }
- return 0;
- }
复制代码
2、keil5软件仿真 首先对项目进行编译(build或rebuild),如果编译没有错误,点击调试按钮进入调试状态。点击搜索按钮弹出搜索窗口可以搜索某个变量或函数的在那些位置使用,对于代码量较大的项目,可以设置断点进行调试,对于调试好的程序可以借助仿真器等将程序下载到单片机中。 进入调试状态后,选择Peripherals->General PurposeI/O->GPIOA打开监测窗口。在窗口中可以看到窗口的工作模式、寄存器值和引脚状态,这里高8位设置为输入状态,所以通过点击高8位对应的方格可以设置引脚电平,方格内出现“√”表示为高电平。 如果程序正确,在全速运行状态下,高8位电平和相应的低8位电平是是保持相同的。如果不正确就需要进行调试,在调试状态下会有调试工具栏,可以进行复位、全速运行、单步运行等。 文章出处: 机械智者
|
想问一下,我的General PurposeI/O->GPIOA监测窗口没有最下面的Pins是为什么
我知道了,没有用软件仿真