学习参考:
6-什么是寄存器(第1节)—概念讲解_哔哩哔哩_bilibili
学习材料:野火指南者开发板---stm32f103vet6
-
内核
基础概念:
1.程序是写在flash中的。内核通过icode读取代码(icode的i表示instruction,即‘指令’)。
2.数据有常量和变量两种,常量由const修饰,储存在flash中,变量存储在sram中。
3.内核可以通过DMA和dcode读取数据,所以为了避免读取数据时侯冲突,一般由总线矩阵解决这个问题。
4.DMA作用-----搬数据。比如,要将一个SRAM中的数据存储到串口的数据寄存器(DR)中,不使用DMA的做法是,先将数据从SRAM中读取到CPU中的寄存器中,再将数据从cpu中的寄存器转到串口的数据寄存器(DR)中;如果使用DMA,则cpu给DMA发送一个搬数据的指令,DMA就会将数据搬运到串口的数据寄存器(DR)中,避免了对cpu的占用,提高cpu的利用率。
5.cpu内部还有一个内存区域,实现分成八个部分,分别存放flash,sram,外设,fsmc等数据。
6.芯片内部由三条总线---APB1/APB2/AHB,APB1是低速的,剩下的是高速的。
7.
(1)保护二极管:当引脚电压高于VDD 时,上方的二极管导通,当引脚电压低于VSS 时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。
(2)mos管:控制推挽输出/开漏输出。
8.用控制寄存器的方式在f103vet6板子上实现点灯。
#include "stm32f10x.h"
void SystemInit(void);
int main(void)
{
*(unsigned int *) 0X40021018 |=(1<<3);
//使能gpiob端口的时钟
*(unsigned int *) 0X40010C00 |=((1)<<(4*0));
//控制io口为输出
*(unsigned int *) 0X40010C0C &=~(1<<0);
//控制odr寄存器
//置位 |= 清0 &=~
}
void SystemInit(void)
{
}
9.利用寄存器映射点亮f103vet6中的led
stm32f103x.h代码
//存放内存其映射的代码
//外设 perirhral,地址不要多此一举把七个0用空格隔开
#define PERIR_BASE ((nsigned int)0X40000000)
//外设基地址
#define APB1_PERIR_BASE (PERIR_BASE)
//APB1的外设基地址
#define APB2_PERIR_BASE (PERIR_BASE+0X10000)
//APB2的外设基地址
#define AHB_PERIR_BASE (PERIR_BASE+0X20000)
//AHB的外设基地址
#define RCC_BASE (AHB_PERIR_BASE+0X1000)
//定义rcc的基地址,由于rcc是挂载在AHB上的,因此给AHB及地址加一个偏移量就可以得到rcc的基地址。
#define GPIOB_BASE (APB2_PERIR_BASE+0X0C00)
//定义GPIOB的基地址,由于GPIOB是挂载在APB2上的,因此给APB2及地址加一个偏移量就可以得到GPIOB的基地址。
#define RCC_APB2ENR *(unsigned int*)(RCC_BASE+0X18)
//定义控制APB2时钟的寄存器的基地址,这里强制类型转换成32位的(int 是32位),使用的时候可以直接访问到32位的,即四个字节的大小。
#define GPIOB_CRL *(unsigned int*)(GPIOB_BASE+0X00)
//定义GPIOB的CRL寄存器基地址
#define GPIOB_CRH *(unsigned int*)(GPIOB_BASE+0X04)
//定义GPIOB的CRH寄存器基地址
#define GPIOB_ODR *(unsigned int*)(GPIOB_BASE+0X0C)
//定义GPIOB的ODR寄存器基地址
main.c代码
#include "stm32f10x.h"
void SystemInit(void);
int main(void)
{
RCC_APB2ENR |=(1<<3);
//使能gpiob端口的时钟
GPIOB_CRL |=((1)<<(4*0));
//控制io口为输出
GPIOB_ODR &=~(1<<0);
//控制odr寄存器
//置位 |= 清0 &=~
}
void SystemInit(void)
{
}