寄存器 控制STM32F103C8T6 点亮LED灯

关于 编译生成的 文件类型介绍:

img

.hex 可用串口i进行 烧录 的 16进制 文件。

img

.axf 是通过 link 方式 进行直接仿真 下载的 文件。

img

.sct 是编译过程中 生成的 加载、分载文件。

​ 后续还有,以后细讲。

实战代码编写:

img

​ STM32F103C8T6原理图

LED 灯点亮。

需要读手册:

对 GPIO(输出端口进行 操作)

GPIO 简介

​ GPIO 是通用输入输出端口的简称,简单来说就是 STM32 可控制的引脚,STM32 芯片

的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。

STM32 芯片的 GPIO 被分成很多组,每组有 16 个引脚,如型号为 STM32F103VET6 型号的

芯片有 GPIOA、GPIOB、GPIOC至 GPIOE共 5组 GPIO,芯片一共 100个引脚,其中 GPIO

就占了一大部分,所有的 GPIO 引脚都有基本的输入输出功能。

最基本的输出功能是由 STM32 控制引脚输出高、低电平,实现开关控制,如把 GPIO

引脚接入到 LED灯,那就可以控制 LED灯的亮灭,引脚接入到继电器或三极管,那就可以

通过继电器或三极管控制外部大功率电路的通断。

最基本的输入功能是检测外部输入电平,如把 GPIO 引脚连接到按键,通过电平高低

区分按键是否被按下。

从而达到对 寄存器的操作。

img

继续

此节课网址:

img

根据读原理图 可得控制 PC13

再读手册:(GPIO输出端)

img

在手册 存储器映射中可找到 PC的基址:

img

进行相加运算 找到 P13所对应的 地址:

img

可以进行 关闭:

img

img

这就关闭了。

之后进行 代码编写:

在写好了 PC13后继续进行 输入输出 模式的 寄存器 定义:

PC13 13>8 为 高 8位 所以选择 高寄存器

且 13 (10)= C

一定要加上偏移量 哦!

img

img

注意:偏移量。

还要注意打开 外设 时钟 控制器:

img

img

RCC 外设 基址

img

根据以上条件 编写代码:

#include "stm32f10x.h"          // Device header
int main(void)

{

// 打开 GPIO C 端口 时钟

*(unsigned int *)0x40021018 |= ((1)<<4);

//先清零 CRH   这样做比较严谨

*(unsigned int *)0x40011004&= ~((0x0f)<<(4*5));//配置 IO 口 为 输出模式

*(unsigned int *)0x40011004 |= ((1)<<(4*5));

//控制 ODR 寄存器

*(unsigned int *)0x4001100C |= ~((1)<<13);
}
void SystemInit(void)
{
//函数体为空,目的是为了骗过编译器不报错
}

img

成功运行!!!!

img

STM32马上入门了。加油哦!!!!

img

总结:

​ 1.先 打开 选哪个 寄存器的 时钟:

​ \2. 再 打开 选择 哪的GPIO 接口的 输入输出模式

​ 3.在选择 ODR 上输出的 高低电平。

练习:再此功能上 加上 一个延时函数 进行 LED灯 闪烁。

(注意:在初学阶段,晶振没有定义,芯片默认为内部晶振 8MHZ)

#include "stm32f10x.h"          // Device header

 

void LED(unsigned char n)

{
 	 switch(n)
	{
 	case 0:
    *(unsigned int *)0x4001100C |= ((1)<<13);
     break;
    case 1:
    //控制 ODR 寄存器
     *(unsigned int *)0x4001100C &=~ ((1)<<13);
     break;
    }
}
void Dealy(unsigned int t)
{
 	while(t--);
}
int main(void)
{
     // 打开 GPIO C 端口 时钟
    *(unsigned int *)0x40021018 |= ((1)<<4);
    //先清零 CRH   这样做比较严谨
    *(unsigned int *)0x40011004&= ~((0x0f)<<(4*5));
    //配置 IO 口 为 输出模式
    *(unsigned int *)0x40011004 |= ((1)<<(4*5));
while(1)
{
     Dealy(60000);
     Dealy(60000);  //土方法延时
     Dealy(60000);
     Dealy(60000);
     Dealy(60000);
     LED(0); 
     Dealy(60000);
     Dealy(60000); 
     Dealy(60000);
     Dealy(60000);
     Dealy(60000);
     LED(1);
  } 

} 
void SystemInit(void)

{
 //函数体为空,目的是为了骗过编译器不报错
}

不要嫌弃 现在 代码的 “俗气”(不要气馁哦!!!)

等以后学了 定时器 ‘计数器 ,中断后,代码的水平会大大提高。(你会慢慢爱上嵌入式的)

img

充实的一天结束了!!!明天会元气满满哦。

img

再见喽!

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值