一、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实现流水灯的操作实验相关推荐

  1. 微型计算机流水灯实验报告,广东海洋大学微型计算机基础流水灯左移右移实验报告.docx...

    实验报告 课程名称: 微型计算机基础 实验项目名称:流水灯左移右移实验 时间: 2014-11-05 班级:软件 x 班 姓名: xxx 学号: xxxxxxxx 实验一:流水灯左移右移实验 实验目的 ...

  2. multisim13学习_基于Multisim13数字流水灯电路设计与仿真 - 镇江高专学报.PDF

    基于Multisim13数字流水灯电路设计与仿真 - 镇江高专学报 第30卷第1期 镇 江 高 专 学 报 Vol.30 No.1 2017年1月 JournalofZhenjiangCollege ...

  3. VHDL||数字系统设计实验--基于VHDL的流水灯电路设计

    实验目的: 学习设计一个流水灯电路,并在实验板验证. 学习简单时序电路的设计和硬件测试. 学习使用VHDL语言方法进行逻辑设计输入. 实验内容: 实验VHDL程序: LIBRARY IEEE; USE ...

  4. STM32最小系统核心板(STM32F103C8T6)实现流水灯

    文章目录 一.题目要求 二.STM32简介 三.GPIO初始化 1.输入输出模式和输出速率设置 (1)找到GPIOA.GPIOB.GPIOC的地址 (2)配置对应引脚寄存器,基地址+偏移量 (3)设置 ...

  5. STM32F103的映射的介绍、GPIO端口初始化设置和点流水灯详细操作

    文章目录 一.STM32F103的映射介绍 1.地址映射介绍 2.寄存器映射的介绍 二.GPIO端口的初始化设置 1.GIPO简介 2.时钟配置 3.输入输出模式设置 4.最大速率设置 三.实例--流 ...

  6. STM32F103C8T6实现流水灯

    一.实验原理 1.STM32F103C8T6简介 STM32F103C8T6是一款由意法半导体公司(ST)推出的基于Cortex-M3内核的32位微控制器,硬件采用LQFP48封装,属于ST公司微控制 ...

  7. 基于stm32的流水灯实现

    一.开发环境介绍 主控芯片:  正点原子STM32F103ZET6精英开发板 oled:中景园七针脚0.96寸oled 代码编程软件: keil5 代码下载地址: stm32流水灯项目 希望大家仔细看 ...

  8. 流水灯c语言实验报告心得,嵌入式流水灯实验心得体会.docx

    嵌入式流水灯实验心得体会 嵌入式流水灯实验心得体会 篇一:嵌入式流水灯实验 实验三 GPIO输出控制实验 一. 实验目的 熟悉LPCXX系列ARM7微控制器的GPIO输入控制. 二.实验设备 ? 硬件 ...

  9. 基于STM32单片机流水灯仿真与程序设计

    STM32单片机流水灯仿真与程序设计 摘要 本次程序设计和仿真是基于Proteus和keil的环境对STM32F103系列单片机进行流水灯设计,通过配置STM32的GPIO工作模式,实现LED的点亮和 ...

最新文章

  1. BestCoder Round #92 比赛记录
  2. 解决“cannot open git-receive-pack”错误
  3. Mysql:mysql 控制台程序的提示符 prompt 字符串设置
  4. JavaScript学习总结(五)——Javascript中==和===的区别
  5. array python 交集_NMS原理(非极大值抑制)+python实现
  6. 【视频】网易杭州研究院副院长汪源2016QCon大会专访
  7. 用Word写博客园文章
  8. DataGrip以超级管理员身份登录Oracle
  9. nginx的日志配置
  10. 第七节:框架搭建之页面静态化的剖析
  11. 深入理解JVM的内存区域划分
  12. Android 功耗(24)---功耗相关因子
  13. 使用properties和SPContext时须小心
  14. 6.Shell 编程从入门到精通 --- 文件和文件系统
  15. 图像处理之全景拼接---基于sift的全景图像拼接
  16. word文档怎么画流程图
  17. 整理arm的一些概念(ARM7、ARM9、ARM11、Cortex-A、Cortex-R、Cortex-M的区别)
  18. http://gm100861.blog.51cto.com/1930562/954333
  19. “Win7内部版本7600此Windows副本不是正版”解决方法
  20. [c++]巧用stl库-啤酒与尿布

热门文章

  1. 华为HCIA(RS网络工程师)2021题库
  2. 招行信用卡笔试题:卡中心美食家
  3. linux查看日志文件(zip/log)命令
  4. ISO-12233图卡
  5. matlab stem中的n,matlab中stem函数的使用
  6. 电商网站,商品规格的设计思路
  7. HCIP之排障(三)ISIS故障排除
  8. BERT引发的深度学习2
  9. python解密(LinkedIn)领英邮箱激活链接验证并获取真实验证链接
  10. 初识 jquery.simulate.js 模拟键盘事件