赞
踩
本篇文章主要介绍如何安装STM32CubeMX及STM32CubeMX配合keil完成
1、做一个LED流水灯,用GPIO端口完成3只LED红绿灯的周期闪烁。
2、完成一个STM32的USART串口通讯程序,要求:
1)设置波特率为115200,1位停止位,无校验位;
2)STM32系统给上位机(win10)连续发送“hello windows!”。win10采用“串口助手”工具接收。
目录
安装CubeMx一共需要三个
具体的安装流程可以看
【STM32】STM32 CubeMx使用教程一--安装教程_Z小旋-CSDN博客_stm32cubemx安装
非常简单 只有几步 也没什么要设置的 我就不多赘述了
由于 STM32CubeMX 软件是基于 JAVA 环境运行的,所以需要安装 JRE (Java Runtime Environment)才能使用,
官网: https://www.java.com/en/download/manual.jsp
首先肯定很多人会问什么是HAL固件库?
STM32 HAL固件库是Hardware Abstraction Layer的缩写,中文名称是:硬件抽象层。HAL库是ST公司为STM32的MCU最新推出的抽象层嵌入式软件,为更方便的实现跨STM32产品的最大可移植性。HAL库的推出,可以说ST也慢慢的抛弃了原来的标准固件库,这也使得很多老用户不满。但是HAL库推出的同时,也加入了很多第三方的中间件,有RTOS,USB,TCP / IP和图形等等
和标准库对比起来,STM32的HAL库更加的抽象,ST最终的目的是要实现在STM32系列MCU之间无缝移植,甚至在其他MCU也能实现快速移植。
并且从16年开始,ST公司就逐渐停止了对标准固件库的更新,转而倾向于HAL固件库和 Low-layer底层库的更新,停止标准库更新,也就表示了以后使用STM32CubeMX配置HAL/LL库是主流配置环境;
打开安装好的 STM32CubeMX 软件 点上面的Help -> Manage embedded software packages
会跳出来一个选择型号界面 勾选上你要安装的HAL库, 点击“Install Now” 直到安装成功
在主界面选择File
–>New Project
或者直接点击ACCEE TO MCU SELECTOR
然后选择芯片 这里我选择的是STM32F103RC 形式我选择的是LQFP64
左侧1:MCU外设资源选择
在这里可以选择MCU的各种资源和外设
提供两种方式
将MCU的各种外设和资源分类,供用户选择使用
MCU的外设资源按A-Z 排序,供用户选择使用
右侧2为预览界面
这里分为引脚预览和系统预览
引脚预览可以查看引脚配置了什么功能,和各个引脚的位置;
任意点击一个引脚即可设置该引脚的各种功能。
这种颜色表示不可配置引脚 电源专用引脚以黄色突出显示。其配置不能更改
这种颜色表示你配置了一个I/O口的功能,但是没有初始化相对应的外设功能 引脚处于no mode 状态
绿色表示配置成功
配置RCC使用外部时钟源,选择 HSE(外部高速时钟) 为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器)
选择 Clock Configuration,配置系统时钟 SYSCLK 为 72MHz 然后回车
点击ok
修改 HCLK 的值为 72 后,输入回车,软件会自动修改所有配置
只需把目标LED对应引脚设置为GPIO_Output即可,按照我在之前篇博客的管脚分配,这里我仍然去选择相同管脚,即PB6
PC6
PD2
。
设置完MCU后,可以进行对工程文件的配置了。
在Project处,这里就是工程的各种配置,我们只用到有限几个,其他的默认即可 。
注意 存储目录不可以有中文
然后点击Code Generator
,进行进一步配置。
点击GENERATE CODE
创建工程,等待一段时间后,成功打开了工程文件.
打开文件我们会发现main函数里只有一些初始化,并没有主要的程序,while(1)里面是空的,这时候就需要我们来添加代码
在main.c文件的main函数下的while循环中,添加下面几行代码
- HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);
- HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6,GPIO_PIN_SET);
- HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
- HAL_Delay(1000);
-
- HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);
- HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6,GPIO_PIN_RESET);
- HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
- HAL_Delay(1000);
-
- HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);
- HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6,GPIO_PIN_SET);
- HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
延时函数(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)
PS:所有自己编写的代码请放在/* USER CODE BEGIN XXX / / USER CODE END XXX */之间;
这样我们修改工程的时候你自己写的代码就不会被删除。
编译发现没有报错,那么进行烧录啦。
具体连线与过程可以看我前面写的流水灯博客
STM32F103寄存器方式点亮LED流水灯与GPIO简单讲解_我想恰鱼的博客-CSDN博客
结果展示:
本人是的板子是正点原子的ministm32开发板 功能强大 完成USART串口通讯不需要额外搭载CH340 只需要自带的线一方接板子另一方连接电脑即可
ALIENTEK MiniSTM32 开发板所使用 的 STM32F103RCT6 最多可提供 5 路串口,有分数波特率发生器、支持同步单线通信和半双工 单线通讯、支持 LIN、支持调制解调器操作、智能卡协议和 IrDA SIR ENDEC 规范、具有 DMA 等。
MiniSTM32 开发板板载了 1 个 USB 串口和 1 个 RS232 串口。
这里我就主要介绍下重要的代码 具体工程文件我会放在本文末 需要的可以下载
test.c
- #include "sys.h"
- #include "usart.h"
- #include "delay.h"
- int main(void)
- {
- u16 t; u16 len;
- Stm32_Clock_Init(9); //
- delay_init(72);
- uart_init(72,115200); //´®¿Ú³õʼ»¯ÉèÖÃΪ115200
- while(1)
- {
-
- len=USART_RX_STA&0x3FFF;
- printf("\r\n Hello Windows! \r\n\r\n");
- for(t=0;t<len;t++)
- {
- USART1->DR=USART_RX_BUF[t];
- while((USART1->SR&0X40)==0);//??????
- }
-
- USART_RX_STA=0;
- delay_ms(500);
- }
- }
while((USART1->SR&0X40)==0);//等待发送结束,在写了一个字节在 USART1->DR
之后,要检测这个数据是否已经被发送完成了,通过检测USART1->SR
的第 6 位,是否为 1 来决定是否可以开始第二个字节的发送。
在SYSTEM组下双击usart.c,其中的uart_init函数,代码如下
- //初始化 IO 串口 1
- //pclk2:PCLK2 时钟频率(Mhz)
- //bound:波特率
- void uart_init(u32 pclk2,u32 bound)
- {
- float temp;
- u16 mantissa;
- u16 fraction;
- temp=(float)(pclk2*1000000)/(bound*16);//得到 USARTDIV
- mantissa=temp; //得到整数部分
- fraction=(temp-mantissa)*16; //得到小数部分
- mantissa<<=4;
- mantissa+=fraction;
- RCC->APB2ENR|=1<<2; //使能 PORTA 口时钟
- RCC->APB2ENR|=1<<14; //使能串口时钟
- GPIOA->CRH&=0XFFFFF00F; //IO 状态设置
- GPIOA->CRH|=0X000008B0; //IO 状态设置
- RCC->APB2RSTR|=1<<14; //复位串口 1
- RCC->APB2RSTR&=~(1<<14);//停止复位
- //波特率设置
- USART1->BRR=mantissa; // 波特率设置
- USART1->CR1|=0X200C; //1 位停止,无校验位.
- #if EN_USART1_RX //如果使能了接收
- //使能接收中断
- USART1->CR1|=1<<8; //PE 中断使能
- USART1->CR1|=1<<5; //接收缓冲区非空中断使能
- MY_NVIC_Init(3,3,USART1_IRQn,2);//组 2,最低优先级
- #endif
- }
从该代码可以看出,其初始化串口的过程,和我们前面介绍的一致。先计算得到USART1->BRR 的内容。然后开始初始化串口引脚,然之后设置波特率和奇偶校验等。
这里需要注意一点,因为我们使用到了串口的中断接收,必须在 usart.h 里面设置EN_USART1_RX 为 1(默认设置就是 1 的)。该函数才会配置中断使能,以及开启串口 1 的 NVIC中断。这里我们把串口 1 中断放在组 2,优先级设置为组 2 里面的最低。
编译成功后烧录
打开XCOM串口助手,选择串口,点击打开串口
,即可以接收到C8T6发送的数据Hello Windows!
链接:https://pan.baidu.com/s/1B5Wu6SMMHX4agFbuzA6GIg
提取码:z3tq
STM32实现LED闪烁——基于HAL库_Harriet的博客-CSDN博客_stm32实现led灯的闪烁
【STM32】STM32 CubeMx使用教程一--安装教程_Z小旋-CSDN博客_stm32cubemx安装
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。