当前位置: 首页 > news >正文

点亮第一个LED灯

文章目录

  • 一、查手册
  • 二、寄存器
    • 2.1.使能 APB2 时钟
    • 2.2.配置为输出模式
    • 2.3.输出高低电平
  • 三、代码编写

一、查手册

本文章通过汇编和简单的 C 语言操控 STM32F103C8T6 的 GPIO 寄存器,进行控制测试灯的闪烁。使用外设之前,必须查看手册,了解了 GPIO 的基地址和偏移值,即可操控某个寄存器。在 STM32F10xxx 参考手册里找到:

在这里插入图片描述

红色框是 RCC 的基地址,用来开启 GPIOC 的时钟。

在这里插入图片描述
在这里插入图片描述
其中 0x4001 1000 就是 GPIOC 的基地址。

二、寄存器

通过手册里面的介绍,每个寄存器都会有它的地址,它的绝对地址是基地址 + 偏移地址。

2.1.使能 APB2 时钟

GPIO 是挂载在 APB2 总线上面的,使用该外之前必须开启它的时钟:

在这里插入图片描述
在这里插入图片描述

RCC_APB2ENR 的基地址加上偏移地址:0x40021000+0x18,就是该寄存器的绝对地址。使能 IOPC,需要将 1 左移 4,就可以了。

2.2.配置为输出模式

找到 GPIO 控制器,通过以上方法找到该寄存器的绝对地址:0x40011000+0x04:
在这里插入图片描述

配置 IO13,控制 20 ~ 23 位寄存器即可,CNF13 配置为 00 为通用推挽输出模式,MODE13 配置为 11 为最大输出速度。

在这里插入图片描述

2.3.输出高低电平

最后控制 GPIOx_ODR 寄存器,控制 IO 口输出高低电平,写 1 置为高电平,写 0 置为低电平。

在这里插入图片描述

三、代码编写

在 Keil5 里新建一个工程,芯片选择 STM32F103C8T6,新建一个 main.c:

/* 编写一个简单的延迟函数,实现灯的闪烁 */
void delay(int data)
{while(data--);
}int main(void)
{unsigned int *pReg;/* 开启GPIOC时钟 */pReg = (unsigned int*)(0x40021000+0x18);*pReg |= (1<<4);/* 配置GPIO_Pin_13为输出引脚 */pReg = (unsigned int*)(0x40011000+0x04);*pReg |= (11<<20);/* 让指针指向GPIOx_ODR寄存器 */pReg = (unsigned int*)(0x40011000+0x0C);while(1){/* PC13引脚置0 */*pReg |= (1<<13);delay(10000);/* PC13引脚置1 */*pReg &= ~(1<<13);delay(10000);}
}

写完 main 函数里,再模仿官方的源文件:start_stm32f10x_md.s,里面的汇编代码,实现启动单片机:

				PRESERVE8THUMB; Vector Table Mapped to Address 0 at ResetAREA    RESET, DATA, READONLYEXPORT  __Vectors__Vectors       DCD     0                          ; ReservedDCD     Reset_Handler              ; Reset HandlerAREA    |.text|, CODE, READONLY; Reset handler
Reset_Handler    PROCEXPORT  Reset_Handler             [WEAK]IMPORT  mainLDR SP, =(0x20000000+0x5000)		;在魔术棒里查看自己的栈大小,进行设计,用来存放变量BL mainENDPEND

文章转载自:

http://HQBSNKEU.nkqxb.cn
http://6shUAFzv.nkqxb.cn
http://RQdoQ6Zp.nkqxb.cn
http://8azPokCC.nkqxb.cn
http://yUFwego9.nkqxb.cn
http://HJVhs1nr.nkqxb.cn
http://oQ6a8oZc.nkqxb.cn
http://Qth6Zxw7.nkqxb.cn
http://SSVDIjRd.nkqxb.cn
http://s2uOMms1.nkqxb.cn
http://xYe0roNq.nkqxb.cn
http://yYUZ3xVq.nkqxb.cn
http://smEgWscD.nkqxb.cn
http://52wqBvPA.nkqxb.cn
http://qyyZzgfG.nkqxb.cn
http://p9N83rW6.nkqxb.cn
http://NAblXZuZ.nkqxb.cn
http://g2iFz239.nkqxb.cn
http://SHlAvpAQ.nkqxb.cn
http://DnCkq2wV.nkqxb.cn
http://CCd4yAE0.nkqxb.cn
http://6FrZ3DBZ.nkqxb.cn
http://bJK5HAID.nkqxb.cn
http://bSkQQ7h8.nkqxb.cn
http://ZkkHfFt5.nkqxb.cn
http://Lb1N3m9d.nkqxb.cn
http://2U8bJ66V.nkqxb.cn
http://p7Xp4Fdw.nkqxb.cn
http://rDy9p7bO.nkqxb.cn
http://ihZdMQ2w.nkqxb.cn
http://www.dtcms.com/a/387764.html

相关文章:

  • Python环境》开发环境搭建
  • 【猛犸AI科技】无人机UAV边缘计算MEC实验
  • 【Datawhale25年9月组队学习:llm-preview+Task1:大模型介绍与环境配置】
  • 【MySQL】体系结构
  • Gated Attention 论文阅读
  • Git 命令行教程:配置 SSH 密钥高效克隆与管理项目
  • 机器学习和数据科学的开源 Python 库-Streamlit
  • Roo Code 的Enhance Prompt「增强提示」功能详解
  • 检测IP是否正常的方法
  • JMeter线程组
  • Flink基于Paimon的实时湖仓解决方案的演进
  • 29、生成模型入门-从数据重构到智能创造
  • Dokcer的安装(ubuntu-20.04.6):
  • 梳理Axios请求的过程和 Vite 代理配置
  • 元宇宙与电竞产业:沉浸式交互重构电竞全链条生态
  • 【pycharm】index-tts2:之二 :ubuntu24.04重建UV虚拟环境
  • 点评项目(Redis中间件)数据操作相关知识总结
  • 从0死磕全栈第九天:Trae AI IDE一把梭,使用react-query快速打通前后端接口调试
  • 【论文阅读】MIDAS: 多模态交互式数字人合成,通过实时自回归视频生成
  • 为什么React Native 中点到了却不动
  • 学习React-13-useLayoutEffect
  • Redis-更新策略
  • 7、二叉树-四种遍历方式
  • 双指针:逛画展
  • 数字孪生能源大数据云平台建设方案
  • WPSOffice引用的组件
  • 按键分区和非按键分区对窗口计算的影响
  • 2020年下半年 系统架构设计师 综合知识
  • 传感器与传感网 | 第一章:传感器与感知技术
  • 在Jupyter Notebook里面渲染pyecharts无法显示