【STM32最强F7探索大冒险】GPIO的使用
1赞晚饭后葛优躺睡着了,搞得夜里有精神了,干脆搞点事情吧。
不由得想到了刚毕业那会研究Zynq的那股劲头,拿到ZedBoard试用板的时候,时间紧迫,熬夜地调试板子、写文章;板子作为奖品到手后,为了做项目也是经常熬夜,由于项目复杂、编译时间太长,夜里每隔1小时起床看一下编译结果的事儿也干过。那是真拼啊。
好了,拉回来。
上一篇文章提到利用PACK里的样例工程快速入手,仅仅是一笔带过,本文以GPIO为例详细地讲解一下。
1、硬件电路分析
板载多个LED,能够拿来学习GPIO操作的LED有3个,分别为LED1、LED2、LED3。如图1所示,LED2和LED3分别连接到PB7和PB14,最为普通的GPIO接法,只要将相应管脚设置为输出端口,然后控制管脚电平高低,即可控制LED的亮灭。
图1
LED1稍微复杂一点点,连接到PB0,但不是直接连接,中间加了电压跟随电路,如图2所示。
图2
2、工程的搭建
2.1 样例工程的复制
在MDK安装路径下找到样例工程,具体路径可参考图3。
图3
将样例工程copy到自己喜欢的工程文件夹下,并去掉文件的只读属性,这是为了方便接下来修改代码。
图4
2.2 修改工程内文件路径、头文件搜索路径
参照图5所示的路径打开工程,发现好多源文件带有黄色感叹号(如图6所示),这是由于MDK找不到文件的原因,所以要修改文件的路径。
图5
图6
选中要修改属性的文件,右键,选择“Options for file ...”,如图7所示。弹出图8所示的对话框,将路径修改为图9所示的路径。
图7
图8
图9
头文件的搜索路径同样需要修改,具体操作参考图10和图11。
图10
头文件搜索路径我没有全部修改,只修改了工程用到的部分。
图11
此外,还可以把生成hex的选项顺便选中,如图12所示。
2.3 修改代码
在修改之前,首先好好读一下工程说明,可以了解到该样例工程可以帮助我们学习如何使用HAL API操作GPIO。
图13
大概分析一下,要改的地方主要是管脚配置,以及点灯代码,如图14所示。
图14
至于具体的函数功能,读一下相应API的注释就可以了,使用起来十分简单方便。API所在的文件如图15所示。
图15
2.4 修改完的主函数
int main(void) { char i=0; uint16_t GPIO_PIN_x=0; /* This sample code shows how to use GPIO HAL API to toggle GPIOB-GPIO_PIN_0 IO in an infinite loop. It is possible to connect a LED between GPIOB-GPIO_PIN_0 output and ground via a 330ohm resistor to see this external LED blink. Otherwise an oscilloscope can be used to see the output GPIO signal */ /* STM32F7xx HAL library initialization: - Configure the Flash prefetch - Systick timer is configured by default as source of time base, but user can eventually implement his proper time base source (a general purpose timer for example or other time source), keeping in mind that Time base duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and handled in milliseconds basis. - Set NVIC Group Priority to 4 - Low Level Initialization */ HAL_Init(); /* Configure the system clock to 216 MHz */ SystemClock_Config(); /* -1- Enable GPIO Clock (to be able to program the configuration registers) */ __HAL_RCC_GPIOB_CLK_ENABLE(); /* -2- Configure IO in output push-pull mode to drive external LEDs */ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_7 | GPIO_PIN_14; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* -3- Toggle IO in an infinite loop */ while (1) { // HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); for(i=0;i<3;i++) { switch(i) { case 0: GPIO_PIN_x = GPIO_PIN_0; break; case 1: GPIO_PIN_x = GPIO_PIN_7; break; case 2: GPIO_PIN_x = GPIO_PIN_14; break; default: GPIO_PIN_x = GPIO_PIN_0; break; } HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_x); // HAL_GPIO_WritePin(GPIOB, GPIO_PIN_x,GPIO_PIN_SET); /* Insert delay 1s */ HAL_Delay(1000); } } }
3 测试视频
版权声明:
本文由博主“cuter”发布。欢迎转载,但不得擅自更改博文内容,也不得用于任何盈利目的。转载时不得删除作者简介和版权声明。如有盗用而不说明出处引起的版权纠纷,由盗用者自负。
博客官方地址:
ChinaAET:http://blog.chinaaet.com/cuter521