基于Keil_uVision5中的STM32F103C8编程(一)简易流水灯的实现及拓展_百...

基于Keil_uVision5中的STM32F103C8编程(⼀)简易流⽔灯的实现及拓展简易流⽔灯的实现及拓展
基本信息
最后⼀次修改时间:2019/8/29
参考⽂献:STM32固件库说明(中⽂版)
黄豆苷元流⽔灯原理师东兵
流⽔灯
流⽔灯指的是若⼲盏灯的⼀种明暗组合,简单来说,就是⼀排⼩灯依次点亮并熄灭,在视觉上形成流⽔的效果。实现流⽔灯需要初始化外设时钟、初始化灯的管脚
如何定义时间
1.函数 RCC_APB2PeriphClockCmd
作⽤:初始化外设时钟,可以理解为就是让你的板⼦的外设时钟GPIOA初始化,它就可以认知时间。
函数名RCC_APB2PeriphClockCmd备注
函数原形void RCC_APB2PeriphClockCmd(u32 RCC_APB2Periph, FunctionalState
NewState)
功能描述使能或者失能 APB2 外设时钟
输⼊参数
1RCC_APB2Periph: 门控 APB2 外设时钟
参数取RCC_APB2Periph_GPIOA,意义是GPIOA
时钟
输⼊参数
2
NewState:指定外设时钟的新状态参数取ENABLE 或者 DISABLE 如何点亮⼩灯
1.⾸先认识⼀下GPIO_InitTypeDef类型;连接管脚以后,就可以通过修改代码中的变量来指定板⼦中⼩灯的⾏为逻辑。GPIO_InitTypeDef 定义于⽂件“stm32f10x_gpio.h”
typedef struct
{
u16 GPIO_Pin;
GPIOSpeed_TypeDef GPIO_Speed;
GPIOMode_TypeDef GPIO_Mode;
} GPIO_InitTypeDef;
GPIO_Pin改参数选择管脚,使⽤操作符“|”可以⼀次选中多个管脚;GPIO_Speed⽤以设置选中管脚的速率;
GPIO_Mode ⽤以设置选中管脚的⼯作状态
2.函数 GPIO_Init;初始化外设寄存器
函数名GPIO_Init
函数原形void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)功能描述根据 GPIO_InitStruct 中指定的参数初始化外设 GPIOx 寄存器
中国糖酒招商网输⼊参数 1GPIOx:x 可以是 A,B,C,D 或者 E,来选择 GPIO 外设
输⼊参数 2GPIO_InitStruct:指向结构 GPIO_InitTypeDef 的指针,包含了外设 GPIO 的配置信息
3.函数GPIO_SetBits;设置数据端⼝位就像是把管脚从0置为1,实现了点亮管脚连接的⼩灯
函数名GPIO_SetBits
函数原形void GPIO_SetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)
功能描述设置指定的数据端⼝位
输⼊参数 1GPIOx:x 可以是 A,B,C,D 或者 E,来选择 GPIO 外设
输⼊参数 2GPIO_Pin:待设置的端⼝位
4.函数GPIO_ResetBits;同上,把管脚从1置为0,实现了熄灭管教连接的⼩灯
函数名GPIO_ResetBits
函数原形void GPIO_ResetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)
清除指定的数据端⼝位
输⼊参数 1GPIOx:x 可以是 A,B,C,D 或者 E,来选择 GPIO 外设
输⼊参数 2GPIO_Pin:待清除的端⼝位,该参数可以取 GPIO_Pin_x(x 可以是 0-15)的任意组合
项⽬⽂件同代码实现
1.led.c⽂件
包含了初始化灯以及全亮,全灭,闪烁以及流⽔灯等函数,设置好led.h的头⽂件以后可以根据需要直接在main.c上使⽤
#include "led.h"
/*⼀个延迟函数,本质是双重循环。在8MHZ的晶振下,达到延时的⽬的。(不能控制具体的时间,只能做到有个明显的延迟,time的单位约为秒)*/ void delay(int time){
for(int i = 0;i < time ;i++){
int j = 1000000;
while(j--){};
}
return;
}
/*初始化管脚,GPIO_PIN_1即为灯1的管脚*/
void led_configer(){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//Clock initialize
GPIO_InitTypeDef GPIO_LED_INIT;//define a Variable of GPIO_InitTypeDef
GPIO_LED_INIT.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
GPIO_LED_INIT.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_LED_INIT.GPIO_Mode = GPIO_Mode_Out_PP;//Push-pull output
GPIO_Init(GPIOA,&GPIO_LED_INIT);  //GPIO initialize
}
/*逻辑同上,但是⽤4个变量来连接4个灯的管脚,这样可以实现分别控制4个灯的明暗变化,⽤于流⽔灯*/
void _4led_configer(){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_LED_INIT1;
GPIO_InitTypeDef GPIO_LED_INIT2;
GPIO_InitTypeDef GPIO_LED_INIT3;
GPIO_InitTypeDef GPIO_LED_INIT4;
GPIO_LED_INIT1.GPIO_Pin = GPIO_Pin_1;
GPIO_LED_INIT1.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_LED_INIT1.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_LED_INIT2.GPIO_Pin = GPIO_Pin_2;
GPIO_LED_INIT2.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_LED_INIT2.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_LED_INIT3.GPIO_Pin = GPIO_Pin_3;
GPIO_LED_INIT3.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_LED_INIT3.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_LED_INIT4.GPIO_Pin = GPIO_Pin_4;
GPIO_LED_INIT4.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_LED_INIT4.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,&GPIO_LED_INIT1);
GPIO_Init(GPIOA,&GPIO_LED_INIT2);
GPIO_Init(GPIOA,&GPIO_LED_INIT3);
GPIO_Init(GPIOA,&GPIO_LED_INIT4);
}
/*全亮*/
void led_all_on(){
GPIO_SetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4);
}
/*全灭*/
void led_all_off(){
GPIO_ResetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4); }
越战忠魂/* 4个灯同时闪烁,注意使⽤了⼀个while(1)的死循环*/
void led_on_off(int time){
while(1){
GPIO_SetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4);    delay(time);
GPIO_ResetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4);    delay(time);
}
}
/* 流⽔灯 */
void water_led(int time){
GPIO_SetBits(GPIOA,GPIO_Pin_1);
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
GPIO_ResetBits(GPIOA,GPIO_Pin_3);
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
while(1){
delay(time);
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
GPIO_SetBits(GPIOA,GPIO_Pin_1);
delay(time);
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
成长的烦恼初中作文GPIO_SetBits(GPIOA,GPIO_Pin_2);
delay(time);
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
GPIO_SetBits(GPIOA,GPIO_Pin_3);
delay(time);
GPIO_ResetBits(GPIOA,GPIO_Pin_3);
GPIO_SetBits(GPIOA,GPIO_Pin_4);
拉萨新增225例本土无症状}
}
2.led.h
#ifndef _LED_H
#define _LED_H
#include<stm32f10x.h>//引⼊驱动STM32的头⽂件,必须得有
void delay(int time); //delay to execute
void led_configer(void); //Intialize all the light by 1 GPIO_InitTypeDef
void _4led_configer(void); // Intialize all the light by 4 GPIO_InitTypeDef
void led_all_on(void); //Open all the light
void led_all_off(void); //Close all the light
void led_on_off(int time); // Glint the light by time
void water_led(int time);  //Open the light in a sequence
#endif
拓展与思考
1.在初始化管脚以后,4个灯的亮灭可以任意组合,只要使⽤GPIO_SetBits(GPIOx,GPIO_Pin_x);和GPIO_ResetBits(GPIOx,GPIO_Pin_x)在delay延时函数的配合下做出想要的任何变化。
2.未完成,待修改
备注
1.这是编者的第⼀篇⼩博客,如有不对的地⽅或是不规范的地⽅,请及时指出。
2.关于使⽤的函数的详细信息,可以通过上传的STM32固件库说明(中⽂版)查看

本文发布于:2024-09-21 15:31:06,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/570783.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:外设   管脚   实现
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议