历史上的今天
今天是:2025年04月10日(星期四)
2019年04月10日 | STM32按键控制LED(不用固件库)
2019-04-10 来源:eefocus
用的是STM32F407ZET6。控制的LED灯的四个引脚分别是LED0 ->PF9,LED1 -> PF10,LED2-> PE13,LED3 -> PE14。按键的四个引脚分别是KEY0--> PA0,KEY1--> PE2,KEY2--> PE3,KEY3--> PE4。
在循环里判断按键是否按下(对应的引脚输入会变为0),如果按下,则对应的LED引脚输出低电平,即可点亮。
1,分别初始化LED灯和按键的寄存器。
初始化LED灯(设置各个寄存器):设置GPIO的时钟,配置模式寄存器(通用输出类型),配置输出类型(设为输出推免),设置控制输出速率的寄存器,最后配置输出数据寄存器(让LED灯默认是熄灭的)
初始化按键(设置各个寄存器):设置GPIO的时钟,配置密匙寄存器(设置为输入模式),设置控制输出速率的寄存器。
2,在主函数一直查询按键是否按下(相应的管脚电平是否为0即可)
函数实现如下:
#define rRCCAHB1CLKEN *((volatile unsigned long *)0x40023830)
#define rGPIOF_MODER *((volatile unsigned long *)0x40021400)
#define rGPIOF_OTYPER *((volatile unsigned long *)0x40021404)
#define rGPIOF_OSPEEDR *((volatile unsigned long *)0x40021408)
#define rGPIOF_IDR *((volatile unsigned long *)0x40021410)
#define rGPIOF_ODR *((volatile unsigned long *)0x40021414)
#define rGPIOE_MODER *((volatile unsigned long *)0x40021000)
#define rGPIOE_OTYPER *((volatile unsigned long *)0x40021004)
#define rGPIOE_OSPEEDR *((volatile unsigned long *)0x40021008)
#define rGPIOE_IDR *((volatile unsigned long *)0x40021010)
#define rGPIOE_ODR *((volatile unsigned long *)0x40021014)
#define rGPIOA_MODER *((volatile unsigned long *)0x40020000)
#define rGPIOA_OTYPER *((volatile unsigned long *)0x40020004)
#define rGPIOA_OSPEEDR *((volatile unsigned long *)0x40020008)
#define rGPIOA_IDR *((volatile unsigned long *)0x40020010)
#define rGPIOA_ODR *((volatile unsigned long *)0x40020014)
void key_init()
{
rRCCAHB1CLKEN |= 1 | (1 << 1);
rGPIOA_MODER&=~(1|(1<<1));
rGPIOF_OSPEEDR &= ~(1 | (1 << 1) );
rGPIOE_MODER&= ~(0x3f<<4);
rGPIOE_MODER &= ~(0x3f<<4);
}
void led_init()
{
rRCCAHB1CLKEN |= (1 << 5) | (1 << 4);
rGPIOF_MODER &= ~((0x3 << 18) | (0x3 << 20));
rGPIOF_MODER |= (1 << 18) | (1 << 20);
rGPIOF_OTYPER &= ~( (1 << 9) | (1 << 10));
rGPIOF_OSPEEDR &= ~((0x3 << 18) | (0x3 << 20) );
rGPIOF_ODR |= (1 << 9 | 1 << 10) ;
rGPIOE_MODER &= ~((0X3 << 26) | (0X3 << 28) );
rGPIOE_MODER |= (1 << 26) | (1 << 28);
rGPIOE_OTYPER &= ~( (1 << 13) | (1 << 14));
rGPIOE_OSPEEDR &= ~((0x3 << 26) | (0x3 << 28) );
rGPIOE_ODR |= (1 << 13 | 1 << 14) ;
}
void delay(int i)
{
int v = i;
while(v--);
}
void led_on(int i)
{
if (i == 0)
{
rGPIOF_ODR &= ~(1 << 9);
rGPIOF_ODR |= 1 << 10;
rGPIOE_ODR |= (1 << 13) | (1 << 14);
}
else if (i == 1)
{
rGPIOF_ODR |= (1 << 9);
rGPIOF_ODR &= ~(1 << 10);
rGPIOE_ODR |= (1 << 13) | (1 << 14);
}
else if (i == 2)
{
rGPIOF_ODR |= (1 << 9) | (1 << 10);
rGPIOE_ODR &= ~(1 << 13);
rGPIOE_ODR |= 1 << 14;
}
else if (i == 3)
{
rGPIOF_ODR |= (1 << 9) | (1 << 10);
rGPIOE_ODR &= ~(1 << 14);
rGPIOE_ODR |= 1 << 13;
}
}
int main()
{
int i = 0;
led_init();
key_init();
while(1)
{
if(!(rGPIOA_IDR&1))
{
delay(50);//消抖
if(!(rGPIOA_IDR&1))
{
led_on(0);
}
}
else
{
rGPIOF_ODR |= 1 << 9;//µÆÃð
}
if(!(rGPIOE_IDR&(1<<2)))
{
delay(50);
if(!(rGPIOE_IDR&(1<<2)))
{
led_on(1);
}
}
else
{
rGPIOF_ODR |= 1 << 10;
}
if(!(rGPIOE_IDR&(1<<3)))
{
delay(50);
if(!(rGPIOE_IDR&(1<<3)))
{
led_on(2);
}
}
else
{
rGPIOE_ODR |= 1 << 13;
}
if(!(rGPIOE_IDR&(1<<4)))
{
delay(50);
if(!(rGPIOE_IDR&(1<<4)))
{
led_on(3);
}
}
else
{
rGPIOE_ODR |= 1 << 14;
}
}
}
上一篇:STM32-1-LED点亮与熄灭
史海拾趣
|
随着市场经济的高速发展,中国IT业步入了一个人才稀缺的时代。作为最被看好的热门专业,其迅猛发展有目共睹,从而导致IT人才的培养速度无法跟上IT行业的发展,每年的人才缺口就达数百万人。为了在激烈的就业竞争中占领一席之地,减小就业压力, ...… 查看全部问答> |
|
高手们,你们好 我现在通过RealView Developement suite开发工具,编译了一个helloworld小程序 默认是生成了axf格式的执行文件 这个文件带有调试信息,和bin文件 所有通过fromelf,提取出了bin文件 但是这个bin文件,通过我在虚拟机和Linux系 ...… 查看全部问答> |
|
wince下串口问题,平时数据传输正常,但鼠标反复点击移动有时就会使串口数据错误,或者是界面切换时。我感觉是系统忙了有时会影响串口读取。波特率的57600,不算很高吧?缓冲区我也设置的很大了。数据没有丢失,只是出现错误。例如我发送端发的全是 ...… 查看全部问答> |
|
usb驱动,应用程序能够打开设备,但是发送数据的时候堵在了SubmitUrb 是什么原因使得发送数据阻塞啊? PURB pUrb = m_Endpoint2OUT.BuildBulkTransfer( &nbs ...… 查看全部问答> |
|
请问STM32F10X_MD和STM32F10X_MD_VL区别 请问STM32F10X_MD_VL和STM32F10X_MD有什么区别啊,网上查了查,有如下说明 cl:互联型产品,stm32f105/107系列vl:超值型产品,stm32f100系列xl:超高密度产品,stm32f101/103系列ld:低密度产品,FLASH小于64Kmd:中等密度产品,FLASH=64 ...… 查看全部问答> |
|
我们在电源滤波电路上可以看到各种各样的电容,100uF,10uF,100nF,10nF不同的容值,那么这些参数是如何确定的?不要告诉我是抄别人原理图的,呵呵。 数字电路要运行稳定可靠, ...… 查看全部问答> |
|
1、源码 http://live555.com/liveMedia/public/ 2、实现交叉编译 vim config.armlinux 修改: CROSS_COMPILE?= arm-none-linux-gnueabi- ./g ...… 查看全部问答> |




