[原创] 【 ST NUCLEO-G071RB测评】GPIO

lising   2019-1-6 13:09 楼主
本次实验使用的NUCLEO-G071RB开发板由https://www.stmcu.com.cn/index.p ... /261/layout/product 提供,更多相关资讯请进入查询。 本次实验包含两项内容:其一利用查询方法检测“USER”按键,控制LD4亮、灭;其二是利用中断方法。 一、实验资源 1、NUCLEO-G071RB开发板; 2、Keil v5.25.2.0; 3、Keil.STM32G0xx_DFP.1.0.0; 4、STM32CubeMX v5.0.1; 5、stm32cube_fw_g0_v100; 二、实验过程 1、软件安装。以上软件的具体安装过程就不说了,Keil及STM32CubeMX都是之前安装好的。由于NUCLEO-G071RB开发板所用微控制器STM32G071RBT6为ST公司新一代的产品,在Keil及STM32CubeMX使用前还必须安装Keil.STM32G0xx_DFP.1.0.0及stm32cube_fw_g0_v100,这两个插件可以直接在应用软件中时行安装,也可以下载后安装。最终如下图所示: QQ截图20190106011225.png QQ截图20190106114805.png 2、第一次实验-采用查询方式检测用户按键(蓝色)“USER”状态,控制LD4的亮、灭。通过原理图可以看出“USER”通过外接上拉电阻与PC13相连,当按键按下检测到PC13出现低电平时点亮LD4、否则熄灭LD4;LD4通过一只N-MOS并受控于PA5引脚,当PA5输出高电平时N-MOS导通,LD4被点亮,反之LD4熄灭; QQ截图20190105211007.png QQ截图20190105211113.png 3、程序实现 程序主体通过STM32CubeMX生成,方便、快捷、高效。在这里PA5配置为输出模式,初始输出为低电平;PC13配置为输入;时钟选用HSE,处理完这些并经简单设置就可以生成代码了。 QQ截图20190106010843.png QQ截图20190106010920.png QQ截图20190106011857.png 所生成的工程文件被Keil打开后会发现端口及时钟已经配置好了,不用再去理会,只需要在主函数中实现目标功能就是了。下面是功能代码:
  1. /* USER CODE BEGIN WHILE */
  2. while (1)
  3. {
  4. if(!HAL_GPIO_ReadPin(USER_KEY_GPIO_Port, USER_KEY_Pin))
  5. {
  6. HAL_Delay(20);
  7. if(!HAL_GPIO_ReadPin(USER_KEY_GPIO_Port, USER_KEY_Pin))
  8. {
  9. HAL_GPIO_WritePin(LD4_GPIO_Port, LD4_Pin, GPIO_PIN_SET);
  10. while(!HAL_GPIO_ReadPin(USER_KEY_GPIO_Port, USER_KEY_Pin));
  11. key_cont++;
  12. if(key_cont==2)
  13. {
  14. key_cont=0;
  15. HAL_GPIO_WritePin(LD4_GPIO_Port, LD4_Pin, GPIO_PIN_RESET);
  16. }
  17. }
  18. }
  19. /* USER CODE END WHILE */
4、第二次实验-中断法检测按键状态控制LD4亮、灭。利用中断功能可节约大量宝贵资源,并且响应迅速。其实用户按键(PC13)本身就具备了“GPIO_EXTI13”外部中断功能,这次实验利用其产生下降沿产生中断的功能。 QQ截图20190106141159.png QQ截图20190106093255.png 5、程序实现 下面就是功能实现的主要代码,函数内已经按个人的理解加了一些注释,由于能力水平问题所产生的错误还请朋友们给予指教。 a、中断配置函数,该函数在主函数中进行初始化。
  1. /*外部中断配置*/
  2. void EXTI4_15_IRQHandler_Config(void)
  3. {
  4. GPIO_InitTypeDef GPIO_InitStructure;
  5. /*使能GPIOC时钟*/
  6. __HAL_RCC_GPIOC_CLK_ENABLE();
  7. /*
  8. 下降沿外部中断;
  9. 无上、下拉;
  10. 设定PC13引脚;
  11. 完成引脚配置;
  12. */
  13. GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING;
  14. GPIO_InitStructure.Pull = GPIO_NOPULL;
  15. GPIO_InitStructure.Pin = USER_KEY_Pin;
  16. HAL_GPIO_Init(USER_KEY_GPIO_Port, &GPIO_InitStructure);
  17. /*
  18. 用户按键接PC13端口,即外部中断“EXTI Line 4 to 15 Interrupts”;
  19. 设置中断优先级(0~3),此处设置为最高“0”;
  20. M0+内核不支持中断子优先级,此处设置为“0”;
  21. */
  22. HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0);
  23. /*使能PC13引脚中断*/
  24. HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);
  25. }
b、中断处理函数,该函数在stm32g0xx_it.c随时等待干活儿;
  1. /* USER CODE BEGIN 1 */
  2. void EXTI4_15_IRQHandler(void)
  3. {
  4. HAL_GPIO_EXTI_IRQHandler(USER_KEY_Pin);
  5. }
  6. /* USER CODE END 1 */
c、中断产生后HAL_GPIO_EXTI_IRQHandler(USER_KEY_Pin)会调用HAL_GPIO_EXTI_Falling_Callback(GPIO_Pin)函数,在HAL库中被定义为“弱函数”(__weak void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)),当重新写该函数后就会调入新写的,而“弱函数”就被忽视了。被调用的也被称为“回调函数”;
  1. /*PC13引脚中断回调函数,由中断处理函数调用EXTI4_15_IRQHandler()*/
  2. void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
  3. {
  4. if(GPIO_Pin == USER_KEY_Pin)//确认PC13产生下降沿脉冲
  5. {
  6. HAL_GPIO_TogglePin(LD4_GPIO_Port, LD4_Pin);//LD4端口翻转
  7. }
  8. }
三、实验结果 两次实验的结果如文前所述。 四、实验总结 通过所述两个小实验过程的学习,对NUCLEO-G071RB开发板及STM32G071RBT6微控制器又增加了一些新的了解和认识,接下来要接着做更多的实验来进行学习。 文中的一些描述可能存在一定问题,还请朋友们给予指教。
RM0444_STM32G0x1单片机参考手册.rar (7.39 MB)
(下载次数: 15, 2019-1-6 13:07 上传)
此内容由EEWORLD论坛网友lising原创,如需转载或用于商业用途需征得作者同意并注明出处 本帖最后由 lising 于 2019-1-6 14:15 编辑

回复评论 (7)

谢谢楼主分享,正好可以学习借鉴,少走弯路。
点赞  2019-1-7 22:00
引用: hujj 发表于 2019-1-7 22:00
谢谢楼主分享,正好可以学习借鉴,少走弯路。

相互学习,共同进步
点赞  2019-1-7 22:11
我参照你帖子里的提示,下载并升级了Keil.STM32G0xx.DFP.1.0.0,但stm32cube_fw_g0_v100这个文件没有找到,请问这个文件在哪下载?起什么作用呢?谢谢了!
点赞  2019-1-8 12:15
stm32cube_fw_g0_v100是STM32CubeMX支持STM32G0系列的插件,有了它的支持STM32CubeMX可配置生成NUCLEO-G071RB的工程文件。可以去ST中文或ST官网下载或直接在STM32CubeMX中安装。
点赞  2019-1-8 12:50
谢谢楼主指点!已经下载安装了STM32CubeMX软件,正在学习如何使用。
点赞  2019-1-8 15:33
引用: hujj 发表于 2019-1-8 15:33
谢谢楼主指点!已经下载安装了STM32CubeMX软件,正在学习如何使用。

STM32CubeMX软件很好用,尤其是配置时钟非常省心。
点赞  2019-1-8 19:54
原理图上不是32.768K的晶振吗
点赞  2024-10-9 16:40
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复