开发板:基础MiniSTM32开发板,芯片STM32F103RETb。
1、LED的GPIO控制
通过简单的IO口高低电平的变化,加上延迟程序,可以达到不同的效果LED可控设计。
LED灯的控制
int main(void) { Stm32_Clock_Init(9); //// delay_init(72); //延迟函数初始化 LED_Init(); ///初始化和LED硬件接口 while(1) { LED0=0; //亮 LED1=1; //灭 delay_ms(200); LED0=1; LED1=0; delay_ms(200); } }
现象为两个LED灯红绿交替亮灭。
2、LED的按键控制
用开发板上载的 3 个按钮(KEY0/KEY1/WK_UP),在控制板上 2 个 LED,其中 KEY0 控制 DS0一次亮,再按一次,熄灭;KEY1 控制 DS1,效果和KEY0一样,WK_UP 同时控制按键 DS0 和 DS1.按一次,他们的状态会翻转一次。
while(1) { t=KEY_Scan(0); //得到键值 switch(t) { case KEY0_PRES: //K0按下LED0变化 LED0=!LED0; break; case KEY1_PRES://K1按下LED0变化 LED1=!LED1; break; case WKUP_PRES: //WKUP两灯都变了 LED0=!LED0; LED1=!LED1; break; default: delay_ms(10); } }
键控制函数
u8 KEY_Scan(u8 mode) { static u8 key_up=1.//按键松开标志 if(mode)key_up=1; //支持连按 if(key_up&&(KEY0==0||KEY1==0||WK_UP==1)) { delay_ms(10) key_up=0; if(KEY0==0)return KEY0_PRES; else if(KEY1==0)return KEY1_PRES; else if(WK_UP==1)return WKUP_PRES; } else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1; return 0;// 无按键按下 }
按键控制时要注意按键抖动问题,常用按键抖动和,硬件方法是利用电容器的充放电特性来平滑抖动过程中产生的电压毛刺,从而实现抖动。但在实际应用中,这种方法的效果往往不是很好,但也增加了成本和电路复杂性,因此在实践中使用不多。
常用的软件是延迟和中断延迟,
1.延迟轮询检测按钮状态。当按钮状态发生变化时,判断为有按钮动作,然后输入延迟函数;延迟时间过后,读取按钮状态。如果按钮状态仍处于按钮状态,则表明确实有按钮动作,而不是抖动。
2.中断延迟
单片机总是轮询状态会浪费很多资源,尤其是单片机运行的时间,可以通过中断方式来解决。中断模式下,单片机不需要轮询按键状态,当有中断产生的时候才会进入延时函数,进行按键去抖程序。
实现功能:LED灯变化按钮1控制红灯,按钮2控制绿灯,按钮3控制红绿灯。
3、LED的串口控制
MiniSTM32 开发板所使用的 STM32F103RCT6 最多可提供 5 路串口,分数波特率发生器支持同步单线通信和半双工单线通信 LIN、支持调制解调器操作,智能卡协议 IrDA SIR ENDEC 规范、具有 DMA等等,使用串口调试助手发送数据控制LED灯的亮灭。
while(1) { if(USART_RX_STA&0x8000) { len=USART_RX_STA&0x3fff;///获得此次收到的数据长度 printf("\r\n您发送的消息如下:\r\n"); for(t=0;t<len;t ) { USART1->DR=USART_RX_BUF[t]; while((USART1->SR&0X40)==0);/等待发送结束 } if(len<2) { LED0=!LED0; } if(len>2) { LED1=!LED1; } USART_RX_STA=0; }else { printf("请输入控制字符,以返回键结束\r\n"); delay_ms(100); } }
当串口输入数据长度大于2时,控制绿灯亮灭,输入长度小于2时,控制红灯亮灭。
通过网盘提取源码
链接:https://pan.baidu.com/s/1xvecAuFiq9LrC9wGeIDHpA
提取码:Stm3