- 开启时钟,先查找到开启时钟的寄存器,然后通过该寄存器操作时钟的开启或关闭,要打开的是GPIOA的时钟
- 在芯片手册,找到RCC寄存器描述章节
- 找到APB2外设时钟使能寄存器(RCC_APB2ENR),现在算RCC_APB2ENR这个寄存器的地址,先知道RCC这个外设的基地址,然后加上这个寄存器的偏移地址就行了
- RCC外设及地址在寄存器组起始地址表中查到,叫做复位和时钟控制(RCC),我查到的是0x40021000---0x400213FF,所以RCC这个外设的基地址为0x40021000
- 在APB2外设时钟使能寄存器(RCC_APB2ENR)下面可以看到偏移地址为0x18
- 所以RCC_APB2ENR的地址为0x40021000+0x18
- 有了地址就可以写入了
- 向第二位写入1,就是写入4
- 最终就是 *(uint32_t *)(0x40021000 + 0x18) = 4;
- 给IO口设置输出模式
- 需要先找到GPIOA的基地址,再根据偏移地址找到要使用的寄存器的地址
- GPIOA的基地址在寄存器组起始地址表中查到,我查到的是0x40010800---0x40010BFF
- 配置PA0口的输出模式的寄存器是GPIOA_CRL,推挽输出就是写入4
- 最后是 *(uint32_t *)(0x40010800 + 0x00) = 3;
- 给指定PA0口输出0就可以点亮LED1了
- 寄存器是ODR数据输出寄存器
- ODR寄存器的地址是 0x40010800 + 0x0c 。给这个地址的第0位写0,其他位写1
- 最后是 *(uint32_t *)((0x40010800 + 0x0c)) = 0xfffe;
- ST公司已经定义好外设寄存器地址,我们直接食用菌就好
-
最后是
#include "stm32f10x.h" int main(void) { RCC->APB2ENR = 4; GPIOA->CRL = 3; GPIOA->ODR = 0xfffe; while (1) { } } 或者是 #include "stm32f10x.h" int main(void) { /* 开启GPIOA的时钟 第2位置1*/ RCC->APB2ENR |= 0x1 << 2; /* GPIOA_CRL的最后4位置 0011 */ GPIOA->CRL &= ~(0x1 << 3); GPIOA->CRL &= ~(0x1 << 2); GPIOA->CRL |= 0x1 << 1; GPIOA->CRL |= 0x1 << 0; /* GPIOA_ODR的第0位置0 */ GPIOA->ODR &= ~(0x1 << 0); while (1) { } } 或者是 #include "stm32f10x.h" int main(void) { RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; GPIOA->CRL &= ~GPIO_CRL_CNF0_1; GPIOA->CRL &= ~GPIO_CRL_CNF0_0; GPIOA->CRL |= GPIO_CRL_MODE0_1; GPIOA->CRL |= GPIO_CRL_MODE0_0; GPIOA->ODR &= ~GPIO_ODR_ODR0; while (1) { } }
-
stm32学习:(寄存器1)控制寄存器来让led亮
码农小白2024-07-21 20:21
相关推荐
辰海Coding8 小时前
MiniSpring框架学习笔记-解决循环依赖的简化IoC容器晓梦林8 小时前
cp520靶场学习笔记嵌入式老牛9 小时前
HC32F460_ADC驱动(三)心中有国也有家10 小时前
cann-recipes-infer:昇腾 NPU 推理的“菜谱集合”Upsy-Daisy10 小时前
AI Agent 项目学习笔记(八):Tool Calling 工具调用机制总览秀秀更健康10 小时前
stm32: 系统时钟如何配置为72MhzLuminousCPP11 小时前
数据结构 - 线性表第四篇:C 语言通讯录优化升级全记录(踩坑 + 思考)魔法阵维护师11 小时前
从零开发游戏需要学习的c#模块,第十四章(保存和加载)_李小白12 小时前
【android opencv学习笔记】Day 17: 目标追踪(MeanShift)一只机电自动化菜鸟12 小时前
一建机电备考笔记(40) 建筑机电施工—排水管道施工(含考频+题型)