一、硬件基础
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脚相连。
二、软件基础
3、启动文件。startup_stm32f10x_hd.s
|
ld( Low-density) 小容量 16-32K 这些都是基本型的,包括STM32F101xx, STM32F102xx 和 STM32F103xx vl (value line devices) 超值型系列大家记住:这个只有STM32F100xx,也就是说只要是vl那一定是STM32F100的启动文件,其他的不予考虑 |
启动文件负责执行微控制器从“复位”到“开始执行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),根据电路图,就是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的内部外设的功能寄存器,从而控制它们的工作方式。
① 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灯闪烁,数码管一段也闪烁。