笔记(STM32篇)day1——工程创建、操作寄存器点灯

目录

一、STM32F103VET6

二、创建工程

1.主要文件

2.生成文件

三、操作寄存器点灯


前言

       这一年,从调剂到各种找工作面试、去实习,感受总结下来就是“出走半生,归来仍是萌新”,作为一个自动化爬了四年的学生,发现自己不管是对于基础的C、电路、模数电,到通信协议、RTOS、Linux,再到机器学习,都只是知道了解,但知道的不多这种程度,真是在面试要说出个一二的时候,多少有点困难。

       为了巩固基础,买了块野火的32板子,这个笔记就作为记录,从点灯开始。


一、STM32F103VET6

Cortex-M3:ARM公司推出的基于ARMv7架构的32位Cortex-M3微控制器内核。

STM32:ST(意法半导体)公司就推出的基于Cortex-M3内核的MCU—STM32。

笔记(STM32篇)day1——工程创建、操作寄存器点灯_第1张图片

 图1 STM32F103VET6命名规则

笔记(STM32篇)day1——工程创建、操作寄存器点灯_第2张图片

 图2 STM32芯片结构


二、创建工程

1.主要文件

startup_stm32f10x_hd.s:stm32启动文件,汇编语言。

stm32f10x.h:库文件,存放寄存器映射代码。

main.c:主函数(mian.c(doge))

2.生成文件

文件夹 作用
DebugConfig 用于存放调试设置信息文件(.dbgconf),不可删除
Listings​ 用于存放编译过程产生的链接列表等文件​
Objects​
用于存放编译过程产生的调试信息、.hex、预览、.lib文件等

三、操作寄存器点灯

根据目标GPIO,查询参考手册找到时钟寄存器、端口配置寄存器、数据输出寄存器的地址及其偏移量,通过位操作来改变寄存器状态,从而实现功能。

常用位操作:

把变量的首位,置1:|= (1<<0)  

把变量的首位,置0:&= ~(1<<0)

把变量的首位,取反:^= (1<<0)

变量从首位开始的连续两位,置0:&= ~(3<<0)

例:a = 1110 1110(0xEE)后两位置0:

               3<<0:0000 0011(0x03)

               ~(3<<0):1111 1100(0xFC)

               a &= ~(3<<0):1110 1100(0xEC)

笔记(STM32篇)day1——工程创建、操作寄存器点灯_第3张图片

图3 LED原理图

根据LED原理图,将PB0置低电平即可使RGB灯绿色点亮。因此,根据顺序:

1、使能时钟:RCC时钟控制器属于AHB总线,首地址为0x4002 1000。因为需要配置的PB0属于APB2总线,则找到APB2 外设时钟使能寄存器(RCC_APB2ENR)的偏移地址为0x18,从而将0x4002 1018地址下第三位数据置1,打开PB0的时钟。

2、配置输入输出端口:端口操作前需要先配置它的模式。有端口配置低寄存器,负责低8位;端口配置高寄存器,负责高8位。要配置PB0,则去配置低8位寄存器GPIOB_CRL。控制GPIOB_CRL低位配置寄存器,地址为0x40010C00,偏移0x00,PB0通用推挽输出00,模式为输出01。

笔记(STM32篇)day1——工程创建、操作寄存器点灯_第4张图片

图4 GPIOB_CRL寄存器

GPIOB_CRL中,每4位配置一个端口,则PB0配置为0-3位。

对于CNF:

        在输入模式(MODE[1:0]=00):
                00:模拟输入模式
                01:浮空输入模式(复位后的状态) 
                10:上拉/下拉输入模式
                11:保留
        在输出模式(MODE[1:0]>00):
                00:通用推挽输出模式
                01:通用开漏输出模式
                10:复用功能推挽输出模式
                11:复用功能开漏输出模式

对MODE:

        00:输入模式(复位后的状态) 
        01:输出模式,最大速度10MHz 
        10:输出模式,最大速度2MHz 
        11:输出模式,最大速度50MHz

3、配置输出数据端口:GPIOB基地址0X4001 0C00,GPIOB_ODR偏移量0x0C,PB0置0即对

 0X4001 0C0C地址下的数据首位置0。

通过DAP下载到板上即可点亮RGB。三个步骤代码如下:

#include "stm32f10x.h"

int main(void)
{ 
	*(unsigned int*)0x40021018 |= (1<<3);		
    //控制RCC寄存器打开时钟,RCC偏移0x18为APB2时钟,寄存器第三位为PB使能

	*(unsigned int*)0x40010C00 |= ((1)<<(4*0));		
    //控制GPIOB_CRL低位配置寄存器,偏移0x00,PB0通用推挽输出00,模式为输出01

	*(unsigned int*)0x40010C0C &= ~(1<<0);		
    //控制GPIOB_ODR输出数据寄存器,偏移0x0C,寄存器首位即PB0
	
}

参考

[野火®]STM32库开发实战指南——基于野火指南者开发板 — [野火]STM32库开发实战指南——基于野火指南者开发板 文档https://doc.embedfire.com/mcu/stm32/f103zhinanzhe/std/zh/latest/index.html

你可能感兴趣的:(STM32基础知识,stm32,嵌入式硬件,c语言,单片机)