使用HAL库&寄存器完成LED流水灯程序

一、安装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();//gpio初始化
  while (1)
  {		
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);//PA4亮灯
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15熄灯
		HAL_Delay(1000);//延时1s
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4熄灯
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9亮灯
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15熄灯
		HAL_Delay(1000);//延时1s		
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4熄灯
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);//PC15亮灯
		HAL_Delay(1000);//延时1s
	}

(4)编译程序并创建hex文件

3.连接电路

(1)根据设计的程序连接电路

USB转TTLSTM32F103C8T6
GNDGND
3v33v3
TXDA10
RXDA9

STM32F103C8T6的引脚3.3要接面包板上灯的正极所在的地方
(2)总电路

灯(负极)引脚
红灯B9
绿灯C15
黄灯A4

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;		//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);
	}
	
}


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库点亮流水灯的方式比使用寄存器点亮流水灯的方式要简单一些。

五、参考链接

stm32cubeMX使用HAL库点亮LED流水灯

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值