(一)实验原理

通过控制LED上管脚输出高低电平,来实现LED闪烁。通过电路原理图,可以看出当LED的管脚输出为低电平时,LED处于一个连通的状态,因此,LED被点亮,而当LED的管脚输出高电平时,LED两边不存在电势差,就不会有电流流过,即LED被熄灭。
在这里插入图片描述

(二)使用寄存器地址方式完成流水灯

试验工具:keil5、STM32CubeMx 4.27、STM32F103C8、FlyMcu

1、使用STM32CubeMx生成相关代码

打开STM32CubeMx,点击new project
请添加图片描述
选择自己使用的芯片型号,这里用到的是STM32F103C8
请添加图片描述
选择作为输出的引脚,点击引脚选择GPIO_Output
请添加图片描述
设置好的引脚会变成绿色,这里选择了PB5、PB6、PB7作为流水灯的三个输出
请添加图片描述
设置SYS->Debug->Serial Wire
请添加图片描述
设置GPIO,选择Configuration->GPIO
请添加图片描述
GPIO output level:有low和high两种选择,一般选择low
GPIO mode:推挽输出和开漏输出两者模式,两者模式的区别在于推挽输出中1代表VCC,0表示GND;开漏输出中1代表高阻态,0代表GND。
GPIO Pull-up/Pull-down:输入需要上下拉,输出一般没有上下拉
Maxinum output speed:最大的输出速度,一般选择low就可以了。
请添加图片描述
点击生成相关代码
请添加图片描述
按下图进行相关设置
请添加图片描述
相关代码生成完成后,点击Open Project,工程文件将在keil打开
请添加图片描述

2、使用keil设置相关代码

打开main.c,找到main函数
请添加图片描述
替换while函数中的代码

  while (1)
  {

		GPIOB->ODR &= ~(1<<5); //操作PB5,设置为高电平
		GPIOB->ODR |= 1<<6;	  //操作PB6,设置为低电平
		GPIOB->ODR |= 1<<7;	  //操作PB7,设置为低电平
		HAL_Delay(500);//延时500毫秒
	  
		GPIOB->ODR |= 1<<5;   //操作PB5,设置为低电平
		GPIOB->ODR &= ~(1<<6); //操作PB6,设置为高电平
		GPIOB->ODR |= 1<<7;	  //操作PB7,设置为低电平
		HAL_Delay(500);	//延时500毫秒
		
		GPIOB->ODR |= 1<<5;   //操作PF5,设置为低电平
		GPIOB->ODR |= 1<<6;	  //操作PF6,设置为低电平
		GPIOB->ODR &= ~(1<<7); //操作PF7,设置为高电平
		HAL_Delay(500);	//延时500毫秒

  }

点击编译
请添加图片描述
编译成功,不报错
请添加图片描述

3、进行程序烧录

在进行程序烧录之前要先对硬件进行连接,按下图所示连接usb转串口工具
请添加图片描述
打开设备管理器,看见如下设备即说明连接成功

如果查看时发现设备处出现黄色感叹号,即说明未安装相关驱动
驱动链接:https://pan.baidu.com/s/1-2t09WeSUvkCXII_6SBZbw
提取码:3690

请添加图片描述
在烧录前要将ROOT0置1,ROOT1置0
在这里插入图片描述

请添加图片描述

打开串口烧录工具后点击搜索串口,若程序不响应,则需要手动设置端口,只要选择刚才在设备管理器看见的端口即可
请添加图片描述
按下图配置,点击读取器件信息,搜索成功即说明端口与硬件成功连接,就可以选择keil中生成的hex文件进行烧录了
请添加图片描述
出现以下结果说明程序成功烧录
请添加图片描述
接线后程序即可运行,以下就是运行效果

(三)使用HAL库方式完成流水灯

1、使用STM32CubeMx生成相关代码

方法与上面相似,只是在这里选择了三个新的输出引脚,这里选择了PA4、PA5、PA6请添加图片描述

2、使用keil设置相关代码

方法也与上面相似,只是在这里将while函数中的代码替换成了HAL库提供的函数

由于使用HAL库进行开发,它提供了一些相关函数进行使用。(此处只说明使用的函数)
①延时函数(HAL_Delay)
函数原型: void HAL_Delay (__IO uint32_t Delay)
参数说明:Delay表示所要延时的时间大小,单位是毫秒
②写管脚函数(HAL_GPIO_WritePin)
函数原型:void HAL_GPIO_WritePin (GPIO_TypeDef * GPIOx, uint16_t
GPIO_Pin, GPIO_PinState PinState)
参数说明:
GPIOx: 管脚组(x的取值为A~G)
GPIO_Pin: 管脚编号(x的取值为0~15)
PinState: 管脚的状态(取值为GPIO_BIT_RESET表示0, GPIO_BIT_SET表示1)

所用代码如下

  while (1)
  {

	  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET);
	  HAL_Delay(500);	//延时500毫秒
	  
	  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET);
	  HAL_Delay(500);	//延时500毫秒
	  
	  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET);
	  HAL_Delay(500);	//延时500毫秒
  }

成功编译
请添加图片描述

3、进行程序烧录

烧录过程也相似,将烧录文件选择新生成的hex文件即可
请添加图片描述
接线后程序即可运行,以下就是运行效果

(四)实现STM32的USART串口通讯程序

1、使用STM32CubeMx生成相关代码

先选择芯片,然后这设置RCC->High Speed Clock->Crystal请添加图片描述
UEART1->Mode->asynchronous
请添加图片描述
点击configuration->USART1
请添加图片描述
设置波特率为115200,1位停止位,无校验位;
请添加图片描述
点击生成相关代码
请添加图片描述

2、使用keil设置相关代码

找到stm32f4xx_hal.c
请添加图片描述
添加stdio库,并申明串口
请添加图片描述
还是在stm32f4xx_hal.c中,重写fget和fput函数

/**
  * 函数功能: 重定向c库函数printf到DEBUG_USARTx
  */
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}
 
/**
  * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
  */
int fgetc(FILE *f)
{
  uint8_t ch = 0;
  HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
  return ch;
}

请添加图片描述
在main.c中修改while函数,点击编译,成功编译

	while (1)
	{
		printf(" Hello Windows \r\n");
		HAL_Delay(1000);
	}

请添加图片描述

3、进行程序烧录

烧录过程也相似,将烧录文件选择新生成的hex文件即可
请添加图片描述
打开野火串口调试助手,设置好参数后点击打开串口,成功执行请添加图片描述

(五)利用KEIL的软件仿真的逻辑分析仪功能观察GPIO的波形

打开任意工程点击魔法棒按如下设置
请添加图片描述
点击debug
请添加图片描述
选择逻辑分析仪
请添加图片描述
点击setup
请添加图片描述
设置要观察的引脚
请添加图片描述
运行程序,结果如下
请添加图片描述
请添加图片描述
请添加图片描述

总结

stm32CubeMx配合keil可以很方便的实现嵌入式编程。

参考

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐