搜索
查看: 1620|回复: 0

[分享] STM32初学笔记(四)GPIO端口操作与仿真

[复制链接]

该用户从未签到

193

主题

194

帖子

0

蝴蝶豆

金牌会员

最后登录
2021-3-12
发表于 2021-3-11 13:12:22 | 显示全部楼层 |阅读模式
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,不影响其他位的输出。
这两句基本的逻辑运算要熟练掌握。在开发一个嵌入式硬件系统时,经常需要对一些外围硬件的状态标志位进行判断并作相应处理,就可能会用到这些逻辑运算。
  1. int main(void)
  2. {
  3.   //1、GPIOA.0-GPIOA.7输出模式,GPIOA.8-GPIOA.15输入模式
  4.   //2、GPIOA.x = GPIOA.(x+8)
  5.   GPIOA->CRL = 0x33333333;
  6.   GPIOA->CRH = 0x44444444;

  7.   while (1)
  8.   {
  9.       if ((GPIOA->IDR & 0x0100) == 0x0100)   GPIOA->ODR = GPIOA->ODR | 0x01;
  10.       else                                   GPIOA->ODR = GPIOA->ODR & (~0x01);
  11.    
  12.     if ((GPIOA->IDR & 0x0200) == 0x0200)   GPIOA->ODR = GPIOA->ODR | 0x02;
  13.       else                                   GPIOA->ODR = GPIOA->ODR & (~0x02);
  14.    
  15.     if ((GPIOA->IDR & 0x0400) == 0x0400)   GPIOA->ODR = GPIOA->ODR | 0x04;
  16.       else                                   GPIOA->ODR = GPIOA->ODR & (~0x04);
  17.    
  18.     if ((GPIOA->IDR & 0x0800) == 0x0800)   GPIOA->ODR = GPIOA->ODR | 0x08;
  19.       else                                   GPIOA->ODR = GPIOA->ODR & (~0x08);
  20.    
  21.     if ((GPIOA->IDR & 0x1000) == 0x1000)   GPIOA->ODR = GPIOA->ODR | 0x10;
  22.       else                                   GPIOA->ODR = GPIOA->ODR & (~0x10);
  23.    
  24.     if ((GPIOA->IDR & 0x2000) == 0x2000)   GPIOA->ODR = GPIOA->ODR | 0x20;
  25.       else                                   GPIOA->ODR = GPIOA->ODR & (~0x20);
  26.    
  27.     if ((GPIOA->IDR & 0x4000) == 0x4000)   GPIOA->ODR = GPIOA->ODR | 0x40;
  28.       else                                   GPIOA->ODR = GPIOA->ODR & (~0x40);
  29.    
  30.     if ((GPIOA->IDR & 0x8000) == 0x8000)   GPIOA->ODR = GPIOA->ODR | 0x80;
  31.       else                                   GPIOA->ODR = GPIOA->ODR & (~0x80);   
  32.   }  
  33.   return 0;
  34. }
复制代码

2、keil5软件仿真
首先对项目进行编译(build或rebuild),如果编译没有错误,点击调试按钮进入调试状态。点击搜索按钮弹出搜索窗口可以搜索某个变量或函数的在那些位置使用,对于代码量较大的项目,可以设置断点进行调试,对于调试好的程序可以借助仿真器等将程序下载到单片机中。
3.1.png
进入调试状态后,选择Peripherals->General PurposeI/O->GPIOA打开监测窗口。在窗口中可以看到窗口的工作模式、寄存器值和引脚状态,这里高8位设置为输入状态,所以通过点击高8位对应的方格可以设置引脚电平,方格内出现“√”表示为高电平。
3.2.png
如果程序正确,在全速运行状态下,高8位电平和相应的低8位电平是是保持相同的。如果不正确就需要进行调试,在调试状态下会有调试工具栏,可以进行复位、全速运行、单步运行等。
3.3.png
文章出处: 机械智者

回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-27 01:48 , Processed in 0.138735 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表