一、安装STM32CubeMX
1.下载STM32CubeMX安装包
(1)可前往官网http://www.st.com/stm32cube下载安装包 (官网下载需要先注册,若已有账户可直接登陆) 登陆之后,依次点击开发工具硬件→软件开发工具→STM32软件开发套件→STM32配置程序和代码生成器→STM32CubeMX,然后点击获取软件 (2)选择型号为STM32CubeMX-Win的产品并在其后面点击选择版本,选择自己需要的版本(不建议使用最新版本),我下载的是6.5.0版本,并根据自己的意愿选择下载路径。
2.安装程序
(1)以管理员身份运行下载好的程序,在弹出来的页面点击Next (2)先点击"I accept the terms of this license agreement",再点击Next (3)勾选“I have read and understood the ST Privacy Policy and ST Terms of Use”即可,然后点击Next (4)自定义安装位置(安装位置中不要出现中文),然后点击Next (5)不用设置,直接点击Next之后开始安装 (6)等待安装,安装完成之后点击Next,然后在弹出来的页面点击Done 这样便说明STM32CubeMX成功安装!
3.安装HAL库
(1)打开安装好的STM32CubeMX,点击HELP→Manage embedded software packages (2)在弹出来的选择型号的界面勾选上你要安装的HAL库, 点击“Install” ,然后等待安装,安装成功后关闭当前页面 这样HAL库就安装成功了!
二、使用HAL库点亮流水灯
1.创建项目
(1)打开STM32CubeMX主界面,点击“ACCESS TO MCU SELECTOR”,创建新项目 (2)在“Commerical Part Number”里面选择自己需要的芯片,点击信息栏中的具体芯片信息选中,再点击“Start Project” (3)点击System Core→SYS,在Debug下选择“Serial Wire” (4)点击“Clock Configuration”,勾选PLLCLK (5)点击“Pinout & Configuration”,再点击RCC,将HSE那里设为Crystal/Ceramic Resonator (6)点击GPIO,然后点击需要的引脚设置输出寄存器,即设置为GPIO_Output,我选择的引脚有三个,即A4,B9,C15,并把它们的输出等级设置为High (7)点击Project Manager 配置好自己的路径名和项目名(最好全用英文,不然可能会出现问题),然后将IDE设置为MDK-ARM (8)点击Code Generate界面,选择生成初始化文件.c/.h,之后再点击GENERATE CODE即可成功创建项目
2.编写程序
(1)在点击GENERATE CODE之后弹出来的界面点击Open Project即可跳转到Keil5进行程序编写 (2)打开main.c文件,滑到主函数那一部分 (3)将主函数里面的内容替换为如下代码:
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);
HAL_Delay(1000);
}
(4)编译程序并创建hex文件
3.连接电路
(1)根据设计的程序连接电路
USB转TTL | STM32F103C8T6 |
---|
GND | GND | 3v3 | 3v3 | TXD | A10 | RXD | A9 |
STM32F103C8T6的引脚3.3要接面包板上灯的正极所在的地方 (2)总电路
4.烧录运行
注: 串口烧录要断电之后置BOOT0为0,BOOT1为1 (1)打开mcuisp,选择串口为COM5,并选择生成的LED.hex文件 (2)点击读器件信息,若显示一切正常则进行下一步 (3)点击开始编程,若显示一切正常则说明烧录成功
5.运行结果
可以看到LED呈周期闪烁,说明流水灯点亮成功。
6.观察输出波形
(1)先点击魔术棒,再点击Target,设置正确的晶振大小,我设置的是8MHz的外部晶振。 (注: 这个选项在软件仿真中起到很重要的作用,如果选择错误,那么波形一定是错误的,因为时间不准确。) (2)点击Debug,按如下步骤进行设置: (3)点击Start/Stop Debug Session进行调试 (4)选择逻辑分析仪
(5)点击Setup Logic Analyzer,然后添加自己需要观察引脚并将Display Type设置为Bit,再根据自己需要可为每个引脚的波形设置颜色用以区分,设置完成后点击Close (6)点击In/Out将Grid的大小调为1s,勾选Signal info和Cursor能设置显示起始线并能看到相关信息 (7)点击Run即可开始运行 (8)运行一段时间后点击Stop停止运行并观察LED闪烁周期 由波形图可知,引脚为低电平的灯亮,高电平的灯不亮,高低电平转换周期(LED闪烁周期)为0.982511s,约为1s。
三、用寄存器方式实现点亮流水灯
1.创建项目
(1)打开Keil5,点击Project,选择第一项新建工程,并设置好工程名和路径,不要有中文 (2)设置工程的目标环境,即选择芯片STM32F103C8,然后点击OK (3)点击OK之后弹出来的页面不用选择什么,直接叉掉 (4)点击“Add New Item to Group ‘Source Group1’”,添加一个.c文件,并设置好名称,我这里设置的是main,然后选择路径,设置完成后点击Add (5)在电脑中找到starup_stm32f10x_md.s文件,并将其复制到新建的项目下 (6)右击Source Group1,选择“Add Existing Files to Group ‘Source Group1’”,将文件类型选择为All Files,选择刚刚复制添加的启动文件,然后点击Add,最后点击Close (7)点击魔术棒→Output→勾选Create HEX File→OK
2.编写程序
(1)在main.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;
GPIOB_ODR=0x1<<9;
GPIOC_ODR=0x1<<15;
}
void B_LED_LIGHT(){
GPIOA_ODR=0x1<<4;
GPIOB_ODR=0x0<<9;
GPIOC_ODR=0x1<<15;
}
void C_LED_LIGHT(){
GPIOA_ODR=0x1<<4;
GPIOB_ODR=0x1<<9;
GPIOC_ODR=0x0<<15;
}
int main(){
int j=100;
RCC_APB2ENR |= (1<<3);
RCC_APB2ENR |= (1<<4);
RCC_APB2ENR |= (1<<2);
GPIOB_CRH&= 0xffffff0f;
GPIOB_CRH|=0x00000020;
GPIOC_CRH &= 0x0fffffff;
GPIOC_CRH|=0x30000000;
GPIOA_CRL &= 0xfff0ffff;
GPIOA_CRL|=0x00010000;
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);
}
}
void SystemInit(){
}
(2)编译程序并创建hex文件
3.连接电路
电路连接与使用HAL库点亮流水灯完全一样
4.烧录运行
串口烧录跟使用HAL库一样要断电之后置BOOT0为0,BOOT1为1 (1)打开mcuisp,选择串口为COM5,并选择生成的led.hex文件 (2)点击读器件信息,若显示一切正常则进行下一步 (3)点击开始编程,若显示一切正常则说明烧录成功
5.运行结果
可以看到LED呈周期闪烁,说明流水灯点亮成功。
6.观察输出波形
(1)相关设置与使用HAL方式完全一样 (2)点击Run开始运行,运行一段时间后点击Stop停止运行并观察LED闪烁周期 由波形图可知,引脚为低电平的灯亮,高电平的灯不亮,高低电平转换周期(LED闪烁周期)为1.122451s,约为1s。
四、总结
安装软件及实验过程中需要设置的参数比较多,需要足够的耐心和细心,在用两种不同方式点亮流水灯的过程中可以发现STM32CubeMX中使用HAL库点亮流水灯的方式比使用寄存器点亮流水灯的方式要简单一些。
五、参考链接
http://t.csdn.cn/TlWhc
|