【 ST NUCLEO-G071RB测评】GPIO
<div class='showpostmsg'> 本帖最后由 lising 于 2019-1-6 14:15 编辑本次实验使用的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,这两个插件可以直接在应用软件中时行安装,也可以下载后安装。最终如下图所示:
2、第一次实验-采用查询方式检测用户按键(蓝色)“USER”状态,控制LD4的亮、灭。通过原理图可以看出“USER”通过外接上拉电阻与PC13相连,当按键按下检测到PC13出现低电平时点亮LD4、否则熄灭LD4;LD4通过一只N-MOS并受控于PA5引脚,当PA5输出高电平时N-MOS导通,LD4被点亮,反之LD4熄灭;
3、程序实现
程序主体通过STM32CubeMX生成,方便、快捷、高效。在这里PA5配置为输出模式,初始输出为低电平;PC13配置为输入;时钟选用HSE,处理完这些并经简单设置就可以生成代码了。
所生成的工程文件被Keil打开后会发现端口及时钟已经配置好了,不用再去理会,只需要在主函数中实现目标功能就是了。下面是功能代码:
/* USER CODE BEGIN WHILE */
while (1)
{
if(!HAL_GPIO_ReadPin(USER_KEY_GPIO_Port, USER_KEY_Pin))
{
HAL_Delay(20);
if(!HAL_GPIO_ReadPin(USER_KEY_GPIO_Port, USER_KEY_Pin))
{
HAL_GPIO_WritePin(LD4_GPIO_Port, LD4_Pin, GPIO_PIN_SET);
while(!HAL_GPIO_ReadPin(USER_KEY_GPIO_Port, USER_KEY_Pin));
key_cont++;
if(key_cont==2)
{
key_cont=0;
HAL_GPIO_WritePin(LD4_GPIO_Port, LD4_Pin, GPIO_PIN_RESET);
}
}
}
/* USER CODE END WHILE */
4、第二次实验-中断法检测按键状态控制LD4亮、灭。利用中断功能可节约大量宝贵资源,并且响应迅速。其实用户按键(PC13)本身就具备了“GPIO_EXTI13”外部中断功能,这次实验利用其产生下降沿产生中断的功能。
5、程序实现
下面就是功能实现的主要代码,函数内已经按个人的理解加了一些注释,由于能力水平问题所产生的错误还请朋友们给予指教。
a、中断配置函数,该函数在主函数中进行初始化。
/*外部中断配置*/
void EXTI4_15_IRQHandler_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*使能GPIOC时钟*/
__HAL_RCC_GPIOC_CLK_ENABLE();
/*
下降沿外部中断;
无上、下拉;
设定PC13引脚;
完成引脚配置;
*/
GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStructure.Pull = GPIO_NOPULL;
GPIO_InitStructure.Pin = USER_KEY_Pin;
HAL_GPIO_Init(USER_KEY_GPIO_Port, &GPIO_InitStructure);
/*
用户按键接PC13端口,即外部中断“EXTI Line 4 to 15 Interrupts”;
设置中断优先级(0~3),此处设置为最高“0”;
M0+内核不支持中断子优先级,此处设置为“0”;
*/
HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0);
/*使能PC13引脚中断*/
HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);
}
b、中断处理函数,该函数在stm32g0xx_it.c随时等待干活儿;
/* USER CODE BEGIN 1 */
void EXTI4_15_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(USER_KEY_Pin);
}
/* 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)),当重新写该函数后就会调入新写的,而“弱函数”就被忽视了。被调用的也被称为“回调函数”;
/*PC13引脚中断回调函数,由中断处理函数调用EXTI4_15_IRQHandler()*/
void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == USER_KEY_Pin)//确认PC13产生下降沿脉冲
{
HAL_GPIO_TogglePin(LD4_GPIO_Port, LD4_Pin);//LD4端口翻转
}
}
三、实验结果
两次实验的结果如文前所述。
四、实验总结
通过所述两个小实验过程的学习,对NUCLEO-G071RB开发板及STM32G071RBT6微控制器又增加了一些新的了解和认识,接下来要接着做更多的实验来进行学习。
文中的一些描述可能存在一定问题,还请朋友们给予指教。
此内容由EEWORLD论坛网友lising原创,如需转载或用于商业用途需征得作者同意并注明出处
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> 谢谢楼主分享,正好可以学习借鉴,少走弯路。 hujj 发表于 2019-1-7 22:00
谢谢楼主分享,正好可以学习借鉴,少走弯路。
相互学习,共同进步:handshake 我参照你帖子里的提示,下载并升级了Keil.STM32G0xx.DFP.1.0.0,但stm32cube_fw_g0_v100这个文件没有找到,请问这个文件在哪下载?起什么作用呢?谢谢了! stm32cube_fw_g0_v100是STM32CubeMX支持STM32G0系列的插件,有了它的支持STM32CubeMX可配置生成NUCLEO-G071RB的工程文件。可以去ST中文或ST官网下载或直接在STM32CubeMX中安装。 谢谢楼主指点!已经下载安装了STM32CubeMX软件,正在学习如何使用。 hujj 发表于 2019-1-8 15:33
谢谢楼主指点!已经下载安装了STM32CubeMX软件,正在学习如何使用。
STM32CubeMX软件很好用,尤其是配置时钟非常省心。 原理图上不是32.768K的晶振吗
页:
[1]