文章目录

  • 题目要求
  • 一、GPIOx端口的各寄存器地址和详细参数
  • 二、用C语言 寄存器方式编程实现
    • 1.新建文件
    • 2.代码写入
      • 2.1 启动代码
        • 2.1.1 介绍启动代码
        • 2.1.2 添加启动代码
      • 2.2 写入代码
  • 三、编译调试
    • 1.编译
    • 2.调试
  • 总结

题目要求

假设你手中已有 STM32最小系统核心板(STM32F103C8T6)+面板板+3只红绿蓝LED,并搭建了电路,分别GPIOA-5、GPIOB-9、GPIOC-14 这3个引脚上控制LED灯(最高时钟2Mhz),轮流闪烁,间隔时长1秒。

1)写出程序设计思路,包括GPIOx端口的各寄存器地址和详细参数;

2)用C语言 寄存器方式编程实现。


一、GPIOx端口的各寄存器地址和详细参数

首先需要知道的是,STM32中对于GPIO口的操作,无非就是操作下面的寄存器而已,所谓的标准库也好,HAL库也好,它们都只是对操作寄存器的过程进行了封装,目的是为了减轻编程时的工作负担:

两个32位的配置寄存器:GPIOx_CRL、GPIOx_CRH两个32位数据寄存器:GPIOx_IDR、GPIOx_ODR一个32位的置位/复位寄存器:GPIOx_BSRR一个16位复位寄存器:GPIOx_BRR一个32位锁定寄存器:GPIOx_LCKR

- 时钟地址
在stm32手册中我们可以查到寄存器组起始地址,得到时钟地址如图下

- GPIO地址

可以知道时钟RCC属于AHB总线,然后GPIO端口A B C属于APB2总线。

- GPIO的配置寄存器CRL和CRH

  • 配置对应引脚寄存器,基地址+偏移量

每个 GPI/O 端口有两个 32 位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个 32
位数据寄存器(GPIOx_IDR,GPIOx_ODR),一个 32 位置位/复位寄存器
(GPIOx_BSRR),一个 16 位复位寄存器(GPIOx_BRR)和一个 32 位锁定寄存器
(GPIOx_LCKR)。
这里我们用的就是CRL和CRH,这两个寄存器的全称是:端口配置低寄存器(GPIOx_CRL) (x=A…E) 和 端口配置高寄存器(GPIOx_CRH) (x=A…E)。
根据数据手册中列出的每个 I/O 端口的特定硬件特征, GPIO 端口的每个位可以
由软件分别配置成多种模式。
− 输入浮空
− 输入上拉
− 输入下拉
− 模拟输入
− 开漏输出
− 推挽式输出
− 推挽式复用功能
− 开漏复用功能
每个 I/O 端口位可以自由编程,然而 I/0 端口寄存器必须按 32 位字被访问(不允许
半字或字节访问)。GPIOx_BSRR 和 GPIOx_BRR 寄存器允许对任何 GPIO 寄存
器的读/更改的独立访问;这样,在读和更改访问之间产生 IRQ 时不会发生危险。

//----------------GPIOA配置寄存器 -----------------------
#define GPIOA_CRL       *((unsigned volatile int*)0x40010800)
//----------------GPIOB配置寄存器 -----------------------
#define GPIOB_CRL       *((unsigned volatile int*)0x40010C00)
//----------------GPIOC配置寄存器 -----------------------
#define GPIOC_CRH       *((unsigned volatile int*)0x40011004)

CRL

CRH

  • 设置输出模式为推挽输出,输出速度为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

二、用C语言 寄存器方式编程实现

1.新建文件

打开keil5,在project下选择New uVision Project,输入文件名LEDLIGHT,然后选择与我们相符合的STM32F103C8


然后在左侧目录下点开Target 1,右键Source Group 1,选择Add New ITem to Group


然后选择C File(.c)文件

2.代码写入

2.1 启动代码

2.1.1 介绍启动代码

  1. 启动代码是一段和硬件相关的汇编代码
    主要作用如下:
    1、堆栈(SP)的初始化
    2、初始化程序计数器(PC)
    3、设置向量表异常事件的入口地址
    4、调用 main 函数
  2. ST 公司提供了 3 个启动文件给我们,分别用于不同容量的 STM32 芯片,这三个文件是:
    startup_stm32f10x_ld.s
    startup_stm32f10x_md.s
    startup_stm32f10x_hd.s
  3. 其中,ld.s 适用于小容量 产品;md.s 适用于中等容量产品;hd 适用于大容量产品;这里的容量是指 FLASH 的大小
    判断方法如下:
    小容量:FLASH≤32K
    中容量:64K≤FLASH≤128K
    大容量:256K≤FLASH
  4. 查阅数据手册,可知C8T6的Flash容量为128K,属于中容量,因此这里采用startup_stm32f10x_md.s作为启动文件

2.1.2 添加启动代码

  • STM32F103C8T6核心板启动文件下载链接:
    链接:https://pan.baidu.com/s/1Elgc4nvxXjiHLSZ2nXnSCQ
    提取码:bmba
    解压后找到md.s后缀的启动文件


将这个启动文件复制粘贴到文件夹下


在keil里,左侧Target 1目录下双击Source Group 1,发现找不到刚才添加的启动文件,需要将类型改成all,找到刚才添加的md.s文件,点击Add

  • 点开小蓝棒图标,在output下勾选creat hex file,这里是后面要用。

2.2 写入代码

代码如下


//--------------APB2使能时钟寄存器------------------------
#define RCC_AP2BENR *((unsigned volatile int*)0x40021018)//----------------GPIOA配置寄存器 ------------------------
#define GPIOA_CRL   *((unsigned volatile int*)0x40010800)
#define GPIOA_ODR   *((unsigned volatile int*)0x4001080C)
//----------------GPIOB配置寄存器 ------------------------
#define GPIOB_CRH   *((unsigned volatile int*)0x40010C04)
#define GPIOB_ODR   *((unsigned volatile int*)0x40010C0C)
//----------------GPIOC配置寄存器 ------------------------
#define GPIOC_CRH   *((unsigned volatile int*)0x40011004)
#define GPIOC_ODR   *((unsigned volatile int*)0x4001100C)
//-------------------简单的延时函数-----------------------
void SystemInit(void);
void Delay_ms(volatile  unsigned  int);
void A_LED_LIGHT(void);
void B_LED_LIGHT(void);
void C_LED_LIGHT(void);
void  Delay_ms( volatile  unsigned  int  t)
{unsigned  int  i;while(t--)for (i=0;i<800;i++);
}
void A_LED_LIGHT(){GPIOA_ODR=0x0<<5;     //PA5低电平GPIOB_ODR=0x1<<9;        //PB9高电平GPIOC_ODR=0x1<<14;       //PC14高电平
}
void B_LED_LIGHT(){GPIOA_ODR=0x1<<5;     //PA5高电平GPIOB_ODR=0x0<<9;        //PB9低电平GPIOC_ODR=0x1<<14;       //PC14高电平
}
void C_LED_LIGHT(){GPIOA_ODR=0x1<<5;     //PA5高电平GPIOB_ODR=0x1<<9;        //PB9高电平GPIOC_ODR=0x0<<14;       //PC14低电平
}
//------------------------主函数--------------------------
int main()
{int j=100;RCC_APB2ENR|=1<<2;           //APB2-GPIOA外设时钟使能RCC_APB2ENR|=1<<3;         //APB2-GPIOB外设时钟使能  RCC_APB2ENR|=1<<4;           //APB2-GPIOC外设时钟使能//这两行代码可以合为 RCC_APB2ENR|=1<<3|1<<4;GPIOA_CRL&=0xFF0FFFFF;       //设置位 清零    GPIOA_CRL|=0X00200000;     //PA5推挽输出GPIOA_ODR|=1<<5;            //设置PA5初始灯为灭GPIOB_CRH&=0xFFFFFF0F;     //设置位 清零    GPIOB_CRH|=0x00000020;     //PB9推挽输出GPIOB_ODR|=0x1<<9;          //设置初始灯为灭GPIOC_CRH&=0xF0FFFFFF;        //设置位 清零GPIOC_CRH|=0x02000000;     //PC14推挽输出GPIOC_ODR|=0x1<<14;            //设置初始灯为灭   while(j){   A_LED_LIGHT();  Delay_ms(1000000);B_LED_LIGHT();Delay_ms(1000000);C_LED_LIGHT();Delay_ms(1000000);}
}
void SystemInit(){}

三、编译调试

1.编译

点击左上角的build图标,然后看到无报错警告,且已自动生成hex文件


2.调试

点击debug图标开始调试,发现出现以下错误



解决方案:我们点开小蓝棒图标,然后打开debug下,勾选Use Simulator.然后点击Utilities,取消勾选Use Debug Driver,点击setting,然后跳出来一个窗口,勾选reset and run。



  • 此时,就能调试成功了


总结

这篇文章简单介绍了用STM32最小系统核心板(STM32F103C8T6)+面板板+3只红绿蓝LED,并搭建了电路,分别GPIOA-5、GPIOB-9、GPIOC-14 这3个引脚上控制LED灯(最高时钟2Mhz),轮流闪烁,间隔时长1秒。写出了包括GPIOx端口的各寄存器地址和详细参数和用C语言 寄存器方式编程实现。

以TM32最小系统核心板(STM32F103C8T6)为主,实现led流水灯相关推荐

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

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

  2. 【嵌入式知识07】借助stm32CubeMX,使用STM32F103C8T6点亮LED流水灯

    本文目录 一.简述 二.STM32CubeMX简介 1.利用CubeMX新建工程点亮LED灯 1)前期准备 2)新建工程 2.界面讲解 3.配置引脚 4.时钟源配置 5.工程管理 三.点亮LED 1. ...

  3. arm ds开发基于iTOP4412开发板的纯汇编LED流水灯

    前言 arm ds软件作为arm公司发布的ADS.DS5软件的延续,具备前两款软件的所有功能.同时将Keil MDK单片机开发软件的功能直接整合到了arm ds软件中.现在arm ds就相当于DS5+ ...

  4. 【嵌入式08】STM32F103C8T6寄存器方式借助面包板点亮LED流水灯详解

    文章目录 一.题目简述 二.简述:初始化GPIO,点亮LED灯 三.工程文件模板的建立 四.使用寄存器点亮LED灯--代码部分 1.硬件连接设计 2.打开之前建立的工程模板 3.代码编写 4.硬件连接 ...

  5. 【2022河南省电赛】SWM181最小系统核心板-开源

    SWM181CBT6核心板 写在前面 在2022"数智中原"河南省大学生电子设计大赛的来临之际,河南省电赛组委会也向大家公开部分竞赛信息.主控(MCU)是体现一个系统性能的重要部分 ...

  6. 【stm32】如何把原子哥的代码移植到最小系统板stm32f103c8t6 以跑马灯实验为例

    [stm32]如何把原子哥的代码移植到最小系统板stm32f103c8t6 以跑马灯实验为例 外部硬件: stm32仿真编程器 (仿真编制器自己在网上买,不确定买哪个的可以就买我这个,图片上有牌子,自 ...

  7. 最小系统开发板——利用STM32F103C8T6实现LED流水灯

    WeChat:[嵌入式工程师成长日记] https://mp.weixin.qq.com/s?__biz=Mzg4Mzc3NDUxOQ==&mid=2247484101&idx=3&a ...

  8. STM32F103C8T6以寄存器方式借助面包板搭建电路点亮LED流水灯详解

    文章目录 一.寄存器原理 1.什么是寄存器 2.如何访问寄存器 二.GPIO端口的初始化设置 1.时钟配置 (1)找到时钟使能寄存器映射基地址 (2)找到端口偏移地址以及对应端口所在位置 (3)使能对 ...

  9. c语言intrins头文件,结合单片机学习板学习c语言之流水灯制作 intrins.h头文件

    原标题:结合单片机学习板学习c语言之流水灯制作 intrins.h头文件 目的:实现流水灯. 本文引用地址:http://www.eepw.com.cn/article/201608/294948.h ...

最新文章

  1. 新战场路在何方——详解360金融数据中台之旅
  2. 一篇文章一张思维导图看懂Android学习最佳路线
  3. linux启动java jar文件_推荐:Linux启动Java程序jar包Shell脚本
  4. 排除瓶颈和加速django项目
  5. 封装CopyFileEx函数,实现文件复制中的暂停,控速,获取进度。
  6. 关于json格式字符串解析并用mybatis存入数据库
  7. [css] 你有没有自己写过一套UI库?说下遇到哪些难点?
  8. 如何解决IE6的3像素问题?
  9. (转)Spring Boot 2 (六):使用 Docker 部署 Spring Boot 开源软件云收藏
  10. Gstreamer之video转码(七)
  11. Atitit 类库冲突 解决方案
  12. tourex旅游系统 php,TourEx 旅游电商系统B2C_B2B2C v7.0升级V8.0 旅游源码系统无限制版源码工程源码...
  13. C语言里程序编译无误但运行会弹出程序已停止运行是为什么?
  14. HTML+CSS实现登陆界面
  15. FastReport .NET 2022.3.6-新版Crack
  16. 【100+ python基础入门-32】元组元素的增删改查操作方法总结
  17. python恶搞小程序 画樱花树+启动摄像头+拍照+通过邮件发回+删除照片
  18. linux医疗工作站,门诊医生工作站的详细设计
  19. 【GitHub上传文件夹:bug】 ! [rejected] master - master (non-fast-forward)
  20. Beyond Compare下载安装

热门文章

  1. 【无标题】我的《计算机网络》学习笔记:第一篇、计算机网络概述
  2. java imageicon大小_Java 自动缩放ImageIcon到标签大小
  3. 【AD】Altium Designer Filter(过滤器)使用技巧
  4. 弹窗开启以及关闭(“closest”用法)
  5. 【例26图片的加密解密操作】
  6. 自定义View实现五子棋游戏
  7. java炼精化气之数组上山
  8. ps基本操作以及盒子综合案例、圆角边框、盒子阴影、文字阴影
  9. Webmin安装过程及问题解决
  10. 用python画树林_用python画樱树