本次实验使用的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原创,如需转载或用于商业用途需征得作者同意并注明出处
本帖最后由 lising 于 2019-1-6 14:15 编辑