基于STM32F103C8T6实现流水灯的操作实验
一、GPIO端口的初始化
1.配置时钟
1.找到时钟使能寄存器映射基地址即复位时钟控制
由于本次实验采用GPIOA、B、C三个端口,该三个端口又都属于APB2总线。
2.找到APB2总线端口偏移地址以及IOPA、IOPB、IOPC端口所在位置
3.使能对应端口时钟
//----------------APB2使能时钟寄存器 -------------------
#define RCC_APB2ENR *((unsigned volatile int*)0x40021018)RCC_APB2ENR|=1<<2|1<<3|1<<4;//APB2-GPIOA、GPIOB、GPIOC外设时钟使能
2.不同模式和速率设置
本次实验分别用到A4、B5、C14三个引脚,最高输出时钟频率2Mhz。
1.查找端口配置低寄存器A4、B5属于端口配置低寄存器偏移地址为0x00,C13属于端口配置高寄存器偏移地址为0x04。
2.找到GPIOx端口基地址
3.配置对应引脚寄存器,基地址+偏移量
//----------------GPIOA配置寄存器 -----------------------
#define GPIOA_CRL *((unsigned volatile int*)0x40010800)
//----------------GPIOB配置寄存器 -----------------------
#define GPIOB_CRL *((unsigned volatile int*)0x40010C00)
//----------------GPIOC配置寄存器 -----------------------
#define GPIOC_CRH *((unsigned volatile int*)0x40011004)
4.设置输出模式,输出速度2MHZ
GPIOA_CRL&=0xFFF0FFFF; //设置位 清零 GPIOA_CRL|=0x00020000; //PA4推挽输出,把第19、18、17、16位变为0010GPIOB_CRL&=0xFF0FFFFF; //设置位 清零 GPIOB_CRL|=0x00200000; //PB5推挽输出,把第23、22、21、20变为0010GPIOC_CRH&=0xFF0FFFFF; //设置位 清零 GPIOC_CRH|=0x00200000; //PC14推挽输出,把第23、22、21、20变为0010
二、原理
1.流水灯操作的引脚
位于GPIO端口:AHB总线包含RCC时钟控制,GPIO是属于APB2的。
2.流水灯原理
本次实验采用三个灯实现,亮灯状态用1表示,灭灯状态用0表示。
初始状态0 0 0,
状态一为1 0 0
状态二为0 1 0
状态三为0 0 1
状态三结束后继续进入状态一,一直循环达到流水灯效果。
3.C语言代码实现流水灯
#include "stm32f10x.h"
//----------------APB2使能时钟寄存器 ---------------------
#define RCC_APB2ENR *((unsigned volatile int*)0x40021018)
//----------------GPIOA配置寄存器 -----------------------
#define GPIOA_CRL *((unsigned volatile int*)0x40010800)
#define GPIOA_ODR *((unsigned volatile int*)0x4001080C)
//----------------GPIOB配置寄存器 -----------------------
#define GPIOB_CRL *((unsigned volatile int*)0x40010C00)
#define GPIOB_ODR *((unsigned volatile int*)0x40010C0C)
//----------------GPIOC配置寄存器 -----------------------
#define GPIOC_CRH *((unsigned volatile int*)0x40011004)
#define GPIOC_ODR *((unsigned volatile int*)0x4001100C)
//延时函数void Delay(){u32 i=0;for(;i<5000000;i++);}int main(void){ RCC_APB2ENR|=1<<2|1<<3|1<<4; //APB2-GPIOA、GPIOB、GPIOC外设时钟使能 GPIOA_CRL&=0xFFF0FFFF; //设置位 清零 GPIOA_CRL|=0x00020000; //PB5推挽输出GPIOA_ODR&=~(1<<4); //设置初始灯为灭GPIOB_CRL&=0xFF0FFFFF; //设置位 清零 GPIOB_CRL|=0x00200000; //PB5推挽输出GPIOB_ODR&=~(1<<5); //设置初始灯为灭GPIOC_CRH&=0xF0FFFFFF; //设置位 清零 GPIOC_CRH|=0x02000000; //PB5推挽输出GPIOC_ODR&=~(1<<14); //设置初始灯为灭 while(1){//A灯GPIOA_ODR|=1<<4; //PB5高电平Delay();GPIOA_ODR&=~(1<<4); //PB5低电平,因为是置0,所以用按位与//B灯GPIOB_ODR|=1<<5; //PB5高电平Delay();GPIOB_ODR&=~(1<<5); //PB5低电平,因为是置0,所以用按位与//C灯GPIOC_ODR|=1<<14; //PB5高电平Delay();GPIOC_ODR&=~(1<<14); //PB5低电平,因为是置0,所以用按位与}
}
4.汇编语言代码实现流水灯
AREA MYDATA, DATAAREA MYCODE, CODEENTRYEXPORT ledled;使能A,B,Cldr r0, =0x40021018ldr r1, =0x0000001cstr r1, [r0] ;配置端口A4ldr r0, =0x40010800ldr r1, [r0]bic r1, r1, #0x000f0000orr r1, r1, #0x00010000str r1, [r0];配置端口B5ldr r0, =0x40010c00ldr r1, [r0]bic r1, r1, #0x00f00000orr r1, r1, #0x00100000str r1, [r0];配置端口C14ldr r0, =0x40011004ldr r1, [r0]bic r1, r1, #0x0f000000orr r1, r1, #0x01000000str r1, [r0];初始为A4亮灯ldr r0, =0x4001080cldr r1, =0x00000010str r1, [r0]ldr r0, =5000000;频率ldr r1, =0;循环亮灯
blinkadd r1, r1, #1cmp r1, r0blt blink;A4灭ldr r1, =0x4001080cldr r2, [r1]eor r2, r2, #0x00000010str r2, [r1];B5亮ldr r1, =0x40010c0cldr r2, [r1]eor r2, r2, #0x00000020str r2, [r1]ldr r1, =0blink1 add r1, r1, #1cmp r1, r0blt blink1;B5灭ldr r1, =0x40010c0cldr r2, [r1]eor r2, r2, #0x00000020str r2, [r1];C14亮ldr r1, =0x4001100cldr r2, [r1]eor r2, r2, #0x00004000str r2, [r1]ldr r1, =0blink2add r1, r1, #1cmp r1, r0blt blink2;C14灭ldr r1, =0x4001100cldr r2, [r1]eor r2, r2, #0x00004000str r2, [r1];A4亮ldr r1, =0x4001080cldr r2, [r1]eor r2, r2, #0x00000010str r2, [r1]ldr r1, =0b blinkEND
四、流水灯实现过程
1.c语言实现
1.创建新项目,选择STM32C8型号的芯片,设置参数
2.设置为c语言文件
3.在output里选择create hex file生成烧录文件
4.Debug–Use Simulator
5.Source Group里创建led.c,并写入代码,注意项目结构,使用的引脚为GPIOA-5、GPIOB-9、GPIOC-14 这3个引脚上控制LED灯(最高时钟2Mhz),轮流闪烁,间隔时长1秒。并编译,编译后生成hex文件。
//--------------APB2???????------------------------
#define RCC_AP2ENR *((unsigned volatile int*)0x40021018)//----------------GPIOA????? ------------------------
#define GPIOA_CRL *((unsigned volatile int*)0x40010800)
#define GPIOA_ORD *((unsigned volatile int*)0x4001080C)
//----------------GPIOB????? ------------------------
#define GPIOB_CRH *((unsigned volatile int*)0x40010C04)
#define GPIOB_ORD *((unsigned volatile int*)0x40010C0C)
//----------------GPIOC????? ------------------------
#define GPIOC_CRH *((unsigned volatile int*)0x40011004)
#define GPIOC_ORD *((unsigned volatile int*)0x4001100C)
//-------------------???????-----------------------
void Delay_wxc( volatile unsigned int t)
{unsigned int i;while(t--)for (i=0;i<800;i++);
}
//------------------------???--------------------------
int main()
{int j=100;RCC_AP2ENR|=1<<2; //APB2-GPIOARCC_AP2ENR|=1<<3; //APB2-GPIOB RCC_AP2ENR|=1<<4; //APB2-GPIOC//????????? RCC_APB2ENR|=1<<3|1<<4;GPIOA_CRL&=0x0FFFFFFF; GPIOA_CRL|=0x20000000; //PA5GPIOA_ORD|=1<<5; GPIOB_CRH&=0xFFFFFF0F; GPIOB_CRH|=0x00000020; //PB9GPIOB_ORD|=1<<9; GPIOC_CRH&=0x0FFFFFFF; GPIOC_CRH|=0x30000000; //PC14GPIOC_ORD|=0x1<<14; while(j){ GPIOA_ORD=0x0<<0; //PB0 Delay_wxc(1000000);GPIOA_ORD=0x1<<0; //PB0Delay_wxc(1000000);GPIOB_ORD=0x0<<9; //PB9 Delay_wxc(1000000);GPIOB_ORD=0x1<<9; //PB9Delay_wxc(1000000);GPIOC_ORD=0x0<<14; //PC14Delay_wxc(1000000);GPIOC_ORD=0x1<<14; //PC14Delay_wxc(1000000);}
}
添加新项目Source Group
添加驱动文件
拷贝至保存的程序编码的文件夹中
右击文件夹,选择Add Existing Files to Group Source Group 1
在Source Group 1下添加驱动文件
6.线路的连接
USB转TTL模块和stm32f103c8t6连接引脚图如下
GND — GND
3v3 — 3v3
TXD — A10
RXD — A9
boot0设为1,boot1设为0,利用跳线帽实现
2.流水灯的实现
利用生成的hex文件使用烧录软件,对程序进行烧录。
下载mcuisp
百度云盘资源:
链接:https://pan.baidu.com/s/1TuecWD0T1HTMkEpobuesFw
提取码:visk
mcuisp软件的使用步骤:
1.双击点开mcuisp.exe
2.将Port改成连接开发板的那个端口(右键单击此电脑,点击管理,找到计算机管理->系统工具->设备管理器->端口(COM和LPT)中查看)
bps选择115200
在联机下载时的程序文件那选择keil中生成的.hex文件
3.点击STMISP
点击开始编程§,再在开发板上按住ISP按键后,同时在按下RESET 按键,松开即可
五、GPIO口的输出波形
六、总结
通过本次学习更好的理解了STM32F103系列芯片的地址映射和寄存器映射原理,完成了对流水灯程序的编译,成功实现了流水灯。学习了GPIO端口的初始化设置三步骤(时钟配置、输入输出模式设置、最大速率设置),更好的提升了动手的能力,对stm32的学习更加具有实际意义。
参考文献
烧录软件的下载
STM32寄存器点亮流水灯
基于STM32F103C8T6实现流水灯的操作实验相关推荐
- 微型计算机流水灯实验报告,广东海洋大学微型计算机基础流水灯左移右移实验报告.docx...
实验报告 课程名称: 微型计算机基础 实验项目名称:流水灯左移右移实验 时间: 2014-11-05 班级:软件 x 班 姓名: xxx 学号: xxxxxxxx 实验一:流水灯左移右移实验 实验目的 ...
- multisim13学习_基于Multisim13数字流水灯电路设计与仿真 - 镇江高专学报.PDF
基于Multisim13数字流水灯电路设计与仿真 - 镇江高专学报 第30卷第1期 镇 江 高 专 学 报 Vol.30 No.1 2017年1月 JournalofZhenjiangCollege ...
- VHDL||数字系统设计实验--基于VHDL的流水灯电路设计
实验目的: 学习设计一个流水灯电路,并在实验板验证. 学习简单时序电路的设计和硬件测试. 学习使用VHDL语言方法进行逻辑设计输入. 实验内容: 实验VHDL程序: LIBRARY IEEE; USE ...
- STM32最小系统核心板(STM32F103C8T6)实现流水灯
文章目录 一.题目要求 二.STM32简介 三.GPIO初始化 1.输入输出模式和输出速率设置 (1)找到GPIOA.GPIOB.GPIOC的地址 (2)配置对应引脚寄存器,基地址+偏移量 (3)设置 ...
- STM32F103的映射的介绍、GPIO端口初始化设置和点流水灯详细操作
文章目录 一.STM32F103的映射介绍 1.地址映射介绍 2.寄存器映射的介绍 二.GPIO端口的初始化设置 1.GIPO简介 2.时钟配置 3.输入输出模式设置 4.最大速率设置 三.实例--流 ...
- STM32F103C8T6实现流水灯
一.实验原理 1.STM32F103C8T6简介 STM32F103C8T6是一款由意法半导体公司(ST)推出的基于Cortex-M3内核的32位微控制器,硬件采用LQFP48封装,属于ST公司微控制 ...
- 基于stm32的流水灯实现
一.开发环境介绍 主控芯片: 正点原子STM32F103ZET6精英开发板 oled:中景园七针脚0.96寸oled 代码编程软件: keil5 代码下载地址: stm32流水灯项目 希望大家仔细看 ...
- 流水灯c语言实验报告心得,嵌入式流水灯实验心得体会.docx
嵌入式流水灯实验心得体会 嵌入式流水灯实验心得体会 篇一:嵌入式流水灯实验 实验三 GPIO输出控制实验 一. 实验目的 熟悉LPCXX系列ARM7微控制器的GPIO输入控制. 二.实验设备 ? 硬件 ...
- 基于STM32单片机流水灯仿真与程序设计
STM32单片机流水灯仿真与程序设计 摘要 本次程序设计和仿真是基于Proteus和keil的环境对STM32F103系列单片机进行流水灯设计,通过配置STM32的GPIO工作模式,实现LED的点亮和 ...
最新文章
- BestCoder Round #92 比赛记录
- 解决“cannot open git-receive-pack”错误
- Mysql:mysql 控制台程序的提示符 prompt 字符串设置
- JavaScript学习总结(五)——Javascript中==和===的区别
- array python 交集_NMS原理(非极大值抑制)+python实现
- 【视频】网易杭州研究院副院长汪源2016QCon大会专访
- 用Word写博客园文章
- DataGrip以超级管理员身份登录Oracle
- nginx的日志配置
- 第七节:框架搭建之页面静态化的剖析
- 深入理解JVM的内存区域划分
- Android 功耗(24)---功耗相关因子
- 使用properties和SPContext时须小心
- 6.Shell 编程从入门到精通 --- 文件和文件系统
- 图像处理之全景拼接---基于sift的全景图像拼接
- word文档怎么画流程图
- 整理arm的一些概念(ARM7、ARM9、ARM11、Cortex-A、Cortex-R、Cortex-M的区别)
- http://gm100861.blog.51cto.com/1930562/954333
- “Win7内部版本7600此Windows副本不是正版”解决方法
- [c++]巧用stl库-啤酒与尿布