一、实验内容和任务
1、原理学习。学习和理解STM32F103系列芯片的地址映射和寄存器映射原理;了解GPIO端口的初始化设置三步骤(时钟配置、输入输出模式设置、最大速率设置)。
2、假设你手中已有 STM32最小系统核心板(STM32F103C8T6)+面板板+3只红绿蓝LED,并搭建了电路,分别GPIOA-5、GPIOB-9、GPIOC-14 这3个引脚上控制LED灯(最高时钟2Mhz),轮流闪烁,间隔时长1秒。1)写出程序设计思路,包括GPIOx端口的各寄存器地址和详细参数;2)用C语言 寄存器方式编程实现。3)安装 stm32CubeMX,用cubemx完成初始化过程,采用HAL库编程实现。4)在Keil下用软件仿真运行上面代码,并用虚拟逻辑分析仪观察 对应管脚上的输出波形(高低电平转换),看是否是1秒的周期。
二、实验要求
1. 分组要求:每个学生独立完成,即1人1组。
2. 程序及报告文档要求:具有较好的可读性,如叙述准确、标注明确、截图清晰等。
3.项目代码上传github,同时把项目完整打包为zip文件,与实验报告(Markdown源码及PDF文件)、作业博客地址一起提交到学习通。
三. 实验过程介绍 (此处可以填博客内容)
一、用C语言 寄存器方式编程实现。
1.新建工程
双击打开keil,点击菜单栏Project–>New μVision Project,新建项目,在弹窗中设置工程项目的名称和路径,在这里,我新建名为LED的工程文件。
注册
1.点击运行注册器程序。
2.在桌面找到keil软件图标,点击右键,以管理员身份运行。
3.点击File–>Lincense Management–>Single-User Lincense,找到CID,复制CID中的内容填写到注册器的CID空白处,将注册器中Target选择为ARM,点击Generate,得到注册码。
4.将生成的注册码复制粘贴到Keil的New Lincense ID Code空白处,点击Add LIC,点击Close。
支持包安装
点击运行下载的支持包,NEXT开始安装,安装完成,点击Finish。
二、完成一个基于STM32汇编程序的编写
1.新建工程
双击打开keil,点击菜单栏Project–>New μVision Project,新建项目,在弹窗中设置工程项目的名称和路径,在这里,我新建名为TEST的工程文件。
2.配置环境
选择设备
点击菜单中的Project,找到Options for Target ‘Target 1’并点击,在弹窗中选择相应的目标环境,此处我选的是STM32F103C8
选择运行环境
点击ok后,对Run-Time Environment进行设置,在箭头所指的这个地方打上勾
误操作后也可点击下面这个图标重新对Run-Time Environment进行设置
然后点击图中箭头所指的地方
勾选上Create HEX_File
3.添加源文件
source group里创建led.c,并写入代码,注意项目结构,使用的引脚是PA4,PB9,PC15
将下图代码复制粘贴到该led.c中
#define GPIOB_BASE 0x40010C00
#define GPIOC_BASE 0x40011000
#define GPIOA_BASE 0x40010800
#define RCC_APB2ENR (*(unsigned int *)0x40021018)
#define GPIOB_CRH (*(unsigned int *)0x40010C04)
#define GPIOC_CRH (*(unsigned int *)0x40011004)
#define GPIOA_CRL (*(unsigned int *)0x40010800)
#define GPIOB_ODR (*(unsigned int *)0x40010C0C)
#define GPIOC_ODR (*(unsigned int *)0x4001100C)
#define GPIOA_ODR (*(unsigned int *)0x4001080C)
void SystemInit(void);
void Delay_ms(volatile unsigned int);
void A_LED_LIGHT(void);
void B_LED_LIGHT(void);
void C_LED_LIGHT(void);
void Delay_ms( volatile unsigned int t)
{
unsigned int i;
while(t--)
for (i=0;i<800;i++);
}
void A_LED_LIGHT(){
GPIOA_ODR=0x0<<4; //PA4???
GPIOB_ODR=0x1<<9; //PB9???
GPIOC_ODR=0x1<<15; //PC15???
}
void B_LED_LIGHT(){
GPIOA_ODR=0x1<<4; //PA4???
GPIOB_ODR=0x0<<9; //PB9???
GPIOC_ODR=0x1<<15; //PC15???
}
void C_LED_LIGHT(){
GPIOA_ODR=0x1<<4; //PA4???
GPIOB_ODR=0x1<<9; //PB9???
GPIOC_ODR=0x0<<15; //PC15???
}
int main(){
int j=100;
// ????
RCC_APB2ENR |= (1<<3); // ?? GPIOB ??
RCC_APB2ENR |= (1<<4); // ?? GPIOC ??
RCC_APB2ENR |= (1<<2); // ?? GPIOA ??
// ?? GPIO ?????
GPIOB_CRH&= 0xffffff0f; //??? ??
GPIOB_CRH|=0x00000020; //PB9????
GPIOC_CRH &= 0x0fffffff; //??? ??
GPIOC_CRH|=0x30000000; //PC15????
GPIOA_CRL &= 0xfff0ffff; //??? ??
GPIOA_CRL|=0x00010000; //PA4????
// 3?LED??????(????)
GPIOB_ODR |= (1<<9);
GPIOC_ODR |= (1<<15);
GPIOA_ODR |= (1<<4);
while(j){
B_LED_LIGHT();
Delay_ms(1000000);
C_LED_LIGHT();
Delay_ms(1000000);
A_LED_LIGHT();
Delay_ms(1000000);
}
}
之后添加驱动文件,两个目标文件都在(你keil安装的文件夹)Keil-v5里面,Keil_v5->ARM->Flash->_Template->Test
将上图两个文件拷贝到项目文件LED里面
右击文件夹,选择Add Existing Files to Group Source Group 1
将两个文件都Add一遍,没有这两个文件的话记得把文件类型选成All files。
4.编译
编译之后会生成hex文件在项目文件下面的Objects文件夹里面
5.线路连接
对于USB转TTL
模块和stm32f103c8t6
连接
6.烧录
将核心板上的booto0置1,booto1置0,然后将usb连接到电脑上,然后打开mcuisp程序
确保串口连接上,然后将刚刚生成的hex文件选上
然后点击开始编程,成功后断电并将booto0置0,重新供电后就行了。
运行结果:
四、总结
1、学习和理解STM32F103系列芯片的地址映射和寄存器映射原理
2、了解GPIO端口的初始化设置三步骤(时钟配置、输入输出模式设置、最大速率设置)
3、学习和理解了如何用STM32CubeMX完成初始化,并在keil里完成编写。
五、参考
https://blog.csdn.net/weixin_47554309/article/details/120810913