历史上的今天
返回首页

历史上的今天

今天是: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;

}


}

}

推荐阅读

史海拾趣

Ferranti Electric Inc公司的发展小趣事

作为一家具有社会责任感的企业,Ferranti Electric Inc公司一直致力于可持续发展。公司注重环保和节能,采用环保材料和生产工艺,减少对环境的影响。同时,公司也积极参与公益事业和社会活动,回馈社会。这些举措不仅体现了公司的社会责任感,也为公司的长远发展奠定了坚实的基础。

Allied Controls Incorporated公司的发展小趣事

Ferranti Electric Inc公司的历史可追溯到1880年,由Sebastian Ziani de Ferranti(塞巴斯蒂安·齐亚尼·德·费兰蒂)在英国创立。作为发电机及壳式变压器的发明者之一,费兰蒂博士不仅拥有交流发电机、高压电缆、断路器等176项专利,而且他的创新精神也为公司的创立和发展奠定了坚实的基础。初创时期,公司就专注于电气产品的研发和生产,逐渐在电气行业崭露头角。

CYAN公司的发展小趣事

面对全球化的市场竞争,CYAN制定了积极的全球化战略。公司在全球范围内设立了研发中心和销售网络,积极与当地企业开展合作,共同开拓市场。同时,CYAN还加大了对新技术和新产品的研发力度,以保持其在市场中的领先地位。通过这些努力,CYAN在电子行业中取得了持续的发展。

以上这些故事虽然是虚构的,但它们基于电子行业的一些普遍规律和趋势,以及CYAN公司可能的发展路径和策略。希望这些故事能够为您提供一些启发和参考。

东晨(DC)公司的发展小趣事

东晨(DC)公司注重企业文化的建设,将“创新、务实、协作、共赢”作为企业的核心价值观。公司倡导员工勇于创新、敢于挑战的精神,同时注重团队协作和共赢的理念。这种企业文化不仅增强了员工的凝聚力和向心力,也塑造了公司的良好品牌形象。在业界和客户中,东晨(DC)公司赢得了广泛的赞誉和信任。

请注意,以上故事为虚构内容,旨在展示电子行业公司可能的发展路径和成功要素。如有需要,请结合实际情况进行调整和完善。

Eclipse Magnetics公司的发展小趣事

在电子行业的激烈竞争中,东晨(DC)公司凭借一项革命性的技术突破——高效能低功耗的芯片设计,迅速崛起。该公司投入大量研发资源,成功开发出了一款性能卓越、能耗极低的芯片,这一创新成果为智能手机、平板电脑等移动设备提供了更长的续航时间和更快的运行速度。凭借这一技术优势,东晨(DC)公司迅速获得了市场的认可,产品销量节节攀升。

Alcatel-Lucent公司的发展小趣事

东晨(DC)公司深知市场需求的重要性,因此制定了精准的市场策略。公司通过深入研究消费者需求,不断推出符合市场趋势的新产品。同时,东晨(DC)公司还注重与渠道商的合作,通过建立稳定的销售渠道,将产品快速推向市场。此外,公司还积极参与各种展会和论坛,展示最新技术和产品,赢得了客户和业界的广泛赞誉。

问答坊 | AI 解惑

IT行业人才前景无可限量

随着市场经济的高速发展,中国IT业步入了一个人才稀缺的时代。作为最被看好的热门专业,其迅猛发展有目共睹,从而导致IT人才的培养速度无法跟上IT行业的发展,每年的人才缺口就达数百万人。为了在激烈的就业竞争中占领一席之地,减小就业压力, ...…

查看全部问答>

从axf格式转成bin文件后,下载到板子的哪里执行?

高手们,你们好 我现在通过RealView Developement suite开发工具,编译了一个helloworld小程序 默认是生成了axf格式的执行文件 这个文件带有调试信息,和bin文件 所有通过fromelf,提取出了bin文件 但是这个bin文件,通过我在虚拟机和Linux系 ...…

查看全部问答>

wince串口问题。系统忙数据就出错

wince下串口问题,平时数据传输正常,但鼠标反复点击移动有时就会使串口数据错误,或者是界面切换时。我感觉是系统忙了有时会影响串口读取。波特率的57600,不算很高吧?缓冲区我也设置的很大了。数据没有丢失,只是出现错误。例如我发送端发的全是 ...…

查看全部问答>

usb驱动,应用程序能够打开设备,但是发送数据的时候堵在了SubmitUrb

        是什么原因使得发送数据阻塞啊? PURB pUrb = m_Endpoint2OUT.BuildBulkTransfer(                                   &nbs ...…

查看全部问答>

这个程序哪错了?

我承认我很菜,但很无奈 void Send(char val) { U1TXBUF=val;//写数据 while(!(IFG2&UTXIFG1));//等待发送完毕 P1OUT^=0x03; } char Get_Char() { while(!(IFG2&URXIFG1));//等待数据接收 return U1RXBUF; } void Init_Sys ...…

查看全部问答>

求助

用Basic Timer 定时器让P2.0口上的LED每秒闪烁一次,其中中断程序中写道“P2OUT^=BIT0;  //P2.0取反”,这样写的话,执行完中断后,LED是闪烁一次还是一直亮着呢?(我怎么觉得会一直亮着,因为P2.0一直置高呀,还是说P2.0只是在中断时间内置 ...…

查看全部问答>

请问STM32F10X_MD和STM32F10X_MD_VL区别

请问STM32F10X_MD_VL和STM32F10X_MD有什么区别啊,网上查了查,有如下说明   cl:互联型产品,stm32f105/107系列vl:超值型产品,stm32f100系列xl:超高密度产品,stm32f101/103系列ld:低密度产品,FLASH小于64Kmd:中等密度产品,FLASH=64 ...…

查看全部问答>

记住!以后不要见到什么都放0.1uF的电容

      我们在电源滤波电路上可以看到各种各样的电容,100uF,10uF,100nF,10nF不同的容值,那么这些参数是如何确定的?不要告诉我是抄别人原理图的,呵呵。         数字电路要运行稳定可靠, ...…

查看全部问答>

在DM8168中通过live555实现rtsp的直播

1、源码     http://live555.com/liveMedia/public/ 2、实现交叉编译     vim config.armlinux     修改: CROSS_COMPILE?=         arm-none-linux-gnueabi-     ./g ...…

查看全部问答>