嵌入式学习---STM32实现流水灯以及USART串口通信基于CUBEMX和KEIL
1.下载安装相关软件。
在stm32官网下载stm32cubemx安装包地址如下。
https://www.st.com/en/development-tools/stm32cubemx.html
选择windows的版本进行下载安装。
安装时候不能选择有中文的路径存在。(建议可以的话直接全部默认),一直直接点next直到安装完成。
2.在STM32CubeMX中创建一个项目。
1.打开软件。在File->New Project中创建一个新的项目。
2.选择自己的芯片型号,这里我是STM32F103C8
3.配置系统调试接口sys,选择Serial Wire
4.配置引脚功能在芯片上找到对应的引脚,点击它,选择对应的功能。这里先将PC13也就是板载的LED口设置为输出模式。
在这里可以看到这个口的设置情况。
GPIO output level:有low和high两种选择,一般选择low
GPIO mode:推挽输出和开漏输出两者模式,两者模式的区别在于推挽输出中1代表VCC,0表示GND;开漏输出中1代表高阻态,0代表GND。
GPIO Pull-up/Pull-down:输入需要上下拉,输出一般没有上下拉
Maxinum output speed:最大的输出速度,一般选择low就可以了。
5.再点击project manager界面进行项目的配置。设置项目名字,编译软件和相关的固件库版本。
之后直接点击右上角GENERATE CODE,生成好之后直接点击Open Projecet
3.通过C语言以及基于HAL函数库两种方式实现流水灯。
再keil中会显示如上界面让你选择设备,选择自己相应的设备型号即可。
这样便打开了这个项目。此时编译一下,设置好烧录相关的,直接将项目烧入板子中便会发现PC13那个小led会亮起来。
现在只需要再在代码中加入延时的函数,再多选择几个口接上led灯便可以实现流水灯了。
再次打开cubemx打开刚刚的项目,我是将里面的A7,B9,C15三个口设置为输出模式。
再次生成代码,再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)
#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.在编译调试的设置之中对下面参数如下设定。
2.选择逻辑分析仪。
3.在setup中设置需要观察的端口。
4.点击右上角后输入你所要观察的引脚。例如这里我要观察的是PB9,输入GPIOB_IDR.9回车即可。
5.要将输出的波形设置为bit便于观察。
6.再关掉这个窗口,点击run便可以再界面里看到信号的波形结果。
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.打开设备管理界面查看是否有端口
4、查看是否存在端口(注意:查看是否存在端口时,需要将USB转串口连接到电脑上)
5.再次通过stm32cubemx创建项目。
设置debug方式
设置USART模式为 Asynchronous,这里下方便是他的参数。
后面就是对项目的名字之类的设置像前面那样设置便可以了,生成代码。
6打开main.c 文件,在前面添加上头文件。stdio.h
在代码的这个位置重写fputc 函数,以至于可以使用printf从串口输出。
int fputc(int c, FILE *stream)
{
HAL_UART_Transmit(&huart1,(unsigned char *)&c,1,1000);
return 1;
}
再在主函数的循环之中写上
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!