#include "stm32f10x.h"                  // Device header

void led_on(void){
	// |=,&=,都要先读,修改,写回去,如果在中断里刚好操作同一GPIO就会出现竞争和电平紊乱,有读改写风险,推荐用BSRR
	//GPIOA->ODR |= (1ul << 1);
	GPIOA->BSRR = (1ul << 5); 
}

void led_off(void){
	//GPIOA->ODR &= ~(1ul << 1);
	GPIOA->BSRR = (1ul << 21); 
}

int main(void){
	RCC->APB2ENR |= (1ul << 2);
	//PA5推挽输出
	GPIOA->CRL &= ~(0x0F << (4 * 5));
	GPIOA->CRL |= (0x03 << (4 * 5));
	
	//PA6上拉输入
	GPIOA->CRL &= ~(0x0F << (4 * 6));
	GPIOA->CRL |= (0x08 << (4 * 6));
	
	while(1){
		//读到低电平——按下
		if(!(GPIOA->IDR & (1ul << 6))){
			led_on();
		}
		else{
			led_off();
		}
	}
}

流程:

1、开启RCC时钟

2、GPIO配置
 

注意移位操作就好,慢慢熟练。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐