注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
lvxinn2006的个人空间 https://home.eeworld.com.cn/space-uid-757599.html [收藏] [复制] [分享] [RSS]
日志

【 ST NUCLEO-G071RB测评】_07_触摸按键实验

已有 541 次阅读2019-1-18 10:28 |个人分类:MCU

本次活动测评开发板ST NUCLEO-G071RB由ST意法半导体提供,感谢意法半导体对EEWorld测评的支持!

【实验目的】
· 掌握使用GPIO中断的使用

【实验环境】
· NUCLEO-G071RB开发板
· Keil MDK-ARM(Keil uVision 5.25.2.0)
· Keil.STM32G0xx_DFP.1.0.0.pack

【实验资料】
· NUCLEO-G071RB开发板原理图
· STM32G071x8/xB Data Sheet
· STM32G071芯片用户参考手册
【实验分析
原理图:



连接如图所示,灰色线连接到电源的负极,黑色线连接到3.3V正极,白色是信号线,连接到了PC10引脚。
触摸按键模块的原理比较简单,通过电容感应,当没有感应到电容变化时,信号线会一直保持低电平,当触摸感应区域时,信号线会变成高电平。
因此,可以直接使用外部中断功能进行按键状态的判断,使用上升沿触发中断。
实验代码
  1. #include "stm32g0xx.h"                  // Device header

  2. void GPIOSetDir(GPIO_TypeDef *GPIO, int pin, int dir)
  3. {
  4.         if (dir == 0){
  5.                 GPIO->MODER        &= ~(0x3UL<<(pin * 2));
  6.                 GPIO->OTYPER &= ~(1<
  7.         }else{
  8.                 GPIO->MODER        &= ~(0x3UL<<(pin * 2));
  9.                 GPIO->MODER        |= (0x1UL<<(pin * 2));
  10.                 GPIO->OSPEEDR |= 0x3UL<<(pin * 2);
  11.                 GPIO->OTYPER &= ~(1<
  12.         }
  13. }

  14. void GPIOSetValue(GPIO_TypeDef *GPIO, int pin, int value)
  15. {
  16.         if (value == 0){
  17.                 GPIO->ODR &= ~(1<
  18.         }else{
  19.                 GPIO->ODR |= (1<
  20.         }
  21. }

  22. void GPIOSetToggle(GPIO_TypeDef *GPIO, int pin)
  23. {
  24.         GPIO->ODR ^= (1<
  25. }

  26. int GPIOGetValue(GPIO_TypeDef *GPIO, int pin)
  27. {
  28.         return GPIO->IDR & (1<
  29. }

  30. void EXTI4_15_IRQHandler(void)
  31. {
  32.         GPIOSetToggle(GPIOA, 5);
  33.         EXTI->RPR1 |= (1<<10);        //清理EXTI10中断状态
  34. }

  35. int main(void)
  36. {
  37.         //使能GPIOA的时钟
  38.         RCC->IOPENR |= RCC_IOPENR_GPIOAEN;       
  39.         //设置PA5为输出模式
  40.         GPIOSetDir(GPIOA, 5, 1);
  41.        
  42.         RCC->IOPENR |= RCC_IOPENR_GPIOCEN;        //使能GPIOC
  43.         GPIOSetDir(GPIOC, 10, 0);        //设置PC10为输入模式
  44.        
  45.         EXTI->RTSR1 |= (1<<10);        //EXTI10 上升沿触发
  46.         EXTI->EXTICR[2] &= ~(0xFF<<16);
  47.         EXTI->EXTICR[2] |= 0x2<<16;        //选择PC10为外中断源
  48.         EXTI->IMR1 |= (1<<10);        //使能EXTI10中断
  49.         NVIC_EnableIRQ(EXTI4_15_IRQn);        //使能中断
  50.        
  51.         while(1){}
  52. }

复制代码



【实验现象】

· 开发板上电当没有触摸按键时,LD4灯是熄灭的
· 每次接触触摸按键模块的感应区域时,LD4的状态会发生反转,在亮灭之间切换
  



此内容由EEWORLD论坛网友lvxinn2006原创,如需转载或用于商业用途需征得作者同意并注明出处

本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章