直接通过寄存器地址操作控制LED灯(STM32_01)

一、硬件基础

1、开发板:STM32-PZ6806L

2、MCU型号:STM32F103ZET6

(1)内核:32位 高性能ARM Cortex-M3处理器。时钟:高达72M,实际还可以超频一点。单周期乘法和硬件除法。

(2)IO口:STM32F103ZET6: 144引脚  112个IO,大部分IO口都耐5V(模拟通道除外),支持调试:SWD和JTAG,SWD只要2根数据线

(3)存储器容量:512K FLASH,64K SRAM

(4)时钟,复位和电源管理:

①     2.0~3.6V电源和IO电压

②     上电复位,掉电复位和可编程的电压监控

③     强大的时钟系统

   -4~16M的外部高速晶振

   -内部8MHz的高速RC振荡器

   -内部40KHz低速RC振荡器,看门狗时钟

   -内部锁相环(PLL,倍频),一般系统时钟都是外部或者内部高速时钟经过PLL倍频后得到

   - 外部低速32.768K的晶振,主要做RTC时钟源

(5)低功耗:

    -睡眠,停止和待机三种低功耗模式

    -可用电池为RTC和备份寄存器供电

(6)AD:3个12位AD(多达21个外部测量通道)

-转换范围:0-3.6V(参考电源电压)

  -内部通道可以用于内部温度测量

  -内置参考电压

(7)DA:2个12位DA

(8)DMA:12个DMA通道(7通道DMA1,5通道DMA2),支持外设:定时器,ADC,DAC,SDIO,I2S,SPI,I2C,和USART

(9)定时器:多达11个定时器

       -4个通用定时器

       -2个基本定时器

      -2个高级定时器

       -1个系统定时器

       -2个看门狗定时器

(10)通信接口:多达13个通信接口

       -2个I2C接口

       -5个串口

       -3个SPI接口

       -1个CAN2.0

       -1个USB FS

       -1个SDIO

3、LED电路

在开发版上有8个LED灯,分别与GPIOC的0-7脚相连。

直接通过寄存器地址操作控制LED灯(STM32_01)_第1张图片

 直接通过寄存器地址操作控制LED灯(STM32_01)_第2张图片

二、软件基础

1、Keil5 IDE;直接通过寄存器地址操作控制LED灯(STM32_01)_第3张图片

2、STM32F1扩展库(STM32芯片包);直接通过寄存器地址操作控制LED灯(STM32_01)_第4张图片

3、启动文件。startup_stm32f10x_hd.s

直接通过寄存器地址操作控制LED灯(STM32_01)_第5张图片

 

ld( Low-density)     小容量   16-32K          
md (Medium-density) 中容量   64-128K          
hd (High-density)      大容量   256-512K
xl                        超大容量 512-1024K

 这些都是基本型的,包括STM32F101xx, STM32F102xx STM32F103xx

vl (value line devices)   超值型系列大家记住:这个只有STM32F100xx,也就是说只要是vl那一定是STM32F100的启动文件,其他的不予考虑
   下面还有个特殊的:
cl (Connectivity line devices) 互联型STM32F105xxSTM32F107xx

启动文件负责执行微控制器从“复位”到“开始执行main函数”中间这段时间(称为启动过程)所必须进行的工作。

(1) 初始化堆栈指针SP=_initial_sp

(2) 初始化PC指针=Reset_Handler

(3) 初始化中断向量表

(4) 配置系统时钟

(5) 调用C库函数_main 初始化用户堆栈,从而最终调用main函数

启动文件可以从STM32芯片包安装路径中获取

(Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.1.0\Device\Source\ARM)

或者从项目例程文件夹中获取。

4、程序下载软件,使用该软件通过板载USB转串口将PC端Keil5环境下编译生成的.hex文件下载到开发版的MCU中。

三、项目创建

1、新建项目文件夹;(例如:F:\STM32\project\regtemp)

2、通过Keil5创建新项目,保存在所创建的文件夹中;(例如项目名为:ptemp)

直接通过寄存器地址操作控制LED灯(STM32_01)_第6张图片

然后在弹出的“选择设备”文件夹中选择与开发版的MCU型号相对应的芯片。

直接通过寄存器地址操作控制LED灯(STM32_01)_第7张图片

在随后的"ManageRun-Time Environment"对话框打开后,不做选择,直接关闭。

直接通过寄存器地址操作控制LED灯(STM32_01)_第8张图片

这时Keil5的项目向导会在项目文件夹(regtemp)下生成项目文件和相应文件夹:

直接通过寄存器地址操作控制LED灯(STM32_01)_第9张图片

3、在regtemp文件夹中新建"user"文件夹,将startup_stm32f10x_hd.s启动文件复制到"user"文件夹内,在"user"文件夹内新建一个文本文件,并将其文件名改为"main.c"。

直接通过寄存器地址操作控制LED灯(STM32_01)_第10张图片

 4、在keil5的"Project"选项卡中展开"Target1",右键单击"Source Group1",选择菜单"Add Existing Files toGroup 'Source Group1'"

直接通过寄存器地址操作控制LED灯(STM32_01)_第11张图片

在打开的对话框中选择"user"文件夹内的"main.c"和"startup_stm32f10x_hd.s"文件,然后点击“Add”,将这两个源程序文件添加到当前项目中。

直接通过寄存器地址操作控制LED灯(STM32_01)_第12张图片

添加后"SourceGroup1"中包含两个文件。

直接通过寄存器地址操作控制LED灯(STM32_01)_第13张图片

5、对"main.c"编程。

通过编程控制开发板上一个LED灯亮(D1),根据电路图,就是PC0为低电平,即通过GPIOC的GPIOC_0输出低电平。实现该功能需要3个步骤:

①使能GPIOC时钟;

②设置GPIOC_0的工作模式;

③将GPIOC_0复位。

实现这些操作都是对MCU芯片内片内外设的功能寄存器操作。通过APB2外设时钟使能寄存器(RCC_APB2ENR)使能GPIOC时钟;通过GPIOC_CRL,GPIOC_CRH配置GPIOC_0的工作模式;通过GPIOC_BSRR将GPIOC_0复位,通过 GPIOC_BRR将GPIOC_0置位。

MCU中的内部外设的功能寄存器与存储器采用统一编址方式,将功能寄存器映射到固定的内存地址,STM32F103ZET6从0x40000000到0xBFFFFFFF的地址范围为内部外设功能寄存器的地址区间,RCC为0x40000000 + 0x00020000 +0x00001000,PortC为0x40000000 + 0x00010000 + 0x1000。根据STM32F1xx参考手册GPIOC_CRL的映射地址为0x40011000,GPIOC_CRH的映射地址为0x40011004,GPIOC_BSRR的映射地址为0x40011010,GPIOC_BRR的映射地址为0x40011014;

APB2外设时钟使能寄存器(RCC_APB2ENR) 的映射地址为0x40021018。

6、可以通过直接向这些地址赋值来设置MCU的内部外设的功能寄存器,从而控制它们的工作方式。

直接通过寄存器地址操作控制LED灯(STM32_01)_第14张图片

① APB2外设时钟使能寄存器(RCC_APB2ENR)的位含义:

直接通过寄存器地址操作控制LED灯(STM32_01)_第15张图片

要使能GPIOC就是将RCC_APB2ENR寄存器的第4位设为1。

② GPIOC_CRL寄存器的位含义:

直接通过寄存器地址操作控制LED灯(STM32_01)_第16张图片

如果要将GPIOC_0设为“通用推挽式输出,最大速度50MHz,则将GPIOC_CRL寄存器的3~0位设为0011。

③ GPIOC_BSRR寄存器的位含义:

直接通过寄存器地址操作控制LED灯(STM32_01)_第17张图片

如果要通过GPIOC_0输出电平,就是将GPIOC_BSRR寄存器的位16设为1,如果要通过GPIOC_0输出电平,就是将GPIOC_BSRR寄存器的位0设为1。

7、main.c的编程如下:

void SystemInit()

{

}

void delay(int t)

{

     int i;

     for( ;t>0; t--)

         for(i=0;i<1000;i++);

}

int main()

{

    

     *((unsigned int *)0x40021018) |= 0x1<<4;       //开启GPIOC时钟

     *((unsigned int *)0x40011000) &= ~(0x0F<<(4*0));   //对GPIOC_0设置为通用推挽输出,最大速度50MHz

     *((unsigned int *)0x40011000) |= (0x03<<(4*0));

     while(1)

     {

         *((unsigned int *)0x40011010) |= 0x01<<(16+0); //对GPIOC_0复位

         delay(1000);

         *((unsigned int *)0x40011010) |= 0x01<<(0+0);  //对GPIOC_0置位

         delay(1000);

     }

}

8、项目配置、编译链接生成hex文件

①项目配置,两种方式可以打开项目配置对话框

直接通过寄存器地址操作控制LED灯(STM32_01)_第18张图片

直接通过寄存器地址操作控制LED灯(STM32_01)_第19张图片

在"Output"选项卡中选择"Create HEX File"。

②生成目标文件

直接通过寄存器地址操作控制LED灯(STM32_01)_第20张图片

直接通过寄存器地址操作控制LED灯(STM32_01)_第21张图片

四、下载程序到开发版MCU中

打开“普中ISP自动下载”软件,按照MCU芯片选择芯片类型;按照与开发板连接的USB转串口选择串口号;选择合适的波特率;选择要下载的.hex文件(一般在项目文件夹下的"Objects"文件夹中),然后点击程序下载。

直接通过寄存器地址操作控制LED灯(STM32_01)_第22张图片

程序下载后,开发板上的第一个LED灯闪烁,数码管一段也闪烁。

你可能感兴趣的:(STM32,寄存器,STM32)