本次活动测评开发板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引脚。
触摸按键模块的原理比较简单,通过电容感应,当没有感应到电容变化时,信号线会一直保持低电平,当触摸感应区域时,信号线会变成高电平。
因此,可以直接使用外部中断功能进行按键状态的判断,使用上升沿触发中断。
【实验代码】
- #include "stm32g0xx.h" // Device header
- void GPIOSetDir(GPIO_TypeDef *GPIO, int pin, int dir)
- {
- if (dir == 0){
- GPIO->MODER &= ~(0x3UL<<(pin * 2));
- GPIO->OTYPER &= ~(1<<pin);
- }else{
- GPIO->MODER &= ~(0x3UL<<(pin * 2));
- GPIO->MODER |= (0x1UL<<(pin * 2));
- GPIO->OSPEEDR |= 0x3UL<<(pin * 2);
- GPIO->OTYPER &= ~(1<<pin);
- }
- }
- void GPIOSetValue(GPIO_TypeDef *GPIO, int pin, int value)
- {
- if (value == 0){
- GPIO->ODR &= ~(1<<pin);
- }else{
- GPIO->ODR |= (1<<pin);
- }
- }
- void GPIOSetToggle(GPIO_TypeDef *GPIO, int pin)
- {
- GPIO->ODR ^= (1<<pin);
- }
- int GPIOGetValue(GPIO_TypeDef *GPIO, int pin)
- {
- return GPIO->IDR & (1<<pin);
- }
- void EXTI4_15_IRQHandler(void)
- {
- GPIOSetToggle(GPIOA, 5);
- EXTI->RPR1 |= (1<<10); //清理EXTI10中断状态
- }
- int main(void)
- {
- //使能GPIOA的时钟
- RCC->IOPENR |= RCC_IOPENR_GPIOAEN;
- //设置PA5为输出模式
- GPIOSetDir(GPIOA, 5, 1);
-
- RCC->IOPENR |= RCC_IOPENR_GPIOCEN; //使能GPIOC
- GPIOSetDir(GPIOC, 10, 0); //设置PC10为输入模式
-
- EXTI->RTSR1 |= (1<<10); //EXTI10 上升沿触发
- EXTI->EXTICR[2] &= ~(0xFF<<16);
- EXTI->EXTICR[2] |= 0x2<<16; //选择PC10为外中断源
- EXTI->IMR1 |= (1<<10); //使能EXTI10中断
- NVIC_EnableIRQ(EXTI4_15_IRQn); //使能中断
-
- while(1){}
- }
复制代码
【实验现象】
· 开发板上电当没有触摸按键时,LD4灯是熄灭的
· 每次接触触摸按键模块的感应区域时,LD4的状态会发生反转,在亮灭之间切换
此内容由EEWORLD论坛网友lvxinn2006原创,如需转载或用于商业用途需征得作者同意并注明出处