1 使用STMCubeMX配置工程
该工程基本实现的基本功能如下:
- 使用外部晶振8MHz
- 使用ST-LINK作为程序下载调试工具
- 实现引脚的基本输出,控制LED
- 实现UART的基本功能,实现
printf
调试
1.1 配置工程Debug方式和SysTick
-
Debug选择Serial Wire,使用ST-LINK作为程序下载调试工具
-
选择Timebase的时钟来源,选择SysTick
1.2 时钟配置
1.2.1 时钟源的选择
- 高速时钟选择外部高速晶振8MHz
- 低速时钟选择外部低速晶振32.768KHz (如果板子没贴低速时钟或用不到可以不配置)
1.2.2 外设时钟配置
使用8MHz晶振典型配置如下
使用16MHz晶振典型配置如下
1.3 配置引脚为输入输出
1.3.1 配置引脚为输出驱动LED
- PB5作为LED0;PE5作为LED1
1.3.2 配置引脚为输入作为按键
- PE4作为KEY0
1.4 配置USART1作为printf
- USART1的TX为PA9;RX为PA10
- 选择异步通信,其他参数选择默认
1.5 工程管理配置
1.5.1 配置工程
- 修改工程名
- 选择工程保存位置
- 选择工程编译工具MDK-ARM,即Keil
- 修改堆和栈的大小
- 选择固件库,默认即可
1.5.2 配置代码
1.6 生成工程
其他参数没有更改可以保持默认
2 使用KEIL打开工程
2.1 检验工程是否有错
- 编译工程,0 错误,0 警告。
- 下载程序到开发板
- 工程基本完整,没有错误
2.2 添加功能相关代码
2.2.1 添加printf功能相关代码
检验printf功能之前需要添加必要的代码
- 在usart.c文件中适当的位置添加如下代码
/* USER CODE BEGIN 0 */
#include <stdio.h>
/* USER CODE END 0 */
/* USER CODE BEGIN 1 */
int fputc(int ch, FILE *f)
{
while ((USART1->SR & 0X40) == 0);
USART1->DR = (uint8_t) ch;
return ch;
}
/* USER CODE END 1 */
2.2.2 添加output和input相关代码
int main(void)
{
uint8_t flag = 0;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
printf("2021.05.14 \n");
while (1)
{
if(0 == HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin))
{
HAL_Delay(10); /*延时,单位:ms*/
if(0 == HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin))
{
if(0 == flag)
{
flag = 1;
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin); /*每次电平取反*/
}
}
}
else
{
flag = 0;
}
// HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET); /*给高电平*/
// HAL_Delay(200);
// HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET); /*给低电平*/
// HAL_Delay(200);
}
}
2.2.3 printf没有打印数据
勾选此处再编译烧录
2.3 工程测试
- 上电或复位可以串口打印出 2021.05.14
- 按键key0实现LED0亮灭
3 使用STM32CubeIDE直接打开工程
使用ST-LINK V2烧录程序
- 更新ST-LINK :Help—>ST-LINK更新
- 在检测到了ST-LINK后还是不能点击烧录程序,可以尝试关闭工程,然后再次打开
3.1 图形界面配置完工程后生成工程
3.2 重定向printf函数
-
在usart.c文件中写入如下函数
/* USER CODE BEGIN 1 */ #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif PUTCHAR_PROTOTYPE { while ((USART1->SR & 0X40) == 0); USART1->DR = (uint8_t) ch; return ch; }
-
在main.c文件中写入如下测试函数
/* USER CODE BEGIN 2 */ printf("2023.09.17 \n"); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ int value_int = 10; float val_float = 10.0; while (1) { printf("%d***%0.3f\r\n", value_int, val_float); val_float += 1.3365; value_int += 1; HAL_GPIO_TogglePin(led_GPIO_Port, led_Pin); HAL_Delay(300); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }
-
编译烧录
发现不能打印浮点数
3.3实重定向printf函数且能输出浮点数
- 鼠标右击工程 —>Properties
- 勾选如下,并在确认后再次编译
- 浮点数打印输出正常
- 注意勾选浮点数输出,编译后FLASH会明显增大了,在不需要浮点数输出或最后调试完成需要关闭
勾选浮点数输出
不勾选浮点数输出