完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
本次程序设计和仿真是基于Proteus和keil的环境对STM32F103系列单片机进行流水灯设计,通过配置STM32的GPIO工作模式,实现LED的点亮和熄灭;通过配置8位流水灯程序设计,实现灯的流水实现。
关键字:Proteus、keil、STM32F103、GPIO 一、工程介绍 1.1、实现要求 用STM32一个端口接8个发光二极管,编写程序,实现从左到右轮流点亮8个二极管(即流水灯)二、仿真电路设计 2.1、环境介绍 仿真采用Proteus 8.9 SP2安装链接2.2、电路设计 第一步:在Proteus中的[P]选择所需要的零件有电阻RES、LED灯LED-GREEN最后还有单片机STM32F103R6 第二步:放置STM32F103R6单片机并设置VDDA、VSSA管脚以及NRST、VBAT和BOOT0 Design->Configure Power Rails ->Power Rails 第三步:放置八个LED 为什么LED接1K的电阻,这个可以参考链接2.2.2 三、STM32单片机GPIO口介绍 3.1、GPIO框图 GPIO总体分为7个部分:
3.2、GPIO工作模式 GPIO 总共有8 种细分的工作模式 typedef enum { GPIO_Mode_AIN = 0x0, // 模拟输入 GPIO_Mode_IN_FLOATING = 0x04, // 浮空输入 GPIO_Mode_IPD = 0x28, // 下拉输入 GPIO_Mode_IPU = 0x48, // 上拉输入 GPIO_Mode_Out_OD = 0x14, // 开漏输出 GPIO_Mode_Out_PP = 0x10, // 推挽输出 GPIO_Mode_AF_OD = 0x1C, // 复用开漏输出 GPIO_Mode_AF_PP = 0x18 // 复用推挽输出 } GPIOMode_TypeDef; GPIOMode_TypeDef; 稍加整理可以大致归类为以下三类:
在输入模式时,施密特触发器打开,输出被禁止,可通过输入数据寄存器GPIOx_IDR
在输出模式中,推挽模式时双MOS 管以轮流方式工作,输出数据寄存器GPIOx_ODR
复用功能模式中,输出使能,输出速度可配置,可工作在开漏及推挽模式,但是输出四、程序设计 4.1、环境介绍 程序设计采用MDK 5.22安装链接4.2、移位程序设计 /****************************************************************************** * @brief Water_LED:流水灯实现 ******************************************************************************/ void Water_LED(void) { unsigned long int time = 0xFFFF; //设置软件延时时间 unsigned char Count = 0x00; //设置流水起始地址 unsigned char Stars = 0xFE; //设置流水灯初始状态 unsigned char Move = 0x01; //设置移动补偿 while((!((Count++)&0x08))) //循环实现8位流水灯 { GPIOC->ODR = Stars; //改变输出寄存器,改变端口状态 while(time--); //软件延时高电平持续实现 time = 0xFFFF; GPIOC->ODR = 0xFF; //消抖实现 Stars = (Stars<<1)|(Move); //补偿实现 // Stars = 0xFE (1111 1110B)左移一位为(1111 1100B)为了补偿最后一个0 //Stars| Move =(1111 1100B)| 0000 0001B)=(1111 1101B) Move = Move*2; //Move = (0000 0010B) Move ++ ; //Move = (0000 0011B) while(time--); //软件延时低电平持续时间 time = 0xFFFF; } } 4.3、GPIO口设置 /****************************************************************************** * @brief Water_GPIO_Init:流水灯GPIO口初始化 ******************************************************************************/ void Water_GPIO_Init(void) { GPIO_InitTypeDef GPIO_OUT_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能GPIO口时钟 GPIO_OUT_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; //选择指定管脚 GPIO_OUT_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD; //设置开漏输出 GPIO_OUT_InitStructure.GPIO_Speed=GPIO_Speed_2MHz; //设置输出频率 GPIO_Init(GPIOC,&GPIO_OUT_InitStructure); GPIOC->ODR = 0xFF; //初始化后LED全熄灭 } 4.4、主程序设计 int main(void) { SysClock_Configuration(RCC_PLLSource_HSI_Div2,RCC_CFGR_PLLMULL3);//设置系统时钟 Water_GPIO_Init(); //流水灯GPIO口初始化 while(1) Water_LED(); //流水灯实现 } 五、结果分析与改进 1、流水程序设计是没有考虑GPIO8~15的状态,所以GPIOC高位以上的管脚要是用到其他功能,,可能会出问题 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1278 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1290 浏览 1 评论
695 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
514 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1299 浏览 2 评论
1715浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
418浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
382浏览 3评论
371浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
345浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-18 11:59 , Processed in 0.836807 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号