NUCLEO-F410RB 连续按键检测代码

本文介绍了一个使用mbed库的C++程序,通过STM32微控制器上的按钮控制LED的状态变化。程序实现了按钮的中断检测,以及根据不同按钮按压次数改变PWM输出,从而控制LED的亮度和闪烁模式。
#include "mbed.h"

DigitalOut led(LED1);
PwmOut pwm(PA_7);

InterruptIn button1(USER_BUTTON);
volatile bool button1_pressed = false; 

int pressTheButton();
void LED(int);

// ISR handling button pressed event
void button1_onpressed_cb(void)
{
    if (button1.read()==0) {
        wait_ms(20);
			if(button1.read()==0)
			{
				button1_pressed=true;
			}
			else button1_pressed=false;
    }
		else button1_pressed=false;
}

void button1_high(void)
{
	button1_pressed=false;
}

int main(void)
{
    //button1.mode(PullUp); // Activate pull-up
    button1.fall(&button1_onpressed_cb); // Attach ISR to handle button press event
	button1.rise(&button1_high);
	int status=0;
	printf("System setup OK.\r\n");
	status=pressTheButton();			
	LED(status);
}


int pressTheButton()		//control the status
{
	int i=0;
	int status=0;
	while(1)
	{
		if (button1_pressed) { // 1st press
				while(button1_pressed);
				while(!button1_pressed) 
				{
					wait_ms(1);
					i++;
					if(i>500) { status = 1; return status;}
				}
				i=0;
				if (button1_pressed) { // 2nd press
					while(button1_pressed);
					while(!button1_pressed)
					{
						wait_ms(1);
						i++;
						if(i>500) { status=2; return status;}
					}
					if(button1_pressed) { // 3rd press
						status = 3;
						return status;
					}
					else { status=2; return status; }
				}
				else { status=1; return status; }
		}
		else status = 0;
	}
}
void LED(int status)
{
	float i = 0.5;		//dc
	bool flag = true;
	float dc = 1.0;
	int delay = 1000;//change freq of LED blinking
	pwm.period_ms(10);
	led.write(PA_7);
	if(status==1)
	{
		while(1)
		{
			pwm.write(i);
			if(flag){
					i+=0.01;
					if(i>=1.0) flag=false;
				}
				else {
					i-=0.01;
					if(i<=0) flag=true;
				}
				wait_ms(20);
		}
	}
	else if(status == 2 || status == 3)
	{
		while(1)
		{
			pwm.write(dc);
			if(dc == 1.0) dc = 0;
			else dc = 1.0;
			if(status == 2) delay=1000;
			else delay=200;
			wait_ms(delay);
		}
	}
	else 
	{
		while(1)
		{
			pwm.write(0.0);
		}
	}
}
Nucleo-F103RB 是 STMicroelectronics 提供的一款基于 STM32F103RB 微控制器的开发板,适用于嵌入式系统的原型设计和开发。该开发板提供了多种外设接口,并支持 Arduino UNO R3 和 ST morpho 接口标准,使其具备良好的扩展性。 ### 引脚分配信息 Nucleo-F103RB 开发板的微控制器是 STM32F103RBT6,它采用 LQFP64 封装形式,具有多达 51 个通用输入输出(GPIO)引脚。这些引脚分布在多个端口上,包括 PAx、PBx 和 PCx 系列(其中 x 表示具体的引脚编号)。每个 GPIO 引脚都支持多种配置模式,例如输入、输出、复用功能以及模拟输入等[^1]。 以下是部分常用引脚的功能描述: - **PA0**:可用于 ADC 输入通道 0 或者 TIM2_CH1_ETR 输出 - **PA1**:ADC 输入通道 1 或者 TIM2_CH2 输出 - **PA2**:USART2_TX 或者 TIM2_CH3 输出 - **PA3**:USART2_RX 或者 TIM2_CH4 输出 - **PA4**:DAC 输出通道 1 或者 SPI1_NSS - **PA5**:SPI1_SCK - **PA6**:TIM3_CH1 或者 SPI1_MISO - **PA7**:TIM3_CH2 或者 SPI1_MOSI - **PA8**:USART3_CK / I2C3_SCL / TIM1_CH1 - **PA9**:USART1_TX - **PA10**:USART1_RX - **PA11**:USB_DM / CAN_RX - **PA12**:USB_DP / CAN_TX - **PA13**:SWDIO - **PA14**:SWCLK - **PA15**:JTDI / TIM2_CH1_ETR / SPI1_NSS - **PB3**:JTDO / TRACESWO / SPI1_SCK - **PB4**:JTRST / SPI1_MISO - **PB5**:I2C1_SMBA / SPI1_MOSI - **PB6**:I2C1_SCL / USART1_TX - **PB7**:I2C1_SDA / USART1_RX - **PB8**:I2C1_SCL / TIM4_CH3 - **PB9**:I2C1_SDA / TIM4_CH4 - **PC13**:通常连接至 LED(如 LD3) - **PC14**:OSC32_IN - **PC15**:OSC32_OUT 此外,Nucleo-F103RB 还提供了与 Arduino 兼容的接口,具体如下: - **Arduino A0-A5**:对应于 STM32 的 PA0-PA5 - **Arduino D0-D13**:对应于 STM32 的 PBx 和 PCx 引脚 对于详细的引脚映射表以及特定功能的复用选项,请参考官方数据手册或用户指南以获取最准确的信息[^1]。 ```c // 示例代码 - 初始化一个GPIO引脚作为输出 #include "stm32f10x.h" // Device header void GPIO_Config(void) { // Enable clock for GPIOB RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; // Configure PB0 as output push-pull GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } ``` ### 相关问题 1. 如何在 Nucleo-F103RB 上使用定时器 PWM 输出? 2. Nucleo-F103RB 支持哪些通信接口(如 UART、SPI、I2C)及其对应的引脚? 3. 如何配置 Nucleo-F103RB 开发板上的 ADC 模块进行模拟信号采集? 4. 在 Nucleo-F103RB 上如何实现外部中断功能? 5. Nucleo-F103RB 的 SWD 调试接口是如何工作的?需要哪些硬件支持? [^1]: STMicroelectronics. (2021). *STM32 Nucleo-64 boards User Manual*. UM1724.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值