嵌入式入门学习---STM32实现流水灯以及USART串口通信基于CUBEMX和KEIL


嵌入式学习---STM32实现流水灯以及USART串口通信基于CUBEMX和KEIL

1.下载安装相关软件。

在stm32官网下载stm32cubemx安装包地址如下。

https://www.st.com/en/development-tools/stm32cubemx.html

选择windows的版本进行下载安装。

安装时候不能选择有中文的路径存在。(建议可以的话直接全部默认),一直直接点next直到安装完成。

2.在STM32CubeMX中创建一个项目。

1.打开软件。在File->New Project中创建一个新的项目。

1634739073644

2.选择自己的芯片型号,这里我是STM32F103C8

1634739184919

3.配置系统调试接口sys,选择Serial Wire

1634739257873

4.配置引脚功能在芯片上找到对应的引脚,点击它,选择对应的功能。这里先将PC13也就是板载的LED口设置为输出模式。

1634739345964

在这里可以看到这个口的设置情况。

GPIO output level:有low和high两种选择,一般选择low
GPIO mode:推挽输出和开漏输出两者模式,两者模式的区别在于推挽输出中1代表VCC,0表示GND;开漏输出中1代表高阻态,0代表GND。
GPIO Pull-up/Pull-down:输入需要上下拉,输出一般没有上下拉
Maxinum output speed:最大的输出速度,一般选择low就可以了。

1634739375466

5.再点击project manager界面进行项目的配置。设置项目名字,编译软件和相关的固件库版本。

1634739593950

之后直接点击右上角GENERATE CODE,生成好之后直接点击Open Projecet

3.通过C语言以及基于HAL函数库两种方式实现流水灯。

1634739643971

1634739697681

再keil中会显示如上界面让你选择设备,选择自己相应的设备型号即可。

1634739750850

这样便打开了这个项目。此时编译一下,设置好烧录相关的,直接将项目烧入板子中便会发现PC13那个小led会亮起来。

1634740560046

现在只需要再在代码中加入延时的函数,再多选择几个口接上led灯便可以实现流水灯了。

再次打开cubemx打开刚刚的项目,我是将里面的A7,B9,C15三个口设置为输出模式。

1634740981274

再次生成代码,再KEIL中打开,keil他会让你reload这个项目即可在main文件中写程序代码。由于cubemx将时钟和端口输出方式之类已经配置好了,所以可以直接开始写代码了。

以下基于HAL库实现

void a()
{
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);
	    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);
}

这样一个函数便是PC15灯两,PB9和PA7灯灭的功能。再将另外两种状态赵这样写上。

再在while函数中实现流水的功能。

while (1)
  {
		//写循环执行的代码		
		a();
		HAL_Delay(1000);
		b();
		HAL_Delay(1000);
		c();
		HAL_Delay(1000);
  }

将程序烧录进板子,结果如下所示。

再是通过C语言实现**

通过C语言实现就是像我上一篇博客那样直接控制寄存器,只不过这次省去了配置时钟以及输出设置相关的东西。

通过STM32手册找到要控制的寄存器的地址,这里就是要将PA7设置为1,也就是将这个寄存器的第七位赋值为1(ps:相关内容可以去查看我的上一篇博客:https://www.cnblogs.com/lwtt/p/15426637.html)

1634742034109

#define	GPIOA_ORD	\*((unsigned volatile int\*)0x4001080C)*
GPIOA_ORD|=1<<7;			//设置初始灯为亮

以此类推增加相关的灯的数量以及自己通过函数设计下延时即可。

//在生成的项目中首先定义以下变量和函数
//--------------APB2使能时钟寄存器------------------------
#define RCC_AP2ENR	*((unsigned volatile int*)0x40021018)
	//----------------GPIOA配置寄存器 ------------------------
#define GPIOA_CRL	*((unsigned volatile int*)0x40010800)
#define	GPIOA_ORD	*((unsigned volatile int*)0x4001080C)
//----------------GPIOB配置寄存器 ------------------------
#define GPIOB_CRH	*((unsigned volatile int*)0x40010C04)
#define	GPIOB_ORD	*((unsigned volatile int*)0x40010C0C)
//----------------GPIOC配置寄存器 ------------------------
#define GPIOC_CRH	*((unsigned volatile int*)0x40011004)
#define	GPIOC_ORD	*((unsigned volatile int*)0x4001100C)
//-------------------简单的延时函数-----------------------
void  Delay_ms( volatile  unsigned  int  t)
{
     unsigned  int  i;
     while(t--)
         for (i=0;i<800;i++);
}
void A_LED_LIGHT(){
	GPIOA_ORD=0x0<<7;		//PA7低电平
	GPIOB_ORD=0x1<<9;		//PB9高电平
	GPIOC_ORD=0x1<<15;		//PC15高电平
}
void B_LED_LIGHT(){
	GPIOA_ORD=0x1<<7;		//PA7高电平
	GPIOB_ORD=0x0<<9;		//PB9低电平
	GPIOC_ORD=0x1<<15;		//PC15高电平
}
void C_LED_LIGHT(){
	GPIOA_ORD=0x1<<7;		//PA7高电平
	GPIOB_ORD=0x1<<9;		//PB9高电平
	GPIOC_ORD=0x0<<15;		//PC15低电平	
}
//------------------------在生成的代码的主函数中加入以下--------------------------

while(j)
{	
	A_LED_LIGHT();	
	Delay_ms(10000000);
	B_LED_LIGHT();
	Delay_ms(10000000);
	C_LED_LIGHT();
	Delay_ms(10000000);
}
----------------------------------------------------------------------------------

实验效果也如上面那个GIF所示。

4.通过Keil的软件仿真逻辑分析仪功能观察管脚的时序波形

1.在编译调试的设置之中对下面参数如下设定。

1634815003005

2.选择逻辑分析仪。

1634815106481

3.在setup中设置需要观察的端口。

1634815139629

4.点击右上角后输入你所要观察的引脚。例如这里我要观察的是PB9,输入GPIOB_IDR.9回车即可。

1634817640972

5.要将输出的波形设置为bit便于观察。

1634817728751

6.再关掉这个窗口,点击run便可以再界面里看到信号的波形结果。

1634817800159

5.完成一个STM32的USART串口通讯程序

1.USART简介

通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter)是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。有别于 USART 还有一个
UART(Universal Asynchronous Receiver and Transmitter),它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是 UART。
串行通信一般是以帧格式传输数据,即是一帧一帧的传输,每帧包含有起始信号、数
据信息、停止信息,可能还有校验信息。USART 就是对这些传输参数有具体规定,当然也
不是只有唯一一个参数值,很多参数值都可以自定义设置,只是增强它的兼容性。

2.安装CH34_Install_Windows_v3_4驱动。

3.打开设备管理界面查看是否有端口

1634818834523

4、查看是否存在端口(注意:查看是否存在端口时,需要将USB转串口连接到电脑上)

1634819553229

5.再次通过stm32cubemx创建项目。

设置debug方式

1634819940661

设置USART模式为 Asynchronous,这里下方便是他的参数。

1634820035426

后面就是对项目的名字之类的设置像前面那样设置便可以了,生成代码。

1634820127552

6打开main.c 文件,在前面添加上头文件。stdio.h

1634820210548

在代码的这个位置重写fputc 函数,以至于可以使用printf从串口输出。

int fputc(int c, FILE *stream)
{
	HAL_UART_Transmit(&huart1,(unsigned char *)&c,1,1000);
	return 1;
}

1634820585747

再在主函数的循环之中写上

  while (1)
  {
    /* USER CODE END WHILE */
			printf("hello world\n");
		  HAL_Delay(1000);
    /* USER CODE BEGIN 3 */
  }

再连接电脑将程序烧录进去。

7.操作连线选取接口为GND、RXD、TXD、3V3,STM32核心板选取端口G、3.3、A9、A10,对应连接.

8.下载安装串口查看工具,我这里用的是SSCOM可自行选择别的软件,结果如下所示,可以看到它在向串口中输出hello world!

1634823811718


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM