查看: 96|回复: 0

[教程] STM32F412应用开发之——基本GPIO控制

[复制链接]

146

主题

0

好友

2686

积分

进士

Rank: 5Rank: 5

  • TA的每日心情
    开心
    2014-4-21 09:44
  • 签到天数: 26 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2017-8-4 14:11:06 |显示全部楼层
    这块NUCLEO-F412ZG板子上的元器件并没有完全焊接,除去ST-LINK部分和电源部分后,还有用一个USB主机接口,三个LED灯和两个按钮,不过很多功能引脚都已经引到了插针。查看原理图可发现,由原理图模块的5大部分与电源部分组成,即连接端子、ST-LINK、MCU、USB、以太网和电源部分。
    564295-20161212135353776-1721519191.png


    电源部分考虑的非常充分,5V有三路输入,一路是有外部输入6-15VDC电源经U5(LD1117S50TR)转为5VDC电源;第二路是USB端口提供的5V电源,同时还有电流限制保护U4(ST890CDR);第三路则是由外部直接输入5V电源。默认是选择的USB口电源输入,并U6(LD39050PU33R)输出3.3VDC电源。当然还有ST-LINK部分的电源以及USB主机部分的电源。而且这两部分也是上述3路5VDC供电。

    564295-20161212135410933-49053737.png
    以太网部分的电路并未焊接。时钟部分ST-LINK使用了8M的外部晶振(X1),而F412的主时钟输入有两路,一路是从ST-LINK的主控芯片MCO引来,一路也是外界的8M外部晶振(X3)。板子采用的是从MCO引来的时钟。此外还有一个32.768K的外部晶振(X2)。
    在了解了基本电路后,开始编程之旅,使用的开发环境是IAR EWARM7.5。首先使用STM32CubeMX创建一个项目。打开STM32CubeMX出现如下的界面。
    564295-20161212135421386-1049398427.png
    点击“New Project”新建一个项目,弹出新项目对话框:
    564295-20161212135430886-1237001117.png


    由于使用的是NUCLEO-F412ZG开发板,所以选择Board Selector标签,并选择板子的类型为Nucleo144,选择MCU系列为STM32F4,点击“OK”按钮创建项目,出现如下界面:
    564295-20161212135442542-304393391.png


    在第一个项目中我们简单的利用开发板上提供的按钮B1来控制开发板上的三个指示灯LD1(绿色)、LD2(蓝色)、LD3(红色)其中:
    按钮B1对应的输入引脚为:PC13
    绿色指示灯LD1对应的引脚为:PB0
    蓝色指示灯LD2对应的引脚为:PB7
    红色指示灯LD3对应的引脚为:PB14
    同时通过引脚PG2来驱动外围的继电器电路,这部分电路由自己搭建。原理图如下:
    564295-20161212135523683-1762504396.png

    对于IO的配置可以在STM32CubeMX中完成,将PC13配置为GPIO_EXIT13;将PB0、PB7、PB14与PG2都配置为GPIO_OUTPUT。配置好GPIO引脚的类型后就可以在”Configuration“标签(如下图所示)中配置GPIO口了。

    564295-20161212135536339-58752950.png


    在“System“下,选择GPIO弹出”Pin Configuration“对话框。在对话框中一一配置各个GPIO引脚,在本次中我配置个引脚如下:
    564295-20161212135546714-1426548206.png


    完成以上配置后,生成IAR EWARM项目则会在生成的源码中出现GPIO的配置,源码如下:
    1. GPIO_InitTypeDef GPIO_InitStruct;

    2. /* GPIO Ports Clock Enable */
    3. __HAL_RCC_GPIOC_CLK_ENABLE();
    4. __HAL_RCC_GPIOH_CLK_ENABLE();
    5. __HAL_RCC_GPIOB_CLK_ENABLE();
    6. __HAL_RCC_GPIOD_CLK_ENABLE();
    7. __HAL_RCC_GPIOG_CLK_ENABLE();
    8. __HAL_RCC_GPIOA_CLK_ENABLE();

    9. /*Configure GPIO pin : B1_Pin */
    10. GPIO_InitStruct.Pin = B1_Pin;
    11. GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
    12. GPIO_InitStruct.Pull = GPIO_NOPULL;
    13. HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);

    14. /*Configure GPIO pins : LD1_Pin LD3_Pin LD2_Pin */
    15. GPIO_InitStruct.Pin = LD1_Pin|LD3_Pin|LD2_Pin;
    16. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    17. GPIO_InitStruct.Pull = GPIO_NOPULL;
    18. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    19. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    20. /*Configure GPIO pins : STLK_RX_Pin STLK_TX_Pin */
    21. GPIO_InitStruct.Pin = STLK_RX_Pin|STLK_TX_Pin;
    22. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    23. GPIO_InitStruct.Pull = GPIO_NOPULL;
    24. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    25. GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
    26. HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

    27. /*Configure GPIO pins : Relay_Ctrl_Pin USB_PowerSwitchOn_Pin */
    28. GPIO_InitStruct.Pin = Relay_Ctrl_Pin|USB_PowerSwitchOn_Pin;
    29. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    30. GPIO_InitStruct.Pull = GPIO_NOPULL;
    31. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    32. HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);

    33. /*Configure GPIO pin : USB_OverCurrent_Pin */
    34. GPIO_InitStruct.Pin = USB_OverCurrent_Pin;
    35. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    36. GPIO_InitStruct.Pull = GPIO_NOPULL;
    37. HAL_GPIO_Init(USB_OverCurrent_GPIO_Port, &GPIO_InitStruct);

    38. /*Configure GPIO pins : USB_SOF_Pin USB_ID_Pin USB_DM_Pin USB_DP_Pin */
    39. GPIO_InitStruct.Pin = USB_SOF_Pin|USB_ID_Pin|USB_DM_Pin|USB_DP_Pin;
    40. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    41. GPIO_InitStruct.Pull = GPIO_NOPULL;
    42. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    43. GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;
    44. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    45. /*Configure GPIO pin Output Level */
    46. HAL_GPIO_WritePin(GPIOB, LD1_Pin|LD3_Pin|LD2_Pin, GPIO_PIN_RESET);

    47. /*Configure GPIO pin Output Level */
    48. HAL_GPIO_WritePin(GPIOG, Relay_Ctrl_Pin|USB_PowerSwitchOn_Pin, GPIO_PIN_RESET);
    复制代码
    在硬件配置方面,STM32CubeMX能够完成全部的基础工作,我们只需要完成自己的控制逻辑,非常方便。如果设计的好,我们自己学的程序的通用性可以大大提高,极大降低与底层硬件的耦合强度。不过在使用中发现STM32CubeMX似乎与中文操作系统配合得不太好,总是出现全角字符的困扰,估计ST不久会解决。
    我的测试逻辑比较简单,一开始三个指示灯全部亮,继电器不导通。按钮B1按一下,LD1灭,再按一下LD2灭,再按一下LD3灭同时继电器吸合,再按一下三个灯全亮同时继电器断开,如此循环。
    这部分的源码实现也比较简单,首先定义了一个表示状态的枚举类型,然后根据不通的状态定义逻辑操作。
    1. typedef enum
    2. {
    3.   STATE0 = 0,
    4.   STATE1,
    5.   STATE2,
    6.   STATE3,
    7.   STATENUM
    8. }STATE;

    9. /*逻辑控制的实现*/
    10. void LogicCtrol(void)
    11. {
    12.   GPIO_PinState b1State=HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin);
    13.   if(b1State==GPIO_PIN_SET)
    14.   {
    15.     status++;
    16.   }
    17.   if(status>=STATENUM)
    18.   {
    19.     status=STATE0;
    20.   }
    21.   switch(status)
    22.   {
    23.   case STATE0:
    24.     {
    25.       HAL_GPIO_WritePin(GPIOB, LD1_Pin|LD3_Pin|LD2_Pin, GPIO_PIN_SET);
    26.       HAL_GPIO_WritePin(GPIOG, Relay_Ctrl_Pin, GPIO_PIN_RESET);
    27.       break;
    28.     }
    29.   case STATE1:
    30.     {
    31.       HAL_GPIO_WritePin(GPIOB, LD1_Pin, GPIO_PIN_RESET);
    32.       HAL_GPIO_WritePin(GPIOB, LD3_Pin|LD2_Pin, GPIO_PIN_SET);
    33.       HAL_GPIO_WritePin(GPIOG, Relay_Ctrl_Pin, GPIO_PIN_RESET);
    34.       break;
    35.     }
    36.   case STATE2:
    37.     {
    38.       HAL_GPIO_WritePin(GPIOB, LD1_Pin|LD2_Pin, GPIO_PIN_RESET);
    39.       HAL_GPIO_WritePin(GPIOB, LD3_Pin, GPIO_PIN_SET);
    40.       HAL_GPIO_WritePin(GPIOG, Relay_Ctrl_Pin, GPIO_PIN_RESET);
    41.       break;
    42.     }
    43.   case STATE3:
    44.     {
    45.       HAL_GPIO_WritePin(GPIOB, LD1_Pin|LD2_Pin|LD3_Pin, GPIO_PIN_RESET);
    46.       HAL_GPIO_WritePin(GPIOG, Relay_Ctrl_Pin, GPIO_PIN_SET);
    47.       break;
    48.     }
    49.   default:
    50.     {
    51.       break;
    52.     }
    53.   }
    54. }
    复制代码
    下载到NUCLEO-F412ZG开发板测试,结果与预期一致。
    转自博客园,博主昵称foxclever/
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

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

    手机版|爱板网 |网站地图  

    GMT+8, 2017-8-24 14:52 , Processed in 0.167630 second(s), 11 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部