用STM32F103C8芯片做流水灯
目录
一、STM32F103C8T6简介
二、使用寄存器点亮LED灯
1.工程模板的建立
2.建立工程
3.主要函数代码
4.编译生成HEX文件
5.电路搭建
6.用串口下载程序
7.实验结果
一、STM32F103C8T6简介
根据STM32&STM8产品型号命名规则(参考:STM32单片机最小系统详解)可知: STM32F103C8T6这个命名中:STM32代表STM32家族,32位MCUF代表产品类型为基础型;
103代表特定功能为STM32基础型;C代表引脚数为48&49引脚;8代表内存容量为64KB;T代表封装为QFP;6代表温度范围为-40到+85℃。
STM32原理图
二、使用寄存器点亮LED灯
1.工程模板的建立
新建一个文件夹用来存放项目的全部程序,然后再建CORE,HARDWARE,OBJ,USER,STM32F10x_FWLib,SYSTEM这六个文件夹。其中,HARDWARE文件夹是用来存放外设硬件代码,OBJ用来存放生成调试代码,FWLIB是各种.c和.h文件,如图:
其中每个文件夹包含的文件如下:
可以在正点原子openedv资料下载地址下载mini板的rct6资料,开发板的例程
2.建立工程
先打开 Keil uVision5->project->New uVision Project将其保存到USER文件夹中,然后芯片这里我们选择STM32F103C8
弹出Manage Run-time Environment窗口,选择取消
3.添加项目所需要的分组以及文件
右击Target 1->Manage Project Items…
然后创建Groups名字,点击右边的Add Files…按钮添加相应的文件,结果如图所示
添加后可在工作栏中查看
4.配置Options for Target 'Target 1’
点击魔法棒->Target,可以看到STM芯片为STM32F103C8,修改晶振频率值为8
点击Output,其中select folder for objects是选择生成的hex存放的目录,这里选择存放在建立的OBJ文件夹中,Create HEX File用于生成可执行代码文件
然后点击C/C++,将Define设置为USE_STDPERIPH_DRIVER,STM32F10X_MD,然后点击右下方的添加按钮添加Include Paths的路径
最终结果如图
3.主要函数代码
main.c
#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
int main(void)
{ LED_Init(); delay_init(); while(1) {LED_R_TOGGLE();delay_ms(500); LED_G_TOGGLE();delay_ms(500); LED_Y_TOGGLE();delay_ms(500); }
}
led.c
#include "led.h"
#include "delay.h"void LED_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE); GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4 ; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz; GPIO_Init(GPIOA,&GPIO_InitStruct);GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10 ; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz; GPIO_Init(GPIOB,&GPIO_InitStruct);GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin=GPIO_Pin_14 ; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz; GPIO_Init(GPIOC,&GPIO_InitStruct);
}void LED_R_TOGGLE(void)
{GPIO_SetBits(GPIOA, GPIO_Pin_4);delay_ms(500);GPIO_ResetBits(GPIOA,GPIO_Pin_4);
}
void LED_G_TOGGLE(void)
{GPIO_SetBits(GPIOB, GPIO_Pin_10);delay_ms(500);GPIO_ResetBits(GPIOB,GPIO_Pin_10);
}
void LED_Y_TOGGLE(void)
{GPIO_SetBits(GPIOC, GPIO_Pin_14); delay_ms(500);GPIO_ResetBits(GPIOC,GPIO_Pin_14);
}
led.h
#ifndef _LED_H
#define _LED_H#include "stm32f10x.h"
void LED_R_TOGGLE(void);
void LED_G_TOGGLE(void);
void LED_Y_TOGGLE(void);
void LED_Init(void);
#endif
delay.c
#include "delay.h"
#if SYSTEM_SUPPORT_OS
#include "includes.h"
#endif
static u8 fac_us=0;
static u16 fac_ms=0;
#if SYSTEM_SUPPORT_OS
#ifdef OS_CRITICAL_METHOD
#define delay_osrunning OSRunning
#define delay_ostickspersec OS_TICKS_PER_SEC
#define delay_osintnesting OSIntNesting
#endif
#ifdef CPU_CFG_CRITICAL_METHOD
#define delay_osrunning OSRunning
#define delay_ostickspersec OSCfg_TickRate_Hz
#define delay_osintnesting OSIntNestingCtr
#endifvoid delay_osschedlock(void)
{
#ifdef CPU_CFG_CRITICAL_METHOD OS_ERR err; OSSchedLock(&err);
#else OSSchedLock();
#endif
}void delay_osschedunlock(void)
{
#ifdef CPU_CFG_CRITICAL_METHOD OS_ERR err; OSSchedUnlock(&err);
#else OSSchedUnlock();
#endif
}
void delay_ostimedly(u32 ticks)
{
#ifdef CPU_CFG_CRITICAL_METHODOS_ERR err; OSTimeDly(ticks,OS_OPT_TIME_PERIODIC,&err);
#elseOSTimeDly(ticks);
#endif
}//systick??????,??ucos???
void SysTick_Handler(void)
{ if(delay_osrunning==1) {OSIntEnter(); OSTimeTick(); OSIntExit(); }
}
#endifvoid delay_init()
{
#if SYSTEM_SUPPORT_OS u32 reload;
#endifSysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); fac_us=SystemCoreClock/8000000;
#if SYSTEM_SUPPORT_OS reload=SystemCoreClock/8000000; reload*=1000000/delay_ostickspersec; fac_ms=1000/delay_ostickspersec; SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk; SysTick->LOAD=reload; SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; #elsefac_ms=(u16)fac_us*1000;
#endif
} #if SYSTEM_SUPPORT_OS void delay_us(u32 nus)
{ u32 ticks;u32 told,tnow,tcnt=0;u32 reload=SysTick->LOAD; ticks=nus*fac_us; tcnt=0;delay_osschedlock(); told=SysTick->VAL; while(1){tnow=SysTick->VAL; if(tnow!=told){ if(tnow<told)tcnt+=told-tnow; else tcnt+=reload-tnow+told; told=tnow;if(tcnt>=ticks)break; } };delay_osschedunlock();
}void delay_ms(u16 nms)
{ if(delay_osrunning&&delay_osintnesting==0) { if(nms>=fac_ms) { delay_ostimedly(nms/fac_ms); }nms%=fac_ms; }delay_us((u32)(nms*1000));
}
#else
void delay_us(u32 nus)
{ u32 temp; SysTick->LOAD=nus*fac_us; SysTick->VAL=0x00; SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; do{temp=SysTick->CTRL;}while((temp&0x01)&&!(temp&(1<<16))); SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; SysTick->VAL =0X00;
}
void delay_ms(u16 nms)
{ u32 temp; SysTick->LOAD=(u32)nms*fac_ms; SysTick->VAL =0x00; SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; do{temp=SysTick->CTRL;}while((temp&0x01)&&!(temp&(1<<16))); SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; SysTick->VAL =0X00;
}
#endif
delay.h
#ifndef __DELAY_H
#define __DELAY_H
#include "sys.h" void delay_init(void);
void delay_ms(u16 nms);
void delay_us(u32 nus);#endif
4.编译生成HEX文件
5.电路搭建
搭建的电路图如下:
6.用串口下载程序
实验用到的STM32 开发板的,USB 转串口的驱动芯片是 CH340,所以要先在电脑中安装 USB 转串口驱动CH340 版本可以在右击此电脑->管理->设备管理器,查看是否成功
打开FlyMcu
注意
1.搜索串口,设置波特率 115200(尽量不要设置的太高)
2.选择校验、编程后执行
3.选择生成hex
4.DTR 低电平复位,RTS 高电平进入 bootloader
5.开始编程
7.实验结果
总结:通过这次试验我学会了做STM32F103C8芯片流水灯
参考文献:(7条消息) stm32f103c8t6工程模板的建立_你努力的样子,优秀至极-CSDN博客_stm32f103c8t6工程模板
(5条消息) STM32F103寄存器方式点亮LED流水灯_爱吃丫的博客-CSDN博客
用STM32F103C8芯片做流水灯相关推荐
- 8盏流水灯反向闪烁c语言,课程设计(论文)_利用8255A芯片实现流水灯闪烁设计.doc...
课程设计(论文)_利用8255A芯片实现流水灯闪烁设计 利用8255A芯片实现流水灯闪烁设计 27 - 目录 摘要··········································· ...
- 灵动微电子MM32L0系列芯片做呼吸灯功能
呼吸灯就是指电子产品上的LED灯的亮度随着时间由暗到亮逐渐增强,再由亮到暗逐渐衰减,有节奏感地一起一伏,就像是在呼吸一样,因而被广泛应用于手机.电脑等电子设备的指示灯中.在使用MCU开发相关的应用产品 ...
- 微型计算机知识做流水灯,微机原理流水灯的设计.doc
微机原理流水灯的设计 微机原理课程设计报告书 课题名称流水彩灯的设计姓 名学 号 院.系.部物理与电信工程系专 业电子信息工程指导教师 2010年 7 月9日 一.设计任务及要求1.编写程序,使用82 ...
- 【Keil5 C51】AT89C52 做流水灯实验(调用C51的库函数_crol_)
_crol_ 函数的介绍 Cx51 User's Guide Summary #include <intrins.h>unsigned char _crol_ (unsigned char ...
- 关于intrins.h头文件的介绍,做流水灯时候更方便
先来个示例..循环左移..体现在开发板上是流水灯(从左到右) #include <reg52.h> #include<intrins.h> #define uchar unsi ...
- 2.STC89C52RC芯片之流水灯程序
这里编程软件使用keil 4和程序下载软件ISP. 程序下载需冷启动和转换为hex文件 流水灯效果图 YL-39开发板 #include <REGX52.H> /*头文件*/ #inclu ...
- pynq-z2 使用PL做流水灯
一 实验目标 轮流点亮开发板下面的4颗LED灯 二 实验步骤 启动Vivado,点击创建一个新工程,工程名为turn_led 选择RTL工程 选择开发板Boards,在其中选择PYNQ-Z2 点击Ad ...
- plc的移位指令C语言实现,移位指令做流水灯-PLC中使用移位指令是如何实现移位动作的-电气资讯 - 电工屋...
移位指令的详述 一般格式 移位操作符(如SHR) OPR,CNT. 其中OPR用除立即数外的任何寻址方式.移位次数由CNT决定,在8086中可以是1或CL,CNT为1时只移一位:如果需要移位的次数大于 ...
- 80c51流水灯汇编语言,单片机AT89C51可控流水灯课程设计报告(汇编语言).docx
单片机AT89C51可控流水灯课程设计报告(汇编语言).docx 目录目录1第一章 课题的意义及应用2第二章 系统的总体设计32.1 设计方法32.2 数码管显示方案32.3 键盘输入方案4第三章 硬 ...
- 51单片机LED流水灯、走马灯的实现
目录 1. 硬件设计 2. 软件设计 流水灯: 跑马灯: 1. 硬件设计 流水灯的原理: 图中主要包括51单片机芯片和流水灯模块,流水灯模块接在了单片机的P2口,500欧电阻是用来保护电路的.由原理图 ...
最新文章
- 【组合数学】组合恒等式 ( 变上项求和 1 组合恒等式 | 三种组合恒等式证明方法总结 | 证明变上项求和 1 组合恒等式 )
- python包介绍:numpy
- gem ransack(4000✨) 简单介绍
- open,write,read与fopen,fwrite,fread的区别
- sqlserver随机取记录
- LeetCode(637)——二叉树的层平均值(JavaScript)
- 网络蛋白质组学在计算机中应用,Mumford Shah算法研究及其在拓扑蛋白质组学中的应用...
- lidar与相机联合标定开源软件介绍
- 机器学习笔记(二十):逻辑回归(2)
- LCM模组的简介与质量管理(连载四)
- messagedigest 图片加密_MessageDigest对密码进行加密
- 操作系统的几种基本类型
- Ubuntu下使用“Windows徽标键+R”打开终端
- 苹果弃用 3D Touch!
- 类和对象:类与对象定义
- 机器学习(Machine Learning)深度学习(Deep Learning)资料汇总
- MySQL8.0地理空间数据库的QGIS应用浅析
- 08 基础代谢率计算
- Xshell的快捷键(非常实用)
- 有没有这样一个冷笑话,突然把你萌翻了~~~
热门文章
- 批量导出Outlook所有联系人到vcard文件
- 魔兽是用Python开发的,一起看看Python开发的知名网站和游戏!
- 将自己的app加入到分享列表中,并适配锤子的one step功能
- ubuntu10.10下smbd服务配置——实现主机WinXP与虚拟机Ubuntu10.10共享
- 葫芦娃系列棋牌服务器在哪里,葫芦娃—【关服】葫芦娃关服公告
- 安卓集成facebook_设计和编码集成的Facebook应用程序:理论
- 保险精算笔记Chapter02
- 快速学习-Ballot -- 一个简单的投票合约
- MiniGUI源码分析——GDI概览及Surface
- 初探摩根大通的企业级以太坊区块链解决方案—Quorum