Control LED lights directly through register address operations

1. Hardware foundation

1. Development version: STM32-PZ6806L

2. MCU model: STM32F103ZET6

(1) Core: 32-bit high-performance ARM Cortex-M3 processor. Clock: up to 72M, can actually overclock a little. Single-cycle multiply and hardware divide.

(2) IO port: STM32F103ZET6: 144 pins, 112 IOs, most of the IO ports are resistant to 5V (except analog channels), support debugging: SWD and JTAG, SWD only needs 2 data lines

(3) Memory capacity: 512K FLASH, 64K SRAM

(4) Clock, reset and power management:

① 2.0~3.6V power supply and IO voltage

② Power-on reset, power-down reset and programmable voltage monitoring

③ Powerful clock system

   -4~16M external high-speed crystal oscillator

   - Internal 8MHz high-speed RC oscillator

   - Internal 40KHz low speed RC oscillator, watchdog clock

   -Internal phase-locked loop (PLL, frequency multiplication), the general system clock is obtained after the external or internal high-speed clock is multiplied by PLL

   - External low-speed 32.768K crystal oscillator, mainly used as RTC clock source

(5) Low power consumption:

    - Three low power consumption modes of sleep, stop and standby

    - Available battery to power RTC and backup registers

(6) AD: 3 12-bit AD (up to 21 external measurement channels)

- Conversion range: 0-3.6V (reference supply voltage)

  - Internal channel can be used for internal temperature measurement

  - Built-in reference voltage

(7) DA: 2 个 12 位 DA

(8) DMA: 12 DMA channels (7-channel DMA1, 5-channel DMA2), supporting peripherals: timer, ADC, DAC, SDIO, I2S, SPI, I2C, and USART

(9) Timer: up to 11 timers

       - 4 general purpose timers

       - 2 basic timers

      - 2 advanced timers

       -1 system timer

       - 2 watchdog timers

(10) Communication interface: up to 13 communication interfaces

-        2 I2C interfaces

       -5 serial ports

       -3 SPI interfaces

       -1 CAN2.0

       - 1 USB FS

       -1个SDIO

3、LED电路

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

 

二、软件基础

1、Keil5 IDE;

2、STM32F1扩展库(STM32芯片包);

3、启动文件。startup_stm32f10x_hd.s

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)

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

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

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

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

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

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

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

5、对"main.c"编程。

通过编程控制开发板上一个LED灯亮(D1),根据电路图,就是PC1为低电平,即通过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的内部外设的功能寄存器,从而控制它们的工作方式。

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

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

② GPIOC_CRL寄存器的位含义:

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

③ GPIOC_BSRR寄存器的位含义:

如果要通过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文件

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

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

②生成目标文件

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

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

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

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325853847&siteId=291194637